C和指针第五章操作符和表达式
- 位操作
把指定的位设置为1
value=value | 1<<bit_number;
把指定的位清零
value= value & ~(1<<bit_number);
- 操作符的优先级
两个相邻操作符的执行顺序由它们的优先级决定,如果优先级相同,它们的执行顺序由他们的结合性决定,除此之外,编译器可以自由决定使用任何顺序对表达式进行求值,只要他们不违背逗号,&&,||和?:操作符所施加的限制。如c + --c;将会产生歧义,操作符的优先级要求自减运算在加法运算之前进行,但没有办法得知做操作数是在右操作数之前还是之后进行求值。
赋值操作符的结合性(求值的顺序)是从右到左;
if(x+y+1>0)的结果取决于先计算x+y还是y+1,因为如果x+y的结果大于整型所能容纳的值,它就会产生溢出,在两种情况下溢出的地点不同。
int的精度比float高,float型值仅要求6位数字的精度
- 左值和右值
左值意味着一个位置,右值意味着一个值,b + 25 =a;b+25并不能做左值,因为它并未标志一个特定的位置,因此这条赋值语句是非法的。
左值是内在位置,右值是某位置内的值
- 移位操作
左移操作:值最左边的位被丢弃,右边多出来的位由0补齐。
右移操作分逻辑移位和算术移位,逻辑移位左边移入的位用0填充,算术移位左边移入的位由原先该值的符号位决定,符号位为1则移入的位均为1,符号位为0则移入的位均为0.
一个程序如果使用了有符号位的右移操作,那么程序是不可移植的。
sizeof(x):判断表达式的长度,判断表达式的 长度并不对表达式进行求值,例如sizeof(a=b+1)并没有向a赋任何值。
- 自增和自减
c=a++;
d=++b;
抽象的说,前缀和后缀形式的增值操作符都复制一份变量值的拷贝,用于周围表达式的值正是这份拷贝。前缀操作在进行复制之前增加变量的值,后缀操作在进行复制之后才增加变量的值。
如++a=10;这条语句是错误的,主要是++a是a值的拷贝,并不是变量本身,无法向一个值进行赋值。
- 下标引用
array[下标]
*(array+(下标))
下标引用实际上是以后面这种形式实现的。