为什么c的值不会改变?

时间:2014-08-13 03:50:57

标签: c increment

#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?

5 个答案:

答案 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);

这解释了为什么d1

答案 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)

创建评估树,进行评估。 ||部分是父母,其中的两部分是其父母。当它评估一个孩子时,如果它成立,它就不会评估另一个孩子。