2011-08-02 20 views
1

可能性の重複:
Undefined Behavior and Sequence Points複数のインクリメント演算子

Pleaeは、次の文

int b=3; 
cout<<b++*++b<<endl; 

の動作を説明することが計算されますどのように?

+1

代わり

(b++)*(++b) 

を使用することを検討してくださいあなたはそれを試してみたのですか? –

+1

@ 0A0D UB以来、役に立たない。 –

+0

gccでチェックしましたが、それは16を返します。 しかし、私はそれを理解できません。とにかくGregは非常に役に立つ説明を与えてくれました。 ありがとう –

答えて

4

ここでの動作は未定義です。 this question

関連する規格の引用を参照してください。

§5/4.1 Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression.

最も一般的なシーケンスポイントは文の終わりです。

は、標準からの注目に値する:他の人が語ったよう

§5.2.2/8 The order of evaluation of arguments is unspecified.

+0

あなたの答えの後半は間違っています。コールの順番は不明ですが、一方のコールは他方のコールのすべての副作用を認識し、もう一方のコールは副作用を認識しません。コンパイラが生成する可能性のある正しい結果は2つありますが、UBとは大きく異なります。 –

+0

@R ..あなたが正しいです、私は言い換えます。 –

+0

まだ正しくはありません。 *実装定義*とは実装がどのように定義されているか(文書化する)ことを意味します。 *未指定*は、いずれかの方法で(または異なる方法で)異なる方法で発生する可能性があり、それを記録する必要はないことを意味します。 「ふたつの呼び出しは、順番どおりに実行されますが、指定されていない順序で行われます」よりも具体的な動作記述を記述するのは難しいです。 –

1

標準ではこれは定義されていません。コンパイラは、演算子の優先順位の規則に従う限り、順序どおりのステートメントを自由に評価できます。結果はUBになります。

b++ * ++b; // b is modified more than once 
0

これは未定義の動作ですが、最終結果を伝えることはできません。結果は実装によって異なります。

1

動作は不定となります。 出力はコンパイラの実装によって異なります。

しかし、標準に従って、定義されていないはずです。

-1

未定義の動作は、演算子の優先順位が同じであるため、コンパイラは任意の順序でこの式を自由に評価できます。

+3

これはまだ未定義です。[プリミティブ型の場合]その式のどこにもシーケンスポイントがありません。これは演算子の優先順位に関するものではありません。コンパイラは様々なインクリメントを実行するときには選択肢がありませんが、そのインクリメントの結果が表示されるときに問題が発生します。 –