3

我在 Apple LLVM 编译器 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

我期待 0 1 2 作为输出。使用 LLVM GCC 4.2 的相同代码会产生正确的输出。是否有任何我遗漏的优化标志或我误解的东西?

4

1 回答 1

3

所以看起来行为如下

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

这里首先计算右侧,返回 0,并将 numIndex 递增 1,然后计算右侧,因此 indices[1] 得到 0

indices[numIndex] = numIndex++;

这里首先计算右侧,返回 1,然后将 numIndex 递增 1,然后计算右侧,因此 indices[2] 得到 1

indices[numIndex] = numIndex++;

这里首先评估右侧,返回 2,然后将 numIndex 递增 1,然后评估右侧,因此 indices[3] 得到 2(实际上你超出了界限)

请注意,您从未真正分配过索引 [0],因此它可以是任何东西(在我的测试中,它是最大 int 数)

编辑-从评论看来,这是行为实际上是未定义的,所以即使我观察到这一点,它也不是一个明确的答案

于 2012-06-20T16:21:57.700 回答