printf 中的一元运算符

发布于 2024-12-29 01:13:17 字数 1185 浏览 1 评论 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

谢谢

Can anyone explain me the output of the following. I tried to reason everything and can explain the later part where 'x' is assigned the value of the expression but cannot understand how the answer is different in a printf statement!!!

Different compilers might behave differently. It would be great if someone could explain this behavior for any compiler.

I am using gcc (SUSE Linux) 4.6.2 on openSUSE 12.1 (Asparagus) (i586)

code :

#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;
}

output :

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

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清欢 2025-01-05 01:13:17

您正在调用未指定的行为

在像 func(a,b) 这样的表达式中,C 标准没有指定应该首先计算哪个参数;编译器可以自由地执行任一操作。

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

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

或 this:

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

You are invoking unspecified behaviour.

In an expression like func(a,b), the C standard does not specify which argument should be evaluated first; the compiler is free to do either.

So now consider func(x++,x); it is unspecified whether it is equivalent to this:

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

or this:

b = x;
a = x++;
func(a,b);
绮烟 2025-01-05 01:13:17
printf("expr= %d x=%d\n",(x^x)||x++||++x,x);

此函数显示未指定的行为。 (x^x)||x++||++xx 之间的求值顺序未指定。

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

(C99, 6.5.2.2) “函数指示符、实际参数和的求值顺序
实际参数中的子表达式未指定,但有一个序列点
在实际调用之前。”

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

printf("expr= %d x=%d\n",(x^x)||x++||++x,x);

This function shows unspecified behavior. The order of evaluation between (x^x)||x++||++x and x is unspecified.

Most of the other printf calls in your program have the same issue.

(C99, 6.5.2.2) "The order of evaluation of the function designator, the actual arguments, and
subexpressions within the actual arguments is unspecified, but there is a sequence point
before the actual call."

A program whose output depends on unspecified behavior is not a strictly conforming program (see C99, 4.p5).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文