我遇到了一个我无法理解的问题.a的输出是6,b是-6,但无论我用什么变量初始化它,c都保持不变.
#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);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
这是短路行为,是C语言的深思熟虑的一部分.
当C找到表单的表达式时:
(expression A) || (expression B)
Run Code Online (Sandbox Code Playgroud)
并且表达式A被评估为TRUE,表达式B是什么并不重要!
它可能是TRUE,或者FALSE,但整体表达仍然是TRUE,因为||.
因此,C语言甚至不会费心去评估下半部分:表达式B.该部分只是被跳过,因此++c被跳过并且从未进行过评估.
只是为了踢,如果你想改变这个程序以便++c确实发生,那么设置b等于-1,这样当你拥有时++b,就会变成0 (false).
int a = 5, b = -1, c = 0, d;
Run Code Online (Sandbox Code Playgroud)
现在,表达式将以这种方式进行评估:
d = (6 && 0) || [ lazy, short-circuit evaluation ];
d = 0 || [ second expression is now required! ];
d = 0 || 1;
d = 1;
Run Code Online (Sandbox Code Playgroud)
输出:
6011
Run Code Online (Sandbox Code Playgroud)