序章
C/C++ のすべての教科書には、次のような演算子の優先順位と結合規則の表があります。
http://en.cppreference.com/w/cpp/language/operator_precedence
StackOverflow に関する質問の 1 つに、次のような質問がありました。
次の関数が実行される順序は次のとおりです。
f1() * f2() + f3();
f1() + f2() * f3();
前のチャートを参照すると、関数には左から右への結合性があると自信を持って答えたので、前のステートメントでは、両方の場合で次のように評価されます。
f1() -> f2() -> f3()
関数が評価されたら、次のように評価を終了します。
(a1 * a2) + a3
a1 + (a2 * a3)
驚いたことに、多くの人が私が完全に間違っていると言いました。それらが間違っていることを証明しようと決心した私は、ANSI C11 標準に目を向けることにしました。演算子の優先順位と結合性についてほとんど言及されていないことに、またしても驚かされました。
質問
- 関数は常に左から右に評価されるという私の信念が間違っているとすれば、関数の優先順位と結合性に関する表は、実際には何を意味するのでしょうか?
- ANSI でない場合、演算子の優先順位と結合性を定義するのは誰ですか? 定義を行うのが ANSI である場合、演算子の優先順位と結合規則についてほとんど言及されていないのはなぜですか? 演算子の優先順位と結合性は、ANSI C 標準から推測されますか、それとも数学で定義されていますか?