C语言常被搞错的运算符优先级
C语言的运算符有优先级和结合性两个属性,而且相同的符号存在复用的情况,所以很容易造成错误。这里有个建议,多给表达式加上括号,可以提高代码的可读性和减少错误的发生。
优先级问题 | 表达式 | 人们可能误以为的结果 | 实际结果 |
---|---|---|---|
.的优先级高于* ->操作符用于消除这个问题 |
*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) |
逗号运算符在所有运算符中优先级最低 | i = 1, 2 | i = (1, 2) | (i = 1), 2 |
下面是从《The C Programming Language》摘录的关于运算符优先级和结合性的表格,放在这里方便查阅:
参考:
1. 《The C Programming Language中文版(第2版.新版)》
2. 《C专家编程》