以下C程序的输出
这个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,
#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更改为两个可能重复的