cおよびc++の引数の評価順序が定義されていないことは既知の事実です。たとえばfoo(a(),b())
、上記の呼び出しでは、どの評価順序を選択するか、したがってどの関数を最初に実行するかを決定するのはコンパイラの実装次第です。最近、私の友人の1人が、なぜCまたはC++で評価の順序が指定されていないのかと尋ねました。グーグルで検索したところ、評価順序を指定するとコード生成が最適ではないことがわかりました。しかし、どうですか?引数の評価の定義された順序が最適ではないコードにつながるのはなぜですか?そして、私がJavaの引数評価順序を参照したとき。スペックで以下を見つけました。
15.7.4。引数リストは左から右に評価されます
メソッドまたはコンストラクターの呼び出しまたはクラスインスタンス作成式では、引数式はコンマで区切られた括弧内に表示される場合があります。各引数式は、その右側の引数式のどの部分よりも前に完全に評価されているように見えます。引数式の評価が突然完了した場合、その右側の引数式のどの部分も評価されていないように見えますか?
その場合、Javaには引数の評価順序が定義されていますが、CまたはC ++コンパイラーがそのような動作が指定されている場合、次善のコードを生成すると言うのは少し奇妙に思えます。これに光を当ててもらえますか?