输出以下C程序

kri*_*ang 3 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;
}
Run Code Online (Sandbox Code Playgroud)

给定的输出是:x = 2 y = 1 z = 1
我理解x的输出,但是没有看到y和z值如何不增加.

Jon*_*Jon 12

这是短路评估的结果.

表达式++x求值为2,并且编译器知道2 || anything总是求值为1("true"),无论是什么anything.因此,它不会进行评估,也不会改变anything值.yz

如果你尝试

x=-1;
y=z=1;
Run Code Online (Sandbox Code Playgroud)

你会看到,yz 要增加,因为编译器必须评估OR的右手边,以确定表达式的结果.

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

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

++x || (++y && ++z)
Run Code Online (Sandbox Code Playgroud)

代替

(++x || ++y) && ++z
Run Code Online (Sandbox Code Playgroud)

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

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

  • 编号优先顺序是解析顺序,而不是评估顺序.顺便说一句,如果评估了`++ z`,那就是UB.(改变`z`两次) (4认同)