#include <stdio.h>
void main()
{
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
printf("\n %d,%d,%d,%d", a, b, c, d);
}
在上面的代码中,输出为6,-6,0,1。为什么c 0的值和d 1的值? d怎么得到这个值为1?
答案 0 :(得分:7)
这是因为||
首先检查左侧部分,如果是,则返回true而不评估右侧部分。
在C中,任何非零都被视为True,零被视为False
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
这里++ a和++ b不为零,两者都被视为True,因此++a&&++b
变为True,表达式停止在那里进行评估。
答案 1 :(得分:1)
已经有很好的答案可以解释为什么c
在行
0
d = ++a && ++b || ++c;
已执行。
该行相当于:
d = (++a && ++b || ++c);
这解释了为什么d
是1
。
答案 2 :(得分:1)
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
让我们逐个分析声明
++ a:a = 6
++ a&amp;&amp; ++ b:b变为-6,然后它变为:6&amp;&amp; -6,等于1
现在有一个|| (或符号),但这不会影响d的值,因为
1||"value2" =1
,
所以编译器不评估&#34; ++ c&#34; 。
所以c保持为0,d变为6&amp;&amp; -6 = 1
答案 3 :(得分:0)
&安培;&安培;优先级高于||所以首先评估++ a&amp;&amp; ++ b,然后它变为真。表达式变为true || ++c
和||将自从||
遇到真后从左到右进行评估,并且在不评估++ c的情况下返回1到d。所以c值不会增加
答案 4 :(得分:0)
创建评估树,进行评估。 ||部分是父母,其中的两部分是其父母。当它评估一个孩子时,如果它成立,它就不会评估另一个孩子。