-5
#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”感到困惑

4

5 回答 5

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

首先,++i && ++j生效,i成为-2j成为3,这使得++i && ++j非零,因此m1因为短路而被评估为(真)。后面的所有表达式(++k)都不会被执行。

于 2013-08-17T16:14:29.543 回答
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
于 2013-08-17T16:30:23.807 回答
2

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

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

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

表达式从左到右计算。您需要了解的是短路逻辑的工作原理。

评估演练:

  1. i递增 ( -3 --> -2)

  2. 对逻辑 AND 运算符求值 ( &&)。它检查左侧参数的i计算结果是否为true( i!=0)。如果左侧计算结果为false,则 and 运算符将计算短路并返回false( 0)。这不会发生,因为i==-2, 所以右手边(++j)也被评估。

  3. j递增 ( 2 --> 3)

  4. 逻辑与完成右手边的求值i!=0 && j!=0。它返回true( !0)。

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

  6. 逻辑或 ( ||) 将评估值 () 分配!0mm!=0在表达式计算之后。

于 2013-08-17T16:33:05.553 回答
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.
于 2013-08-17T16:17:59.633 回答
1

答案是

-2 3 0 1

解释 :

这里有两个基本事实

事实 1:

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

事实 2

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

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

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

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

 -2 && 3 || ++k 

注意:变量 k 不会在这里增加,因为在 OR 逻辑运算符的情况下,左操作数将首先被完全解决。左操作数将是 TRUE,因为 -2 和 3 都不是零。

所以整个表达式是

  TRUE || ++k  

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

当我们将此结果 (TRUE) 分配给一个整数变量时,它将是 1。

因此答案是......

于 2013-08-17T16:45:47.293 回答