2011-01-26 14 views
0
int x = 0; 
x^=x || x++ || ++x; 

そして最後にxの答えは3です。 この式の解析方法は? これについて少し混乱しています。 ありがとうございました。c、ビット単位、論理式

+0

参照:http://stackoverflow.com/questions/1895922/sequence-points-and-partial-order(質問はシーケンスポイントの知識を前提としています)およびhttp://stackoverflow.com/questions/4445706/post-increment - および - 事前インクリメント - コンセプト(受け入れられた回答を参照)。 *正確な*重複はありませんが、このUBはSOで「十分にカバーされています」。 –

+0

[未定義の動作とシーケンスポイント](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)も参照してください。これは "C++ - faq"のものですが、一般的にはまだ適用されます。 –

答えて

7

これは未定義の動作です。結果は何でもよい。これは、++xx ^=の間にはsequence pointが存在しないため、最初に「完了」する保証はありません。

+0

何ですか?あなたはx ++、++ xなどを意味します...計算の順序は定義されていません、そうですか? –

+0

@Andy、特に、 '^ ='を越えて。 –

+3

シーケンスポイントは存在しません。 '||'演算子は常にシーケンスポイントです。 UBを引き起こす唯一の2つの修正は最後の '++ x'と' x^= 'です。 – aschepler

2

これは未定義の動作です。あなたが望む答えを得ることができます。

+6

あなたのコンパイラが望むすべての答え。 –

-1

XOR 0は0です。次に、++は2に2です。それにもかかわらず、他の回答で指摘されているように、シーケンスポイントはありません。だから、出力は何でもかまいません。

+0

-1:いいえ、他の回答を参照してください。 –

+1

xor 0が0の場合は、実際に_0_です。 0,0→0,1,1→1,0,1→1,1,1→0となる。これは良い答えではありません:-) – paxdiablo

+0

修正されました。それを指摘してくれてありがとう。 – Ron

0

他の人が既に述べたように、これは未定義の動作です。しかし、なぜ?

Cでプログラミングする場合、ステートメントと式には固有の違いがあります。式の評価では、どのような場合でも同じ観察可能な結果が得られるはずです(たとえば、(x + 5)+ 2はx +(5 + 2)と同じです)。一方、ステートメントは、副作用の順序付けに使用されます。つまり、一般に、あるメモリ位置に書き込むことになります。

上記を考慮すると、式はステートメントに「ネスト」するのが安全ですが、ステートメントを式にネストするのは安全ではありません。 「安全な」とは、「驚くべき結果はない」という意味です。あなたの例では

、我々は評価が取り掛かる必要があるため

x^=x || x++ || ++x; 

がありますか? ||以来式に作用しますが、それがどうかどうかは関係ありません(x || x ++)|| ++ xまたはx || (x ++ || ++ x)または++ x || (x || x ++)。しかし、x ++と++ xは文であるため(C言語でも式として使用できます)、代数的推論では進めません。したがって、複数のステートメントを記述することで、操作の順序を明示的に表現する必要があります。