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的值等于零,对吗? 但

我是编程新手。现在我正试图学习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的值等于零,对吗? 但在编译之后,我得到的答案是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

始终给出引用的部分,以便有人查找。可能重复