繁体   English   中英

输出以下C程序

[英]Output of the following C program

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

这是短路评估的结果

表达式++x计算结果为2 ,编译器知道2 || anything 2 || anything结果始终为1 (“真”),不管是什么anything是。 因此,它不会进行anything评估, yz的值也不会改变。

如果你尝试

x=-1;
y=z=1;

您将看到yz 递增,因为编译器必须评估OR的右侧以确定表达式的结果。

编辑: asaerl先在评论中回答了你的后续问题,所以我会稍微扩展他的正确答案。

运算符优先级确定组成表达式的部分如何绑定在一起。 因为AND的优先级高于OR,所以编译器知道你写了

++x || (++y && ++z)

代替

(++x || ++y) && ++z

这使得它的任务是在++x++y && ++z之间进行OR。 此时,通常可以自由选择是否“首选”首先评估一个或另一个表达式 - 按照标​​准 - 并且通常不能依赖于特定的顺序。 此顺序与运算符优先级无关。

但是,特别针对|| &&标准要求评估将始终从左到右进行,以便短路可以工作,如果评估lhs的结果,开发人员可以依赖于未评估的rhs表达式。

在C中,除0之外的任何东西都被视为真,并且对||的评估 从左到右开始。

因此编译器将检查第一个左操作数,如果为true,则编译器不会检查其他操作数。 恩。 A || B - 在这种情况下,如果A为真,则编译器将仅返回true,并且不会检查B是真还是假。 但如果A为假,那么它将检查B并相应地返回意味着如果B为真则返回true或如果B为假则返回false。

在你的程序编译器中,首先将检查++ x(即2),并且在C中为0以外的任何内容都为真。因此它不会检查/增加其他表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM