一行代码

时间:2016-02-13 16:23:28

标签: c operators logical-operators

我在Stack Overflow上搜索这个问题的答案,但我还没有找到确切的答案。我想出了这段代码。我知道操作符应该如何工作但我不理解它们在这类问题中。例如,在第一种情况下,如果我使用zy++y++z如何仍为1?

#include <stdio.h>

int main(void) {
    int x, y, z;

    x = y = z = 1;
    ++x || ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = 1;
    ++x && ++y || ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = 1;
    ++x && ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x && ++y || ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x || ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    x = y = z = -1;
    ++x && ++y && ++z;
    printf("x = %d y = %d z = %d\n", x, y, z);

    return 0;
}

结果我得到了:

x = 2 y = 1 z = 1
x = 2 y = 2 z = 1
x = 2 y = 2 z = 2
x = 0 y = -1 z = 0
x = 0 y = 0 z = -1
x = 0 y = -1 z = -1

3 个答案:

答案 0 :(得分:3)

这是对逻辑表达式求值的结果:一旦确定表达式为假(或为真),就不再评估剩余的运算符。 E.g:

++x || ++y && ++z;

由于x为1,表达式将为true,与zy无关,因此++y++z不再执行。

答案 1 :(得分:2)

由于优先级规则,第一个示例中的表达式与(&amp;&amp;&amp;&quot;的优先级高于||)相同:

++x || ( ++y && ++z ) ;

因此,我们选择了运营商||及其两个操作数++x( ++y && ++z )。从左到右对此运算符进行求值,因此首先计算++x。 但是这个运算符也会短路,这意味着如果第一个操作数的计算结果为true,就像++x那样,则第二个操作数( ++y && ++z )不会被评估。

答案 2 :(得分:0)

原因是你使用了||和&amp;&amp;。

&安培;&安培;和||运营商的短路评估,即&amp;&amp; amp;如果第一个操作数的计算结果为false,则永远不会计算第二个操作数,因为结果始终为false。同样,对于||如果第一个操作数的结果为真,则永远不会操作第二个操作数。

单&符号&#34;&amp;&#34;可以说是&#34; bit-wise AND&#34;操作员和双&符&#34;&amp;&amp;&#34;可以被称为&#34;逻辑和&#34;操作

例如,在这一行: ++ x || ++ y&amp;&amp; ++ Z者除外; x为1,因此++ x的布尔值为true。因为你用了||陈述&#34; ++ y&amp;&amp; ++ž&#34;根本不运行,y和z的值为1.

如果您将使用&amp;和|该值将增加到2。