怀疑在printf中使用* ++ p

时间:2011-06-24 17:42:19

标签: c programming-languages

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?

4 个答案:

答案 0 :(得分:7)

在评估函数参数表达式的顺序中,这是未指定的行为。有些编译器可能使用从左到右,有些从右到左,有些可能会根据优化情况执行不同的评估顺序。因此,在您的情况下,*p会在*++p之前进行评估,从而导致您的“奇怪输出”。

答案 1 :(得分:2)

*++p*p之间的逗号表示sequence point,因此这是 undefined 未指定的行为。编译器是免费的 在*p之前评估*++p

答案 2 :(得分:0)

未定义的行为,输出可能在不同的编译器上有所不同。

答案 3 :(得分:0)

显然,您的参数正在以相反的顺序(从最后到第一个)进行评估,因此首先评估*p,然后它将返回1

正如其他人所指出的那样,该标准没有规定参数的评估顺序,因此这种行为可能与其他编译器看起来相同或不同。