0

今日は妖怪に遭遇。

http://codepad.org/VW2vTpWw

言語:C

コード:

#include <stdio.h>

main()
{
    int i = 5;
    i = i++;
    printf ("%i", i);
}

出力:

6

どのように?なんで?

これはトリッキーなコードのはずですが、逆です。怠慢なプログラマーはi = i++、単純なインクリメントだと思うかもしれませんが、そうではありません。それでも、ここでは同じように機能します。はず5です!JavaScriptのように。

何が起こっているはずです。

  1. iの値を取得します5
  2. i++戻ります5
  3. iポストインクリメントi++( まで6) です。
  4. i5(によって返される)の値を取得しますi++
  5. i( )の値5が出力されます。

しかし、そうです6

SOまたはインターネット全体でこれに関する説明を見つけることができませんでした(そのです)。

ここで何が壊れていますか?

説明してください。

4

1 に答える 1

11

介在するシーケンス ポイントなしでオブジェクトに複数回格納することは、未定義の動作です。

特に、ステップ 3 と 4 には順序が定義されておらず、インクリメント (およびストア) またはストアが最初に発生する可能性があります。

于 2013-05-12T20:01:10.837 に答える