输出以下C程序

时间:2012-05-03 13:47:18

标签: c

这个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值如何不增加。

2 个答案:

答案 0 :(得分:12)

这是short-circuit evaluation的结果。

表达式++x求值为2,编译器知道2 || anything始终求值为1(“true”),无论anything是什么。因此,它不会继续评估anythingyz的值也不会更改。

如果您尝试

x=-1;
y=z=1;

您将看到yz 递增,因为编译器必须评估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中都是真的。因此它不会检查/增加其他表达式。