输出以下代码

时间:2013-08-17 16:11:06

标签: c operators

#include<stdio.h>
int main()
{
int i=-3,j=2,k=0,m;
m= ++i && ++j || ++k;
printf("%d %d %d %d",i,j,k,m);
return 0;
}

有人能说出m的评估方式。我很困惑,因为k如何保持'0'

5 个答案:

答案 0 :(得分:4)

m= ++i && ++j || ++k;

首先,++i && ++j生效,i变为-2j变为3,这使得++i && ++j非零,所以{由于短路,{1}}将被评估为m(true)。所有后面的表达式(1)都不会被执行。

答案 1 :(得分:2)

m= (    (++i) && (++j)   ) || ++k;
          |        |       
          |        |       
   (   T (-2) AND T(3)   ) OR something
      ^^^^^^^^^^^^^^^^^
              T            OR something
              ^^^^^^^^^^^^^^^^^^^^^^^^^        
                       = T
                       = 0

更改j=-1

m= (    (++i) && (++j)   ) || ++k;
          |        |       
          |        |       
   (   T (-2) AND T(0)   ) OR something
      ^^^^^^^^^^^^^^^^^
              F            OR T (0)      //++k evaluated
              ^^^^^^^^^^^^^^^^^^^^^^^^^        
                       = T
                       = 0

答案 2 :(得分:2)

初始值:
int i=-3,j=2,k=0,m;

原文:
m= ++i && ++j || ++k;

隐含运算符优先级:
m= (++i && ++j) || ++k;

表达式从左到右进行评估。您需要了解的是Short Circuit Logic的工作原理。

评估演练:

  1. i会增加(-3 --> -2

  2. 评估逻辑AND运算符(&&)。它检查左手参数i是否评估为truei!=0)。如果左侧评估为false,则和运算符会短路评估并返回false0)。这不会发生,因为i==-2,因此右侧(++j)也会被评估。

  3. j增加(2 --> 3

  4. Logical AND完成右侧评估i!=0 && j!=0。它返回true!0)。

  5. 评估逻辑OR运算符(||)。它检查左手参数(++i && ++j)是否评估为true!0)。如果左侧评估为true,则和运算符会短路评估并返回true!0)。发生这种情况是因为++i && ++j已经评估过true。结果k++永远不会执行!

  6. 逻辑OR(||)将评估值(!0)分配给m。表达式求值后m!=0

答案 3 :(得分:1)

这是因为短路。如果你知道如何评估OR表达式,你将得到这个表达式的悬念。 1 OR Anything is always 1

int i=-3,j=2,k=0,m;
m= ++i && ++j || ++k;

`-2 && +3 is +1 therefore +1 OR anything is 1.` Hence C skips evaluation of k.

答案 4 :(得分:1)

答案是

-2 3 0 1

说明:

这里有两个基本事实

事实1:

每当有一个带有PRE-INCREMENT运算符的表达式时,所有这些运算符都将首先对相应的变量进行操作,然后使用更新的变量值来计算整个表达式。

FACT 2

每当存在具有OR运算符的表达式时,如果第一运算符为真(或在某些情况下为非零),则不执行第二运算符。 例如

   a=2;
   b=2;
   c=3;
   boolean k = c || a+b ;

变量k的值为真,表达式“a + b”甚至不被视为c非零。

在你的情况下,变量i和j将首先递增,表达式将是

 -2 && 3 || ++k 

注意:变量k不会在此处递增,因为在OR逻辑运算符的情况下,Left操作数将首先完全求解。 然后左操作数将为TRUE,因为-2和3都不为零。

因此整个表达式将是

  TRUE || ++k  

这不会被进一步评估,因为无论如何,结果总是为真。

因为我们将此结果(TRUE)分配给整数变量,所以它将是1.

因此答案是......