2012-12-05 16 views
11

可能性の重複に常に等しい:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
increment values in printfがXである[I] * Y [I ++]×[I] * Y [i]は

私は2つの二重配列xyと整数iを持っています。

double res = x[i] * y[i++]; 

は常に声明に等しいです:私の質問は声明かどうかである

double res = x[i] * y[i]; 
i++; 

それはいくつかのコンパイラは明らかに異なる結果を生成する、y[i++] * x[i]x[i] * y[i++]を変えるということは可能ですか?

+0

なぜ重要ですか?特定の注文が必要な場合は、その順序で書き込んでください。 –

+0

@BoPersson。なぜ私はそれが必要なのか説明を書こうと思ったが、質問を台無しにしたくなかった。まもなく、私は 'double vectors_dot_product(double * x、double * y、int n);'関数を加速し、 'x [i] * y [i ++] + x [i] * y [i ++] +を発見する必要があります。 ..]は 'x [i] * y [i] + x [i + 1] * y [i + 1] + ...;より速い。 – Serg

答えて

13

いいえ - x[i] + y[i++]の動作は未定義です。あなたはiの値を変更していて、値iを介在するシーケンスポイントなしで変更すると、未定義の動作が得られます。 C++ 11標準で


  1. 「は、配列点」用語を排除したが、効果は同じまま - の二つは互いに順不同です。
+1

正解を最初に+1します。 – slebetman

+3

これは、乗算演算子の可換性とは何の関係もありません。操作が 'x [i] -y [i ++]'(逆にすることはできません)の場合、この状況での 'i'の動作は未定義です。 –

8

いいえ、増分が発生すると、未定義です。

+8

インクリメントが発生したときだけではない。振る舞いは**完全に**未定義です:それは 'i'を修正し、介入するシーケンスポイントなしでその値を読み取ります。 –

+1

@Pete:偉大な、いつピザの配達の少年が私の目の前に現れますか? ;) – fredoverflow

+2

@FredOverflow - コンパイラベンダーに問い合わせてください。 –

1

いいえ、私は+ +私の

値++ +はCC++undefinedあります。

変数を式で2回読み込んだ場合でも、結果は未定義です。それをしないでください。別の例は次のとおりです。

v[i] = i++; 

未定義は、そのコンパイラの依存関係を意味します。
コンパイラの中には、評価の順序があるため、あなたにも未定義として警告するものがあります。 C++

1http://www.stroustrup.com/bs_faq2.html#evaluation-order

+0

まだ少しの作業が必要です。 'v [i] = i ++;'は、関数や引数を一切渡していないとしても、未定義です。 –

+0

@GrijeshChauhan、リンクをありがとう。 – Serg

+0

@Serg:ようこそ!もし私が助けることができたら嬉しいです。 –

6

のための非常に良いreferenceコードはiを変更し、介在配列の点なしで、その値を使用するため、動作は未定義です。言語定義は、ここでの要件を課すものではありません。

+0

興味深いことに、皆さん、皆さん、C++ 11はもはや「シーケンスポイント」を使用していないという事実は言及していません。 :-) –

+0

@ JerryCoffin - 時には物事を単純にする方がよい場合もあります。 –

+0

+1。 「信仰を放棄する」、「ここに入るすべての人」という単純さのために何か言いたいことがあります。 –

関連する問題