c中运算符的优先级

时间:2014-07-31 10:53:41

标签: 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);
     }

在学习了算子优先级之后,我理解一元算子具有更高的偏好。所以在上面的代码中

 z = ++0&&++0&&++0;

所以x,y,z的值等于零,对吧? 但是在编译之后我得到了答案,因为x = 0,y = -1且z = 0。

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

在评估逻辑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

答案 1 :(得分:2)

此表达式

z = ++x&&++y&&++z;

等同于以下表达式

z = ( ++x && ++y ) && ++z;

根据C标准

  

4与按位二进制&amp;操作员,&amp;&amp;运营商保证   从左到右的评价;如果评估第二个操作数,则有   第一个和第二个的评估之间的序列点   操作数。 如果第一个操作数比较等于0,则第二个操作数   没有评估。

首先评估++x。它将等于0.因此不会评估++y。表达

( ++x && ++y )

将等于0.因为它等于0,所以表达式++z中的子表达式( ++x && ++y ) && ++z将不会被评估。

因此z将被赋予等于0的完整表达式的值。

至少没有任何未定义的行为,因为不会评估表达式++z

所以你会得到x == 0,y == -1和z == 0(由于赋值运算符)。

答案 2 :(得分:0)

从左到右评估逻辑AND &amp;&amp; 和逻辑OR ||

所以在评估表达式

z = ++x&&++y&&++z;//it evaluates ++x and it becomes 0 so next ++y and ++z are not evaluated so now before assignment x=0,y=-1 and z=-1 and z becomes 0 after assignment