C增量运算符说明

时间:2017-02-17 04:16:19

标签: c increment post-increment pre-increment sequence-points

在执行这段C命令时, num 的输出为7.我原以为它是6,有人可以解释为什么以及原来是7?

#include <stdio.h>

int main() {
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i = 0, num = 0;
    num = a[++i + a[++i]] + a[++i];
    printf("%d ", i);
    printf("%d ", num);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

inum = a[++i + a[++i]] + a[++i];

中的同一表达式中递增3次

这在C中有未定义的行为。试图解释为什么它会输出76或任何其他内容是一个没有实际意义的点。 未定义的行为可以是任何内容。

答案 1 :(得分:0)

OS X上的llvm给了我6个警告:

wi.c:5:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

这表明我们正在研究一种未定义的行为。到目前为止,这里未定义的确切性质对我来说并不清楚,但感觉有点无关紧要。

答案 2 :(得分:0)

这有点棘手,表达式为a[++i+a[++i]],涉及变量i的增量两次,并且变为a[i + 2 + a[i + 2]],即a[0 + 2 + a[2]] = a[4] = 4 ,第二个操作数a[++i]变为a[3],等于3,因此,最终答案为7.换句话说,这是未定义的行为。

答案 3 :(得分:-1)

i = 0;
num = a[ ++i + a[++i]] + a[++i]

将评估为

num = a[1+ a[2]] + a[3]
num = a[1 + 2] + a[3]
num = a[3] + a[3]
num = 3 + 3
num = 6