int main(){
int a[3]={1,10,20};
int *p=a;
printf("%d %d " ,*++p,*p);
return 0;
}
gcc编译器上面代码的输出为10 1。
我知道* ++ p递增p并取消引用新值。但是由于p已递增,为什么* p返回1而不是10?
答案 0 :(得分:7)
在评估函数参数表达式的顺序中,这是未指定的行为。有些编译器可能使用从左到右,有些从右到左,有些可能会根据优化情况执行不同的评估顺序。因此,在您的情况下,*p
会在*++p
之前进行评估,从而导致您的“奇怪输出”。
答案 1 :(得分:2)
*++p
和*p
之间的逗号不表示sequence point,因此这是 undefined 未指定的行为。编译器是免费的
在*p
之前评估*++p
。
答案 2 :(得分:0)
未定义的行为,输出可能在不同的编译器上有所不同。
答案 3 :(得分:0)
显然,您的参数正在以相反的顺序(从最后到第一个)进行评估,因此首先评估*p
,然后它将返回1
。
正如其他人所指出的那样,该标准没有规定参数的评估顺序,因此这种行为可能与其他编译器看起来相同或不同。