if (0)
述語0
をバイナリ値として評価します。C のバイナリ値は整数を使用します。0 は false を意味し、0 以外は true を意味します。したがって、0 は常に false と評価されます。
二項演算子の場合、右結合または左結合であることによって、同等に重要な演算子が処理される順序が決まります。減算演算子を考えてみましょう:
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
したがって、結合性は適用されません。