if (0)
将谓词评估0
为二进制值。C 中的二进制值使用整数,其中零表示假,非零表示真。因此,0 将始终评估为假。
对于二元运算符,右关联或左关联决定了处理其他同等重要的运算符的顺序。考虑减法运算符:
37 - 10 - 4
两者-
的优先级相同,那么我们应该首先评估哪个?好吧,-
是左关联的,所以我们这样做:
(37 - 10) - 4 ==> (27) - 4 ==> 23
如果-
运算符是右结合的,我们会这样做:
37 - (10 - 4) ==> 37 - 6 ==> 31
等式 ( =
) 是右结合的,因为我们可以将等式链接在一起。所以,如果我们看到
// a and b are initialized to 0
a = b = 45
两者=
的优先级相同,因此我们从右到左评估并执行以下操作:
a = (b = 45) // b receives 45
a = 45 // a receives 45
如果我们从左到右,我们会得到一个意想不到的结果:
(a = b) = 45 // a receives 0
b = 45 // b receives 45
然而,对于一元运算符,排序仅在多个一元运算符影响相同值时才有意义。例如,让我们这样做:
char x = 0xFF
bool y = !~x
这些一元运算符是右结合的,所以我们这样做:
!(~0xFF) ==> !(0x0) ==> true
在您展示的示例中,否定运算符影响A
并且E
没有“同等优先级”,因为它们没有相同的操作数。因此,关联性不适用。