C における演算子の結合性について話すと、同じ優先順位を持つ演算子間で結合性に違いがあるのはなぜだろうと思っていました。たとえば、後置インクリメントと後置デクリメントは結合性を残しています。一方、プレフィックスのインクリメントとプレフィックスのデクリメントには右結合性があります。すべて同じ優先順位の演算子に対して左または右の結合性を持つのは簡単ではありませんか?
その背後に何か理由はありますか?
C における演算子の結合性について話すと、同じ優先順位を持つ演算子間で結合性に違いがあるのはなぜだろうと思っていました。たとえば、後置インクリメントと後置デクリメントは結合性を残しています。一方、プレフィックスのインクリメントとプレフィックスのデクリメントには右結合性があります。すべて同じ優先順位の演算子に対して左または右の結合性を持つのは簡単ではありませんか?
その背後に何か理由はありますか?
すべて同じ優先順位演算子に対して左または右の結合性を持つのは簡単ではありませんか?
はい、Cの場合です。接頭辞と接尾辞の優先順位が同じであると想定しているかもしれませんが、これは間違っています。接尾辞は接頭辞よりも優先されます!
また、特定の演算子が特定の結合法則を持っている理由について考慮すべき別の奇妙なケースがあります。Wikiから、
たとえば、Cでは、割り当てa = bは、aをこの値に設定するという副作用を伴う値(つまり、bをaのタイプに変換)を返す式です。式の途中で割り当てを実行できます。(式の後にセミコロンを付けることで、式をステートメントにすることができます。つまり、a = bは式ですが、a = b;はステートメントです)。=演算子の右結合性により、a = b =cなどの式をa=(b = c)として解釈できるため、aとbの両方をcの値に設定できます。a = bは左辺値ではないため、代替(a = b)=cは意味がありません。
二項演算子は、右結合の代入演算子を除いて、すべて左結合です。
後置演算子は (K&R 2nd の例のように) 右結合であると言われることがありますが、これは単項演算子よりも優先順位が高いという考えを表現するためです。