2つの整数の変数を交換するのではなく、一時的なストレージを使用しての容疑者「賢い」(実際には非効率的な)方法は、多くの場合、この行を含み、シーケンスポイントではありませんか? これは実際には未定義の動作であることを意味しますか?式a^= b^= a^= bにシーケンスポイントがありますか、それとも未定義ですか? <code>^=</code>よう </p> <pre><code>int a = 10; int b = 42; a ^= b ^= a ^= b; /*Here*/ printf("a=%d, b=%dn", a, b); </code></pre> <p>しかし、私は思ったんだけど、複合代入演算子は次のとおりです。
答えて
a ^= b ^= a ^= b; /*Here*/
これは未定義の動作です。
2つのシーケンスポイント間でオブジェクト(a
)を複数回修正しています。
(C99、6.5p2)「は前と次のシーケンスポイントとの間のオブジェクトが格納された値は、式の評価によって、せいぜい一度変更したものとする。
単純割り当てならびに化合物割り当ては、シーケンスポイントを導入していない。ここでシーケンスポイントが式文式の前と式文の後にあります。
シーケンスポイントはC99とC11規格の附属書C(参考)に記載されています。
^=は、シーケンスポイントではありません、彼らは彼らではない
です。
実際には未定義の動作ですか?
はいです。この "賢い"技法を使わないでください。
確認していただきありがとうございます。心配しないで、私は最初にそれを使うつもりはありませんでした。 – Medinoc
この式にシーケンスポイントがないため、未定義の動作が発生します。
あなたは自明それを修正し、がはシーケンスポイントを導入しないコンマ演算子を使って、簡潔のほとんどを維持できます。
a ^= b, b ^= a, a ^= b;
この時点で3つの異なる行に置くこともできます。 – Thomas
^=
オペレータの評価の順序が明確に定義されています。明確に定義されていないのは、a
とb
が変更された順序です。
a ^= b ^= a ^= b;
は、その引数が評価される前に、オペレータは評価できない
a ^= (b ^= (a ^= b));
に相当し、間違いなく最初a ^= b
を実行しようとしています。
これを未定義の動作にする理由は、コンパイラに最適化の柔軟性を与えるために、任意の順序で変数値を変更できることです。コンパイラは唯一のものを行うには、これらの3つの方法のいずれかを選択することができれば
int a1 = a^b;
int b1 = b^a1;
int a2 = a^b1;
a = a2;
a = a1;
b = b1;
、:
int a1 = a^b;
int b1 = b^a1;
int a2 = a^b1;
a = a1;
a = a2;
b = b1;
またはこの:
int a1 = a^b;
int b1 = b^a1;
a = a1;
int a2 = a^b1;
a = a2;
b = b1;
かさえ、このことは、これを行うために選択することができますこれは単に「不特定」の動作になります。しかし、標準はさらに進んで、これを "未定義"の動作にしています。これは、コンパイラが基本的にそれが起こり得ないと仮定できるようにします。
最初の説明は究極ですが、理由を理解できませんでした:* '変更前または変更後の値' * –
これは誤解を招くようなものです。評価が既に完了した後、式の副作用が起きるのを防ぐものは何もありません。 'a^= b'の結果は' a^b'であり、副作用として 'a'がその結果に設定されます。 * 'a'がその結果に設定されているときは、指定されていません。特に、外側の 'a^= = ... 'が始まる前に終了する必要があるものは何もありません。 – hvd
@hvd:私は同意します。私はそれを明確にするために言い換えようとしました。 –
- 1. 「a <= b && b <= a && a!= b」はどのように真実になりますか?
- 2. if(a-b <0)とif(a <b)の違い
- 3. 建設中の初期化?私は<code>a(c), b(a)</code>として<code>a</code>で<code>b</code>の初期化についてはよく分からない、今</p> <pre><code>struct A{ int a; int b; A(int c): a(c), b(a){ } }; int main() { A b(10); } </code></pre> <p>:
- 4. ブール代数を使って式を最小化する方法は?</p> <p>Y =/A/B/C/D +/A/B/CD +/AB/CD + A/B/C/D + A:ここ
- 5. は、私は例が</p> <pre><code>COL1 COL2 A X A X A X A X A X B X B X B X C X C X C X </code></pre> <p>Iされて、私はタイプA、BおよびCを持つSQLデータベースから情報を取得しようとしている
- 6. double a = a + int bとint a + = double bの違いは何ですか?
- 7. が動作していないよう<code>"a b"</code>から<code>"a b"</code></p> <pre><code>ssr["a b";"[ ]+";" "] </code></pre> <p>に取得するにはKDB +/Q
- 8. これは、マップ<A、ペア<B, C>>
- 9. なぜフォーオールですか? Intのサブタイプとは見なされませんが、forall型の式を使用できます。 Int型のどこでも期待されていますか?</p> <pre><code>a :: forall a. a a = undefined b :: Int b = a </code></pre><p>即ち:
- 10. 私はAのシーケンスに基づいて数値ベクトルに変換したい</p> <pre><code>A <- c("A","A","B","B", "C","C","C", "D") </code></pre> <p>のようなベクトルを持って
- 11. SQL、同じデータが、私はそれがこのような何かを表示したい任意の列</p> <pre><code>Source data table: P1 P2 P3 ----------- a b a a a b c a b b b a </code></pre> <p>に表示されます合計ためで、グループIは、複数の列でカウントしようとしています
- 12. if(a <b)または(b = 0)のいずれかのPHP if文
- 13. タイプパターンの名前:R a b = Q(a - >(R a b、b))
- 14. X = A - inv(B)* Y * inv(B)とX = Y + A '* inv(B)* Aを計算する方法はありますか?
- 15. のXpath - チェックすべての要素がサブ要素を持つ文書</p> <pre><code><a> <b> <c/> <d/> </b> <b> <c/> <d/> </b> </a> </code></pre> <p>考える
- 16. a.compareTo(b)がcompareTo(a、b)またはa.method(b)= method(a、b)と等しいのはなぜですか?
- 17. <a href="http://codeforces.com/contest/659/problem/B" rel="nofollow">Problem</a>の配列
- 18. 結び固め戦略で構築されたグラフで検索することは可能ですか?戦略はかなり洗練され、私は方法を見つけることができなかったこと</p> <pre><code>data Node = Node Node Node -- a - b -- | | -- c - d square = a where a = Node b c b = Node a d c = Node a d d = Node b c </code></pre> <p>:
- 19. はどのように、</p> <pre><code>f :: a -> b g :: b -> c h :: c -> d </code></pre> <p>ハスケル
- 20. numexpr.evaluate( "a + b"、out = a)
- 21. なぜGCCはプライベートネストされたクラスから継承を許可していますか?プライベート入れ子になったクラスです<code>A::B</code>から</p> <pre><code>class A { class B {}; }; template <typename C> class D : A::B {}; void f() { D<int> d; } </code></pre> <p><code>D<int></code>継承:
- 22. java.lang.Math.max(int a、int b)はスレッドセーフですか?
- 23. a = b + aのショートカット。
- 24. ["a"、 "b"、 "c"]の "a、b、c" .split( "、")のメリットは何ですか?
- 25. a = return bを返したら、a = bですか?
- 26. Cブロックは式になります:({int a = 1; int b = 2; a + b;})は3に等しくなります
- 27. Python dictの内容を複数の変数に同時に割り当てますか?私はこの</p> <pre><code>def f(): return { 'a' : 1, 'b' : 2, 'c' : 3 } { a, b } = f() # or { 'a', 'b' } = f() ? </code></pre> <p>すなわちような何かをしたいと思います
- 28. のbackground-position質問<a href="http://www.sellmycalls.com/cgi-bin/chain" rel="nofollow noreferrer"><b>this page I"ve been working on forever</b></a>で
- 29. どのように(sort {$ a <=> $ b;} @_)[0];作業?
- 30. ¬(a = b)と(a≠b)が異なる言語
何が起こっているのかを示すのが難しいコードを書く場合は、将来の開発者が理解できるようにもっと簡単な方法があれば自分自身に尋ねてください。 –
C++コードでこれを見た場合、C++では、Cで定義されていない特定の構造体(これについてはわかりません)を許可する代入演算子のルールが異なります。 – hvd
[Sequence Point - Xor配列の入れ替えが間違った結果になる](http://stackoverflow.com/questions/9958514/sequence-point-xor-swap-on-array-get-wrong-result) –