すべての引数が評価されます。順序が定義されていません (標準による)。しかし、(私が知っている) C/C++ のすべての実装は、関数の引数をright から left に評価します。 編集: CLang は例外です (以下のコメントを参照)。
右から左への評価順序は非常に古いものだと思います (最初の C コンパイラ以来)。確かに、C++ が発明されるずっと前に、初期の C++ 実装は単純に C に変換されたため、C++ のほとんどの実装は同じ評価順序を維持していました。
関数の引数を右から左に評価する技術的な理由がいくつかあります。スタック アーキテクチャでは、通常、引数はスタックにプッシュされます。C/C++ では、実際に指定されているよりも多くの引数を指定して関数を呼び出すことができます。余分な引数は単純に無視されます。引数が左から右に評価され、左から右にプッシュされる場合、スタック ポインターのすぐ下のスタック スロットが最後の引数を保持し、関数が特定の引数のオフセットに到達する方法がありません。 (実際にプッシュされる引数の数は呼び出し元によって異なるため)。
右から左へのプッシュ順序では、スタック ポインターのすぐ下のスタック スロットは常に最初の引数を保持し、次のスロットは 2 番目の引数を保持します。呼び出された場所とは別に、別の場所でライブラリにコンパイルされます)。
現在、右から左へのプッシュ順序は右から左への評価順序を強制するものではありませんが、初期のコンパイラではメモリが不足しています。右から左への評価順序では、同じスタックをその場で使用できます (基本的に、引数を評価した後 (式または関数呼び出しである可能性があります!)、戻り値は既に正しい位置にあります)。スタック)。左から右への評価では、引数の値を個別に格納し、逆の順序でスタックにプッシュ バックする必要があります。