3

AppleLLVMコンパイラ3.1で次の問題が発生しました。

int numIndex = 0;
int *indices = (int *)malloc(3 * sizeof(int));
indices[numIndex] = numIndex++;
indices[numIndex] = numIndex++;
indices[numIndex] = numIndex++;
for (int i = 0; i < 3; i++) {
    NSLog(@"%d", indices[i]);
}

出力:1 0 1

int numIndex = 0;
int indices[3];
indices[numIndex] = numIndex++;
indices[numIndex] = numIndex++;
indices[numIndex] = numIndex++;
for (int i = 0; i < 3; i++) {
    NSLog(@"%d", indices[i]);
}

出力:0 0 1

出力として012を期待しています。LLVM GCC 4.2を使用した同じコードは、正しい出力を生成します。私が見逃している最適化フラグや誤解しているものはありますか?

4

1 に答える 1

3

したがって、動作は次のようになります

int numIndex = 0;
int indices[3];
indices[numIndex] = numIndex++;

ここでは、右側が最初に評価され、0 が返され、numIndex が 1 ずつインクリメントされます。次に右側が評価されるため、indexs[1] は 0 になります。

indices[numIndex] = numIndex++;

ここでは、右側が最初に評価され、1 が返され、numIndex が 1 ずつインクリメントされます。次に右側が評価されるため、indexs[2] は 1 を取得します。

indices[numIndex] = numIndex++;

ここでは、右側が最初に評価され、2 が返され、numIndex が 1 ずつインクリメントされます。次に、右側が評価されるため、indexs[3] は 2 を取得します (実際には範囲外です)。

そして、実際にインデックス[0]が割り当てられることは決してないことに注意してください。したがって、それは何でもかまいません(私のテストでは、最大のint番号でした)

編集-これは実際には未定義の動作であるというコメントから見えるので、これを観察したとしても、明確な答えではありません

于 2012-06-20T16:21:57.700 に答える