Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C增量运算符说明_C_Increment_Post Increment_Pre Increment_Sequence Points - Fatal编程技术网

C增量运算符说明

C增量运算符说明,c,increment,post-increment,pre-increment,sequence-points,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); ret

在执行这段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;
}
#包括
int main(){
inta[]={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);
返回0;
}

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

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

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

这有点棘手,表达式:
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。换句话说,这是未定义的行为。

i
num=a[++i+a[++i]]]+a[++i]中的同一表达式中递增3倍

这在C中有未定义的行为。试图解释它为什么输出
7
6
或任何东西都是没有意义的。未定义的行为可以是任何东西

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

这是未定义的行为-您不能在同一操作中两次修改同一变量。您不是在同一小时内问了相同的问题吗?(当然,这次你的措辞要好得多。:)解释了为什么这是未定义的行为,应该避免。@Antti Haapala为什么会这样?请看重复的问题及其答案。@Antti Haapala是的,你是对的。谢谢你