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+(下标))

下标引用实际上是以后面这种形式实现的。

原文地址:https://www.cnblogs.com/sanshuiyijing/p/3029671.html