第四章操作符和表达式
4.1操作符(运算符)
4.1.1算术操作符
+ - * / %
/的两个操作数都是整数时,执行整除运算,其他情况下执行浮点除法。
%的两个操作数必须都是整数,取余。
4.1.2移位操作符
<<左移操作符,不管逻辑移位还是算术移位都补0!
>>右移操作符,逻辑移位时补0,算术移位根据原先该值的符号位来补1或0
4.1.3位操作
&与 |或 ^异或 ~按位取反
Value&= ~(1<<number)(与清0)
Value|= 1<<number(或置1)
4.1.4赋值
赋值是表达式的一种,而不是某种类型的语句。所以,只要允许出现表达式的地方,都能进行赋值。表达式都具有一个值,赋值表达式的值就是左操作数的新值!
警告:
1.进行赋值运算时要注意操作数的变量类型:a= b + c;有可能因为类型不一样而发生截断!
2.
char ch;
while(( ch = getchar() ) != EOF)….
EOF需要的位数比字符型值提供的位数多,getchar()的返回值也是一个整形值,而不是字符值的原因!
在该程序中,getchar()把返回值首先存储于ch中将导致它被截短,然后再整形提升与EOF进行比较。
复合赋值符
+= -= *= /= %= <<= >>= &= ^= |=
优势:容易书写和维护
4.1.5单目操作符
! ++ - & sizeof
^ -- + * (类型)
!:逻辑取反
^:按位取反
sizeof:操作数可以是变量、数据类型、数组名、表达式,返回数以字节为基本单位。
注意:因为判断长度不需要对表达式求值,所以类似sizeof(a=b+1)没有向a赋值
++和--:分为前缀和后缀形式,要求操作数必须是一个“左值”。
前缀形式的++操作符出现在操作数的前面,操作数的值被增加,而表达式的值就是操作数增加后的值。
后缀形式的++操作符出现在操作数的后面,操作数的值仍被增加,但表达式的值是操作数增加前的值。
抽象地说,前缀和后缀形式的增值操作符都复制一份变量值的拷贝,用于赋值操作。
前缀操作符在拷贝之前,先增值。
后缀操作符在拷贝之后,在增值。
前缀和后缀操作符的结果不是被它们所修改的变量,而是变量的拷贝!
4.1.6关系操作符
> >= < <= != ==
结果都是一个整形值,不是布尔型。如果两端的操作数符合操作符指定的关系,表达式的结果即是1,不符合则是0。
4.1.7逻辑操作符
&& 和 ||
注意它们都有“短路求值”short-circuited evaluation
例:if ( x>=0 && x< MAX && array[x] == 0)//先检查数组的下表是否在合法范围之内。
4.1.8条件操作符
Expression1? Expression2 : Expressionx3;