1.算术表达式
1>概念
算术表达式是用运算符号将常量、变量以及数学函数连接起来的式子。
2>算术运算符
又分双目运算符和单目运算符两种。
每个运算符都要处理两个操作数(即运算数),操作数可以是常量、变量或者其他算数表达式,操作数分别位于运算符的左右两边,这里使用的是双目运算符。单目运算符分增量运算符和减量运算符,其只需要一个操作数,它可以位于运算符的任意一侧,但是表达的含义不同。其算术运算符如下表1.1:
表1.1 算术运算符
注:(1)两个整数类型的数据做除法运算时,结果只保留整数部分。如,2/3=0。
(2)只有整数类型才能进行取余运算,其结果是两数整除后的余数。如,9%2=2。
(3)自增和自减运算符只适用于变量,且变量可以位于运算符的任意一侧,但各有不同的效果。例如,
int a1 = 2,a2 = 2; int b = (++a1)*2; //等价于a1 = a1 + 1; b = a1 * 2; int c = (a2++)*2; //等价于c = a2 * 2;a2 = a2 + 1;其结果为b = 6,c = 4。原因是++a1表示在使用变量a1之前,a1+1,然后使用新值进行运算,即先加1在使用;而a2++表示先试用a2的原值,待使用完之后在进行a2+1,即先使用再加1。但是,这三个语句执行完后,a1和a2的值都为3。
3>算术运算符的优先级
其优先级,是指当一个表达式中出现不同的算术运算符时,执行运算的优先次序。如表1.2列出了算术运算符的优先级。
表1.2算术运算符的优先级
在书写表达式时,应注意:
(1)写表达式时,若记不清其优先顺序可以通过括号改变优先级的次序。
(2)在书写表达式时,若表达式过长,可以分为几个表达式来写。
(3)在一个表达式中,最好不要连续使用两个表达式,如a+++b。这种会让人混淆应该是(a++)+b,还是a+(++b)。这种情况可以使用括号进行分组或者用空格符(是空格符‘ ’,而不是空隔符‘\0’)。
2.赋值表达式
1>强制类型转换
在学习赋值表达式前,先学习以下,什么是强制类型转换。
定义:强制类型转换是指当一个表达式中出现的各种变量或者常量的数据类型不同时,需要进行的数据类型转换(casting conversation)。无论在C语言中还是java语言中数据类型的转换都分为隐式类型转换和显示类型转换这两种形式。
1)隐式类型转换
对于由双目运算中的算术运算符组成的表达式,一般要求运算符两边的操作数类型一致,如果不一致,系统会自动转换为较高的类型(即取值范围较大)。隐式类型转换遵循的是精度不降低的标准,即短型向长型转换,低精度向高精度转换。其规则如下:
2)强制类型转换
表达形式为(data_type)expressioon;
例如,
int a=4,b=0; double c=3.14; s = a + (int)c;可知,c的类型为double,然而s是int类型,将(int)放在c前面就是将c 的类型强制转换成int类型,先将c中的数据,截取小数部分,让整数部分与a 进行加法运算,故,c=3,最后将7赋值给s。在整个转换过程中,并没有改变c的类型以及取值,可见显示类型的转换是暂时的。
注:强制类型转换有副作用,避免其的方法如下:
(1)避免两个整数进行相除,整数相除会导致相除结果的小数部分丢失。
(2)在进行强制类型转换的过程中如想实现小数的四舍五入,先给被转换的变量+0.5,然后再实施强制类型转换,如(int)(x+0.5)。
2>赋值表达式
由赋值运算符组成的表达式称为赋值表达式。
1)赋值运算符
“=”——赋值运算符的作用是将赋值运算符右边的数据或者表达式的值赋给运算符左边的变量。注:赋值号左边必须是变量。
例如,double s = 6.5 + 33;//是将表达式6.5+33赋值给变量s.
2)赋值中的类型转换
在赋值表达式中,如果两侧的数据类型不一致,但赋值符左边的数据类型较高,系统会自动进行隐式类型转换;若赋值运算符左边的变量的数据类型低于右边表达式的类型,就必须进行显示类型转换,否则编译时会报错。
3)复合赋值运算符
也就是在运算符“=”前面加上其他的运算符构成复合赋值运算符。如表1.3:
表1.3 C语言中的复合赋值运算符
| 复合赋值运算符 | 举例 | 等效于 |
| += | x+=y | x=x+y |
| -= | x-=y | x=x-y |
| *= | x*=y | x=x*y |
| /= | x/=y | x=x/y |
| %= | x%=y | x=x%y |
3.关系表达式
利用关系运算符连接起来的式子称为关系表达式。也就是我们所说的比较运算,用于对两个表达式进行比较,判断比较的结果是否满足给定的条件。C语言中提供了6个关系运算符如表1.4:
表1.4 关系运算符
4.逻辑运算符
C语言中提供了3中逻辑运算符,如表1.5:
表1.5 逻辑运算符
| 运算符0 | 含义 | 实例 |
| ! | 非 | !(a>=5),表示a不大于等于5,即小于5 |
| && | 与 | x>=0 && x<=5,表示0≤x≤5 |
| || | 或 | x>=5 || x<=0,表示x≥5或者x≤0 |
逻辑非运算符“!”是一个一元运算符,紧跟其后的表达式的值为0时,它的运算结果为1,否则运算结果为0;
逻辑与运算符“&&”是一个二元运算符,它两边表达式的值均为1时,整个逻辑运算的结果为1,有一个为0时,则整个运算结果为0;(即有0则0,全1才为1)
逻辑或运算符“||”是一个二元运算符,它两边表达式的值均为0时,整个逻辑运算结果为0,有一个1,整个逻辑运算结果为1。(即有1为1,全0才为0)
5.各类运算符的优先级关系
从上图可以看出,括号“()”运算的优先级别最高,赋值运算符的优先级别最低。表中上面未提及的指针运算符“*”,在后面将指针的时候会细讲它的用法等,以及取地址运算符“&”都涉及指针那块知识;sizeof()用于计算数据类型或对象在内存空间中所占用的字节数。表中的下表运算符“[]”,用于访问数组元素或指针所指向的内存位置。成员运算符“->”用于通过指针访问结构体或联合体的成员,“.”用于访问结构体或联合体变量的成员,其用法将在后面学习相关知识时细讲。