C:容易误解的运算符优先级解读
最近重读C专家编程,记录一些重点,做为学习笔记。
在C程序中,以下操作符的优先级不是很好区分(如果你不使用括号显示指明的话),列举如下:
优先级问题 | 表达式 | 可能误认为的结果 | 实际结果 |
.的优先级高于* ->操作符用于消除这一问题 |
*p.f | p所指对象的字段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) |
==和!=高于赋值符 | c = getchar() != EOF | (c = getchar()) != EOF | c = (getchar() != EOF) |
算术运算高于移位运算符 | msb << 4 + lsb | (msb << 4) + lsb | msb << (4 + lsb) |
逗号运算符在所有运算符中优先级最低 | i = 1, 2 | i = (1, 2) | (i = 1), 2 |
不积跬步,无以至千里;不积小流,无以成江海。