任何人都可以向我解释以下内容的输出。我试图推理所有内容并且可以解释后面的部分,其中'x'被赋予了表达式的值,但是无法理解printf语句中答案的不同之处!!!
不同的编译器可能表现不同。如果有人可以为任何编译器解释这种行为,那就太好了。
我在openSUSE 12.1(Asparagus)(i586)上使用gcc(SUSE Linux)4.6.2
代码:
#include<stdio.h>
int main()
{
unsigned int x=0;
printf("expr= %d x=%d\n",(x^x),x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
printf("expr= %d x=%d\n",(x^x)||x++||++x||x++,x);
printf("x=%d\n",x);
x=0;
(x^=x);
printf("x=%d\n",x);
x=0;
(x^=x)||x++;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x;
printf("x=%d\n",x);
x=0;
(x^=x)||x++||++x||x++;
printf("x=%d\n",x);
return 0;
}
输出:
expr= 0 x=0
x=0
expr= 0 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
expr= 0 x=1
x=1
expr= 1 x=1
x=1
expr= 1 x=2
x=2
expr= 1 x=2
x=2
x=0
x=1
x=2
x=2
由于
答案 0 :(得分:4)
您正在调用未指定的行为。
在类似func(a,b)
的表达式中,C标准没有指定应首先评估哪个参数;编译器可以自由地进行。
现在考虑func(x++,x)
;没有具体说明它是否等同于:
a = x++;
b = x;
func(a,b);
或者这个:
b = x;
a = x++;
func(a,b);
答案 1 :(得分:3)
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);
此功能显示未指定的行为。 (x^x)||x++||++x
和x
之间的评估顺序未指定。
程序中的大多数其他printf
调用都存在同样的问题。
(C99,6.5.2.2)“函数指示符的评估顺序,实际参数和 实际参数中的子表达式未指定,但有一个序列点 在实际通话之前。“
其输出取决于未指定行为的程序不是严格符合的程序(参见C99,4.p5)。