2012-02-10 13 views
2

可能性の重複:
How do we explain the result of the expression (++x)+(++x)+(++x)?
Undefined Behavior and Sequence PointsC + C++ =未定義の動作ですか?

スタンダールタイプのため、私自身の種類ごとに異なる方法でコード

U = C + C++; 

実行し、私は、問題を抱えています。 私はhttp://ideone.com/4S1uAの例を持っています。ここではintとMyクラスのIntの値が異なっていますが、実際のIntが動作する方法を表すはずです。

標準のintと同じように、私のクラスを同じように動作させることはできますか?このコードは未定義の動作ですか?

なぜそれは不確定ですか? C++には操作の優先度がありますので、最初の引数としてはaの新しい値が渡され、2番目の値には古い値が渡されるため、aの値が変更されるので、c++が最初に評価される必要があります。そして、クラスIntの場合はこのように動作しますが、standart intの場合はそうではありません。

+5

はい、未定義の動作です。他の人に標準への参照などで回答を作成させてください。 –

+1

参照http://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer -should-know-ab – Dervall

+1

はい、 'C'または' C++ 'を最初に評価するかどうかは不定であるため、UBです。 –

答えて

4

このコードは定義されていませんか?

はい。副作用に関してオペランドが評価される順序は未定義です。標準の

セクション6.5(2)は言う:

スカラーオブジェクトに副作用が同じスカラーオブジェクトまたはの値を使用して値計算上の異なる副作用のいずれかにunsequenced相対的なものである場合同じスカラー オブジェクトでは、動作は未定義です。式の部分式に複数の許容可能な順序がある場合、その順序付けされていない側にいずれかの順序でエフェクトが発生すると、その動作は未定義です。

intはスカラー型であり、ここでの副作用は順序付けされていないため、動作は未定義です。

あなたはこのようなあなたのコードを書く必要があります。

U = 2*C; 
C++; 
+0

構造体 'c + C++ 'が必要な状況を想像することはできませんが、このコードがどのように機能するかについていくつかの議論があります。しかし、C++には操作の優先度があるので、最初の引数は新しい値を変更し、2番目の値は古い値にする必要があるため、aの値を変更するときにC++を最初に評価する必要があります。しかし、これは型のビルドでは機能しません。 – Seagull

+2

オペランドの評価順序は未定義です。 –

+3

@ Seagull:これは演算子の優先順位の問題ではありません。はい、+演算は+演算の前に(優先順位のために)起こりますが、+演算の左辺についてCの値が評価されたときはそれを知らせません。 –

2

はい、それは未定義の動作です。式「C」および式「C++」の評価順序が定義されていないため、変数を変更するステートメントで変数に2回アクセスすることはできません。

2

ここに含まれる概念は、sequence pointsのいずれかです。命令型プログラミングのシーケンスポイントは、前回の評価のすべての副作用が実行されていることが保証されたコンピュータプログラムの実行中の任意のポイントを定義し

、ノーサイド:Wikipediaの記事オープニングの文章を引用しますその後の評価からの効果はまだ行われていない。Cにおいて

+オペレータは、シーケンスポイントを作成しません。したがって、副作用の順序は定義されていません。ただし、C++ではオーバーロードされたoperator +が関数呼び出しであり、シーケンスポイントが作成されます。これは、副作用に関して異なる挙動を生み出す。関数の引数が評価される順序は指定されていませんが、関数が入る前にすべての副作用が完了することに注意してください。したがって、C + C++にオーバーロードされた+演算子が含まれている場合は、+関数が実行される前に、C++の副作用が+の左の引数に適用されます。これは、intの値の場合とは異なり、右側の副作用が完了する前に左側が評価される場合と評価されない場合があります。

+0

'C + + ++にオーバーロードされた+演算子が含まれている場合、+関数が実行される前に+の左引数にC++の副作用が適用され、' f(c、C++) 'もスカラーcのUBです。 – Cubbi

+0

@Cubbi - 私はその行動が必然的に定義されているとは言いませんでした。 '+'が実行される前に '+'の副作用が完了したと言いました(シーケンスポイントを作成しない組み込みの '+'演算子とは異なります)。スカラの場合、明らかに引数評価の順序(UB)が関数に渡される値を決定します。オブジェクトについては、 '+'は左の引数が '++ 'の効果を含むことが保証されていると見なされる点です。 –

関連する問題