Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以下C程序的输出_C - Fatal编程技术网

以下C程序的输出

以下C程序的输出,c,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值是如何不增加的。这是一个错误的结果 表达式++x的计算结果为2,编译器知道2 | |任何东西的计算结果总是为1,

这个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 | |任何东西的计算结果总是为1,无论它是什么。因此,它不会继续计算任何内容,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表达式。

在C中,除0以外的任何事物都被视为真,对| |的求值从左到右开始

因此,编译器将检查左第一个操作数,如果为真,则编译器将不检查其他操作数。 例如,A | | B-在这种情况下,如果A为真,那么编译器将只返回真,而不会检查B是否为真。但是如果A为false,那么它将检查B并相应地返回。如果B为true,那么它将返回true;如果B为false,那么它将返回false


在您的程序中,编译器将首先检查++xi.e 2,并且C中除0以外的任何内容都为真。因此,它不会检查/递增其他表达式。

谢谢您的帮助,但优先级顺序在这里起作用了吗?这意味着应该先计算++y&&++z,然后再计算| |?否。优先级是解析的顺序,而不是计算的顺序。顺便说一句,如果对++z进行了评估,则为UB。将z更改为两个可能重复的