#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)
|| 和&&短路.这意味着他们尽可能少地工作以返回他们的价值,如果左侧没有确定答案,则只执行右侧.
例如:
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实际上不会影响短路,除了隐藏布尔短路运算符实际做出决策的值.