优先级问题 | 表达式 | 人们可能误以为的结果 | 实际结果 |
---|---|---|---|
.的优先级高于*。 ->操作符用于消除这个问题 | *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 |
这些运算符中的大部分,如果坐下来好好想下,就会变得明了。尽管有些涉及逗号的情况有时会让程序员歇斯底里。例如,当下面代码执行时:
i= 1, 2;
i 的最终结果将是什么? 对,我们知道逗号运算符的值就是最右边操作数的值。但在这里,赋值符的优先级更高,所以实际情况应该是:
(i = 1),2; /* i的值为1 */
i 赋值为1,接着执行常量2的运算,计算结果丢弃。最终,i 的结果是1而不是2。
本文引自《C专家编程》,在此仅作笔记记录。