#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”感到困惑
m= ++i && ++j || ++k;
首先,++i && ++j
生效,i
成为-2
和j
成为3
,这使得++i && ++j
非零,因此m
将1
因为短路而被评估为(真)。后面的所有表达式(++k
)都不会被执行。
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
初始化值:
int i=-3,j=2,k=0,m;
原文表达:
m= ++i && ++j || ++k;
使用隐式运算符优先级:
m= (++i && ++j) || ++k;
表达式从左到右计算。您需要了解的是短路逻辑的工作原理。
评估演练:
i
递增 ( -3 --> -2
)
对逻辑 AND 运算符求值 ( &&
)。它检查左侧参数的i
计算结果是否为true
( i!=0
)。如果左侧计算结果为false
,则 and 运算符将计算短路并返回false
( 0
)。这不会发生,因为i==-2
, 所以右手边(++j)
也被评估。
j
递增 ( 2 --> 3
)
逻辑与完成右手边的求值i!=0 && j!=0
。它返回true
( !0
)。
对逻辑 OR 运算符求值 ( ||
)。它检查左侧参数的(++i && ++j)
计算结果是否为true
( !0
)。如果左侧计算结果为true
,则 and 运算符将计算短路并返回true
( !0
)。发生这种情况是因为++i && ++j
已经评估了true
. 结果k++
永远不会执行!
逻辑或 ( ||
) 将评估值 () 分配!0
给m
。m!=0
在表达式计算之后。
这是因为短路。如果你知道 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.
答案是
-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。
因此答案是......