答えて
これは未定義の動作です。結果は何でもよい。これは、++x
とx ^=
の間にはsequence pointが存在しないため、最初に「完了」する保証はありません。
何ですか?あなたはx ++、++ xなどを意味します...計算の順序は定義されていません、そうですか? –
@Andy、特に、 '^ ='を越えて。 –
シーケンスポイントは存在しません。 '||'演算子は常にシーケンスポイントです。 UBを引き起こす唯一の2つの修正は最後の '++ x'と' x^= 'です。 – aschepler
これは未定義の動作です。あなたが望む答えを得ることができます。
あなたのコンパイラが望むすべての答え。 –
他の人が既に述べたように、これは未定義の動作です。しかし、なぜ?
Cでプログラミングする場合、ステートメントと式には固有の違いがあります。式の評価では、どのような場合でも同じ観察可能な結果が得られるはずです(たとえば、(x + 5)+ 2はx +(5 + 2)と同じです)。一方、ステートメントは、副作用の順序付けに使用されます。つまり、一般に、あるメモリ位置に書き込むことになります。
上記を考慮すると、式はステートメントに「ネスト」するのが安全ですが、ステートメントを式にネストするのは安全ではありません。 「安全な」とは、「驚くべき結果はない」という意味です。あなたの例では
、我々は評価が取り掛かる必要があるため
x^=x || x++ || ++x;
がありますか? ||以来式に作用しますが、それがどうかどうかは関係ありません(x || x ++)|| ++ xまたはx || (x ++ || ++ x)または++ x || (x || x ++)。しかし、x ++と++ xは文であるため(C言語でも式として使用できます)、代数的推論では進めません。したがって、複数のステートメントを記述することで、操作の順序を明示的に表現する必要があります。
- 1. マイクロコントローラでのビット単位の論理
- 2. COBOLのビット単位論理演算子?
- 3. C++の8ビット整数と32ビット整数のビット単位の論理和
- 4. ビット単位Or:C#対C++
- 5. ビット単位のオーバーフローチェックin c
- 6. Sympy:論理式のCコード
- 7. ビット単位のOR処理エラー
- 8. 論理式パーサー
- 9. 論理式ルール
- 10. Cでのビット単位の操作 - AnyOddBit
- 11. Cではビット単位&if文
- 12. 論理とビットの比較
- 13. Fortranの論理式
- 14. ビット単位のbitmanipulationパズル
- 15. Doctrine2 Querybuilderのビット単位で
- 16. ルアの「ビット単位AND」
- 17. GCCビット単位の属性
- 18. ビット単位のモジュラス計算
- 19. PHP&(アンパサンド、ビット単位)演算子の理解
- 20. 画像処理ビット単位命令の概念的解釈
- 21. Visio数式単位
- 22. ビット論理によってビットが現れる文字列
- 23. C#のビット単位のANDの逆数は何ですか?
- 24. Cのバイナリをcharで受け取るビット単位の演算
- 25. C#のビット単位のAND演算子「&」ロジック
- 26. GPS位置ジッタ除去のアルゴリズム/理論
- 27. ビット単位のAND正常および
- 28. デルファイ定数のビット単位の表現
- 29. charのビット単位シフト配列
- 30. ビット単位または|オペレータは?
参照:http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order(質問はシーケンスポイントの知識を前提としています)およびhttp://stackoverflow.com/questions/4445706/post-increment - および - 事前インクリメント - コンセプト(受け入れられた回答を参照)。 *正確な*重複はありませんが、このUBはSOで「十分にカバーされています」。 –
[未定義の動作とシーケンスポイント](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)も参照してください。これは "C++ - faq"のものですが、一般的にはまだ適用されます。 –