c语言中运算符的优先级
我是编程新手。现在我正试图学习C语言中运算符的优先级。我试图分析给出的代码c语言中运算符的优先级,c,operator-precedence,C,Operator Precedence,我是编程新手。现在我正试图学习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", x, y ,z); } 所以x,y,z的值等于零,对吗? 但
#include<stdio.h>
int main()
{
int x, y, z;
x = y = z= -1;
z = ++x&&++y&&++z;
printf("x = %d y = %d z = %d", x, y ,z);
}
所以x,y,z的值等于零,对吗?
但在编译之后,我得到的答案是x=0,y=-1和z=0
有谁能帮我解决这个问题吗???在计算逻辑AND时,如果第一个表达式为零/false,则表示它不会计算剩余的表达式。所以
z = ++x&&++y&&++z; // It first increment x, due to pre-increment it becomes zero.
// so it wont evaluate the remaining expression in that equation due to Logical AND. it returns 0. (x=0,y=-1,z=-1)
// but you are assigning return value 0 to z
z=0;
请尝试以下代码段-
int x, y, z,temp;
x = y = z= -1;
temp = ++x&&++y&&++z;
printf("x = %d y = %d z = %d temp= %d", x, y ,z,temp); // Output 0,-1,-1,0
x = y = z= -1;
temp = ++x || ++y&&++z; // But in Logical OR if first expression is true means it wont execute the remaining expression
printf("x = %d y = %d z = %d temp= %d", x, y ,z,temp); // Output 0,0,-1,0
x = y = z= -1;
temp = ++x || ++y || ++z;
printf("x = %d y = %d z = %d temp= %d", x, y ,z,temp); // Output 0,0,0,0
这句话
z = ++x&&++y&&++z;
( ++x && ++y )
等价于下面的表达式
z = ( ++x && ++y ) && ++z;
根据C标准
4与按位二进制和运算符不同,&&运算符保证
从左到右评价;如果对第二个操作数求值,则
第一次和第二次评估之间的序列点
操作数如果第一个操作数比较等于0,则第二个操作数
未进行评估。
因此,首先计算++x
。它将等于0。因此,++y
将不会被评估。表情
z = ++x&&++y&&++z;
( ++x && ++y )
将等于0。因为它等于0,所以表达式(++x&&++y)和&++z
中的子表达式++z
将不会被计算
因此,z
将被分配等于0的完整表达式的值
不存在任何未定义的行为,至少因为表达式++z
不会被计算
因此,您将得到x==0、y==1和z==0(由于赋值运算符的缘故)。逻辑and>&&和逻辑OR>|从左到右求值 所以在表达式的求值中
z=++x&&++y&&++z//它计算++x,然后它变为0,所以下一个++y和++z不计算,所以现在在赋值之前x=0,y=-1和z=-1,z在赋值之后变为0
始终给出引用的部分,以便有人查找。可能重复