我无法理解这个c编程的输出.请任何一个帮助

Sud*_*Roy 4 c

#include <stdio.h>

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

    x = y = z = 1;
    ++x || ++y && ++z;
    printf ("x = %d\t y = %d\tz = %d\n", x, y, z);
    //op  :   x = 2    y = 1  z = 1 
    //why is 'x' only incrementd? 

    x = y = z = -1;
    ++x || ++y && ++z;
    printf ("x = %d\t y = %d\tz = %d\n", x, y, z);
    //op  :  x = 0    y = 0  z = -1
    //why are 'x' and 'y' incremented?

    x = y = z = 1;
    ++x && ++y || ++z;
    printf ("x = %d\t y = %d\tz = %d\n", x, y, z);
    //op  : x = 2    y = 2  z = 1
    //why is 'x' only incrementd?

    x = y = z = -1;
    ++x && ++y || ++z;
    printf ("x = %d\t y = %d\tz = %d\n", x, y, z);
    //op  : x = 0    y = -1 z = 0
    //why are 'x' and 'z' incremented?

    //Does this incrementation depend on the value stored in the variable?
}
Run Code Online (Sandbox Code Playgroud)

Seb*_*olm 9

原因是&&||短路.

也就是说,一旦他们知道布尔表达式的最终结果是什么,他们就会停止评估.

因此,如果这样做1 || x++,则x永远不会增加,因为任何非零布尔值都是真值.

同样,如果你这样做0 && x++,x++也永远不会被执行.

也可以看看:


reg*_*fry 5

|| 和&&短路.这意味着他们尽可能少地工作以返回他们的价值,如果左侧没有确定答案,则只执行右侧.

例如:

1 || anything();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,any()将永远不会执行,因为|| 只要它评估1,就可以简单地返回; 无论what()的返回值是什么,||的返回值 在这个表达式中永远不能为0.

同理:

0 && anything_else();
Run Code Online (Sandbox Code Playgroud)

在这里,anything_else()将不会执行,因为&&已经知道它的价值永远是任何东西,但 0.

在您的示例中,++ preincrements实际上不会影响短路,除了隐藏布尔短路运算符实际做出决策的值.