#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'
答案 0 :(得分:4)
m= ++i && ++j || ++k;
首先,++i && ++j
生效,i
变为-2
,j
变为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的工作原理。
评估演练:
i
会增加(-3 --> -2
)
评估逻辑AND运算符(&&
)。它检查左手参数i
是否评估为true
(i!=0
)。如果左侧评估为false
,则和运算符会短路评估并返回false
(0
)。这不会发生,因为i==-2
,因此右侧(++j)
也会被评估。
j
增加(2 --> 3
)
Logical AND完成右侧评估i!=0 && j!=0
。它返回true
(!0
)。
评估逻辑OR运算符(||
)。它检查左手参数(++i && ++j)
是否评估为true
(!0
)。如果左侧评估为true
,则和运算符会短路评估并返回true
(!0
)。发生这种情况是因为++i && ++j
已经评估过true
。结果k++
永远不会执行!
逻辑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.
因此答案是......