0

谁能解释我以下的输出。我试图推理一切,并可以解释后面的部分,其中“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

谢谢

4

2 回答 2

4

您正在调用未指定的行为

在类似 的表达式func(a,b)中,C 标准没有指定应该首先计算哪个参数。编译器也可以自由选择。

所以现在考虑func(x++,x);它是否等同于这个是未指定的:

a = x++;
b = x;
func(a,b);

或这个:

b = x;
a = x++;
func(a,b);
于 2012-01-25T23:03:03.877 回答
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)。

于 2012-01-25T23:10:40.497 回答