1. 同一优先级的运算符的运算次序
同一优先级的运算符,运算次序由结合方向决定。即:! > 算数运算符 > 关系运算符 > && > || > 赋值运算符。
2. 容易出错的运算符优先级
优先级问题 | 表达式 | 经常误认为的结果 | 实际结果 |
. 的优先级高于 *, -> 操作符用于消除这个问题 | *p.f | p所指duix对象的字段 f (*p) . f | 对 p 取 f 偏移,作为指针,然后进行接触引用操作。*(p.f) |
[] 高于 * | int *ap[] | ap 是个指向 int 数组的指针 int (*ap)[] | ap是个元素为 int 指针的数组 int *(ap[]) |
函数 () 高于 * | int *fp() | fp 是个函数指针,所指函数返回 int int (*fp) () | fp 是个函数,返回 int * int *(fp()) |
== 和 != 高于位操作 | (val & mask != 0) | (val & mask) != 0 | val &(mask != 0) |
== 和 != 高于fuzh赋值符 | c = getchar() != EOF | (c = getchar() != EOF) | c = (getchar() != EOF) |
算数运算符高于移位运算符 | msb << 4 + lsb | (msb << 4) + lsb | msb << (4 + msb) |
逗号运算符在所有运算符中优先级最低 | I = 1,2 | i = (1,2) | (i = 1),2 |
3. 条件运算符的使用
条件运算符为?和:,它是一个三目运算符。一般形式为:
表达式1?表达式2:表达式3
求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3作为条件表达式的值。
4. 条件表达式的注意点
1)条件运算符的yuns运算优先级低于关系运算符和算数运算符,但高于赋值符;
2)条件运算符 "?" 和 ":" 是一对运算符,不能分开单独使用;
3)条件运算符的结合方向是自右至左。
5. ++i 和 i++ 的区分与使用
简单来说:
++i :先自加,再运算;
i++ :先运算,再自加。
具体的说:
当 ++ 作为后缀时,遇到 :;函数括号 这三个结束标志时再自加。
例:(i++)+(i++)+(i++)+(i++) = 8
没有遇到结束符,i 不会自加
2+2+2+2=8
(++i)+(i++)+(++i)+(i++) = 16
3+3+4+4=16
6. 异或运算怎样交换两个变量的值
a=1;b=2;
进行操作:a=a^b;
b=a^b;
a=a^b;
运行之后,a=2;b=1;
7. 逻辑运算符的使用
int i=0;int j=0;
if((++1>0)11 (++j>0))
//打印出主和j的值。
结果: i=1; j=0。
逻辑运算符 || 两边的条件只要有一个为真,其结果就为真;只要有一个结果为假,其结果就为假。"if((++i >0) || (++j > 0))"语句中,先计算(++i>0), 发现其结果为真,后面的 (++j > 0) 便不再计算。同样&&运算符也要注意这种情况。
8. 按位与运算及应用
按位与运算符“&”是双目运算符。其功能是参与运算的两个数字对应的二进制位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。
例:9&5 可写为算式:
00001001 (9的二进制补码) & 00000101 (5的二进制补码)
00000001 (1的进制补码)
按位与运算通常用来对某些位清 0 或保留某些位。例如,把 a 的高 8 位清 0,保留低 8 位,可作 a & 255 运算(255 的二进制数为0000000011111111)
应用:
1)清 0 特定位 (mask 中特定位置 0,其他位为1,s = s&mask)。
2)取某数中指定位 (mask 中特定位置1,其他位为0,s = s&mask)。
9. 按位异或运算及应用
按位异或运算符 "^" 是双目运算符,其功能是参与运算的两个数字对应的二进制位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。
例:9^5可写成算式:
0001001^00000101 00001100 (十进制为12)
应用:
1)使特定位的值取反 (mask中特定位置1,其他位为0,s=s^mask)。
2)不引入第三变量,交换两个变量的值。
10. << , >> 注意点
右移运算符“>>”是双目运算符,其功能是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数。但注意:对于有符号数,在右移时,符号位将随同移动,当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。