printf中的一元运算符

时间:2012-01-25 22:54:34

标签: c printf unary-operator

任何人都可以向我解释以下内容的输出。我试图推理所有内容并且可以解释后面的部分,其中'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

由于

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++||++xx之间的评估顺序未指定。

程序中的大多数其他printf调用都存在同样的问题。

  

(C99,6.5.2.2)“函数指示符的评估顺序,实际参数和   实际参数中的子表达式未指定,但有一个序列点   在实际通话之前。“

其输出取决于未指定行为的程序不是严格符合的程序(参见C99,4.p5)。