这个C程序的输出应该是什么?
#include<stdio.h>
int main(){
int x,y,z;
x=y=z=1;
z = ++x || ++y && ++z;
printf("x=%d y=%d z=%d\n",x,y,z);
return 0;
}
给定的输出是:
x = 2 y = 1 z = 1
我理解x的输出,但是没有看到y和z值如何不增加。
答案 0 :(得分:12)
这是short-circuit evaluation的结果。
表达式++x
求值为2
,编译器知道2 || anything
始终求值为1
(“true”),无论anything
是什么。因此,它不会继续评估anything
,y
和z
的值也不会更改。
如果您尝试
x=-1;
y=z=1;
您将看到y
和z
将递增,因为编译器必须评估OR的右侧以确定表达式的结果。
编辑: asaerl首先在评论中回答了您的后续问题,所以我只是稍微扩展他的正确答案。
运算符优先级确定组成表达式的部分如何绑定在一起。因为AND的优先级高于OR,所以编译器知道你写了
++x || (++y && ++z)
而不是
(++x || ++y) && ++z
这使得它的任务是在++x
和++y && ++z
之间进行OR。此时,通常可以自由选择是否“首选”首先评估一个或另一个表达式 - 按照标准 - 并且通常不能依赖于特定的顺序。此订单与运算符优先级无关。
但是,专门针对||
和&&
标准要求评估始终从左到右进行,以便短路可以正常工作,开发人员可以如果评估lhs的结果告诉我们,则不对rhs表达式进行依赖。
答案 1 :(得分:1)
在C中,除0以外的任何东西都被视为真,并且对||的评估从左到右开始。
因此编译器将检查第一个左操作数,如果为真,则编译器不会检查其他操作数。 恩。 A || B - 在这种情况下,如果A为真,则编译器将仅返回true,并且不会检查B是真还是假。但如果A为假,那么它将检查B并相应地返回意味着如果B为真则返回true或如果B为假则返回false。
在你的程序编译器中,首先检查++ x(即2),除了0以外的任何东西在C中都是真的。因此它不会检查/增加其他表达式。