2011-06-26 12 views
-2

これは特定のコンパイラであれば、私は知らないが、私はDEVCで2つの式を実行しているしようとしたとき++i = i ++ + ++ cの出力の差; i = ++ i + C++;

i=++i + c++1

を与えます。しかし b=i++ + ++cb=++i + ++cが結果を生成するのに対し、i=c=b=0;i=i++ + ++c2を与えますどちらの式でも1

同じ式で変数を2回インクリメントすると、C標準仕様では定義されていない値になってしまいますが、コンパイラがこれらの出力をどのように生成するのか不思議です。誰かがどのように理由を説明してくれますか?

+5

未定義の動作。 [悪魔はあなたの鼻から飛ぶかもしれません](http://www.urbandictionary.com/define.php?term=nasal%20demons)。実際には、結果を 'i'に代入しないとこの問題は面白いでしょう。これは未定義の動作を引き起こします。 –

+0

@Fred Larsonは2番目の例では有効ではありませんが、最初に定義されているのは未定義です –

+0

@Jesus:両方で 'i'に割り当てが戻っているので、どちらも未定義の動作です。代入と増分の間にシーケンスポイントはありません。 –

答えて

0

i++++iは完全に異なっている、i++は、式の中iを評価し、その評価を行った後にインクリメント意味ポストインクリメントです。 ++iは、インクリメントしてから式を評価することを意味します。 あなたの例ではi = ++i/i++と設定されていますが、これはコメントに記載されているように未定義の動作です。

3

i++ + ++cが、cは( 1)インクリメントされ、その後0 + 1iに格納され、最終的にiがインクリメントされ、2を与えます。

++i + c++iは( 1)インクリメントされ、その後1 + 0iに格納され、その後cがインクリメントされます。

これは、コンパイラが何をしたのかを理解する方法ですが、他の人が言っているように、この動作は他の場所にはカウントしないでください。

1

b = ++ i + ++ c = 1ですか?またはそれでしたか?b = ++ i + C++?あなたの質問について私の説明があります。

i = i++ + ++c 
    (i = 0 + 1)++ 
    i = 2 
    c = 1 

    i = ++i + c++ 
    (i = 1 + 0) 
    i = 1 
    c = 1 
0

C99規格が明示的に述べている(6.5、P2)前と次のシーケンスポイント間

オブジェクトは、その格納された値は、式の評価によって最も一度変更したものとします。許可されていません

表現i = ++i;i = i++;両方更新i二回、。