学习笔记---C语言运算符规则及数据类型的自动/强制转化规则

学习了C语言的运算符以及数据类型转化规则之后,感到这是一个需要长久记忆理解的东西,所以写一篇笔记。用于巩固记忆并方便查阅。



总运算符表与运算符的规则(按优先级排列):

C语言运算符一览
优先级 运算符 功能 结合方式
1 ( )    [ ]    ->    . 括号,数组,两种结构的成员访问 由左向右
2 !    ~    ++    --    +    -    *    &    (类型)    sizeof 否定,按位否定,增量,减量,正负号,间接,取地址,类型转换,求大小 由右向左
3 *    /    % 乘,除,取模 由左向右
4 +    - 加,减 由左向右
5 <<    >> 左移,右移 由左向右
6 <    <=    >=    > 小于,小于等于,大于等于,大于 由左向右
7 ==    != 等于,不等于 由左向右
8 & 按位与 由左向右
9 ^ 按位异或 由左向右
10 | 按位或 由左向右
11 && 逻辑与 由左向右
13 ?= 条件 由右向左
14 =    +=    -=    *=    /=    &=    ^=    |=    <<=    >>= 各种赋值 由右向左
15 , 逗号(顺序) 由左向右
注意点:

算术运算符:

1.      /    除法: 当参与运算的是两个整数(long , unsigned long , int , unsigned int , short , unsigned short)时,除法遵循“向零取整”原则(事实上,所有将带小数的数据转换成整数的运算,都遵循这个原则)。

以下是示例: 

代码:

#include 
#include 
/*
这个程序用来验证除法运算的“向零取整”规则
*/
int main()
{
    //定义两个int型数字:iNum1,iNum2 以及用于存放运算结果的iAns;
    int iNum1=5,iNum2=3,iAns;
    //使iAns获得iNum1/iNum2的结果;
    iAns=iNum1/iNum2;
    //输出iAns;
    printf("第一次的结果是:%d\n",iAns);


    //改变iNum1和iNum2的值,再次进行运算;
    iNum1=-5;
    iNum2=3;
    iAns=iNum1/iNum2;
    //再次输出iAns
    printf("第二次的结果是:%d",iAns);
    return 0;
}

运算结果:

学习笔记---C语言运算符规则及数据类型的自动/强制转化规则_第1张图片

如以上代码所示,因为iAns为int型数据,所以必须为整数,当5/3的结果带小数时,自动将结果后的小数去掉,使结果向零靠拢。当-5/3的结果是带小数的负数时,同样去掉小数,使结果向零靠拢。注意!基本规则为“向零取整”即:1.988和1.001转换为整数的结果都一样,是1,而所有0.xxx的数值转换为整数的结果都为零!


2.    %    取模运算:取模运算要求运算符两侧的数都是整数!如果使用诸如:2.34%5的算式,程序就会报错。


基本数据类型的自动转换与强制转换:


自动转换:


当涉及诸如:

double num=3;

printf("num=%f",num);


结果是:num=3.000; 而非num=3;

这是因为,在将3赋值给num的过程中。整型的数值自动被转换成了浮点型。

这便是基本数据类型间的自动转换。

假如是像:2L+32761;或者:10+3.25;再或者:10+3.25f这样的算式,他们将按照以下的规律进行运算:

学习笔记---C语言运算符规则及数据类型的自动/强制转化规则_第2张图片

如图所示:当一个类型的数据要转换成另一个类型的数据时,它将总是顺着指针的方向进行转换

比如,当一个int型的数据和long型数据相加。结果的数据类型就是long型的。而如果是一个int型的数据和float型的数据相加,结果的数据就是double型的。

每当在算式中对不同数据类型的数据进行运算时。数据间就会先将自己顺着上图的规则转换成相同的数据类型,然后再进行运算。

强制转换:

有时候,会需要得到一个特定数据类型的数值。比如: 希望输出一个double 类型的数据。

int num=3;
printf("num=%f",(double)num);

这样,运行的结果:num=3.000

通过在num前加上一对小括号,并在小括号内填上自己想要的数据类型,就能将num强制转换成该类型。

注1:强制转换的运算优先级为2,在大部分情况下将被优先执行。

注2:虽然多数情况下,自动类型转换就能满足要求。但为了代码的明了,严谨。我们应该尽量把使用强制类型转换把类型的转变过程表示出来。以便于错误的排查和代码的易于理解。

注3:类型转换的过程中可能会出现数据的丢失,比如:double num1=3.25; int num2=(int)num1;结果num2的值就是3,这里原本在3后面的数值就在转换的过程中丢失了。

数学库函数:

数学库函数列表
函数名 函数表达式
三角函数 sin    cos    tan
反三角函数 asin    acos    atan
双曲函数 sinh    cosh    tanh
以e为底的指数函数 exp
自然对数函数 log
以10为底的对数函数 log10
平方根 sqrt
绝对值 fabs

使用示例:

double num1=9.0;
double num2=sqrt(num1);
printf("num2=%f",num2);

这段代码的输出为:num2=3.0

可见,平方根函数sqrt将9取平方根为3。

最后:使用数学库函数之前,必须在程序顶部声明调用,即:

#include 
#include 
#include   //这里要加上一条代码,作为对数学


完结。

你可能感兴趣的:(学习笔记,C语言,基础)