すべての引数評価される。注文は定義されていません(標準に従って)。しかし、私が知っているC/C++のすべての実装では、関数の引数をから右へまで評価しています。 EDIT:CLangは例外です(下記のコメントを参照)。
右から左への評価の順序は非常に古かったと思います(最初のCコンパイラ以降)。確かにC++が考案される前のC++の実装は、C++の初期実装がC言語に単純に変換されているため、同じ評価順序を維持しています。
関数の引数を右から左に評価する技術的な理由があります。スタックアーキテクチャでは、引数は通常スタックにプッシュされます。 C/C++では、実際に指定されたよりも多くの引数を持つ関数を呼び出すことができます。余分な引数は無視されます。引数が左から右に評価され、左から右にプッシュされた場合、スタックポインタの直下のスタックスロットは最後の引数を保持し、関数が特定の引数のオフセットで得る方法はありません(引数の実際の数は呼び出し元によって異なります)。
右から左へのプッシュ順では、スタックポインタの直下のスタックスロットは常に第1引数を保持し、次のスロットは第2引数などを保持します。引数オフセットは常に関数呼び出された場所とは別に、別の場所でライブラリに書き込まれ、コンパイルされてもよい)。
右から左へのプッシュオーダーでは右から左への評価順序は必須ではありませんが、初期のコンパイラではメモリが不足しています。右から左への評価順序では、同じスタックをインプレースで使用することができます(基本的には、引数を評価した後、式やファンクションコールとなる可能性があります)。戻り値はすでにスタック)。左から右の評価では、引数の値を別々に格納し、逆の順序でスタックにプッシュバックする必要があります。
別のコンパイラで自分で試してみてください。 – strager
C++のサブセットのインタプリタを実装しているときに同じ質問をしました。 Phew。 –
'foo(i ++、i ++)'は未定義のビヘイビアを呼び出すことに注意してください。なぜなら、 'i'は1つ以上のシーケンスポイントを介することなく1つずつインクリメントされるからです。 – Nawaz