未定義/未指定?

c c++
未定義/未指定?

_
可能性のある複製: https://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior[「i= + i + 1」未指定の動作はなぜですか?]
_

次のスニペットを検討してください。

int i=10;
printf("%d %d %d",i,++i,i--);

関数への引数が評価される順序はC / C ++では指定されていないため、指定されていない動作につながります。

私は何かを修正または不足していますか? 説明してください。

編集:まあ、一部のメンバーはそれが重複していると信じており、これは未定義の動作です。とにかく、C99から:

  • 6.5.2.2(10)*

関数指定子、実際の引数、および実際の引数内の部分式の評価の順序は*未指定*ですが、実際の呼び出しの前にシーケンスポイントがあります。

では、正確な命名法は、* Undefined または Unspecified *になります。

  1  0


ベストアンサー

そうですね。

異なるプラットフォームでは、引数を渡すために異なる機構が採用されているため、パラメーターが異なる順序で評価される可能性があるためです。

2


表示されているのは、C / C ++仕様が未定義の例です。そのため、さまざまなコンパイラーが必要な処理を実行できます。 あるコンパイラーはパラメーターを左から右の順序で実行し、別のコンパイラーは右から左の順序でパラメーターを実行します。 コンパイラが順序をランダムに選択することは完全に問題ありません。

ソースが作成しようとしているポイントは、パラメーターを渡すときに順序に依存しないことです。 たとえば、

A(DoX(), DoY())

DoXとDoYは、定義されていない順序で実行されるため、他の副作用に依存することはできません。 完全に明示的にするには、次のようなことをしたいでしょう。

int x = DoX();
int y = DoY();
A(x, y);

実際の製品コードの大部分では、このような状況に頻繁に遭遇することはありませんが、それは時々起こります。

これは、http://en.wikipedia.org/wiki/Short-circuit_evaluation [短絡評価]と関連していますが、異なることに注意してください。

1


タイトルとURLをコピーしました