全部博文(12)
分类: C/C++
2008-03-20 07:37:14
记录这篇blog,原因只有一个: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 |
所以有一个很好的专家级建议:
乘法和除法先于加法和加法;在涉及其他的操作符时一律加上括号。