为什么前两个变量 (a, b) 是预递增的,而第三个变量不是 (c)?
Why the first two variables (a, b) are pre-incremented but the third one is not(c)?
我遇到了无法理解的问题。 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);
}
谢谢。
这是短路行为,是C语言故意设计的部分。
当 C 找到以下形式的表达式时:
(expression A) || (expression B)
并且表达式A被计算为TRUE
,表达式B是什么并不重要!
它可以是TRUE
,或者FALSE
,但是由于 ||
.
,整体表达式仍将是 TRUE
因此,C 语言甚至不会计算后半部分:表达式 B。该部分被跳过,因此 ++c
被跳过并且永远不会计算。
只是为了好玩,如果你想改变这个程序使 ++c
确实发生,设置 b
等于 -1
,这样当你有 ++b
, 它变成 0 (false)
.
int a = 5, b = -1, c = 0, d;
现在,表达式将这样计算:
d = (6 && 0) || [ lazy, short-circuit evaluation ];
d = 0 || [ second expression is now required! ];
d = 0 || 1;
d = 1;
输出:
6011
我遇到了无法理解的问题。 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);
}
谢谢。
这是短路行为,是C语言故意设计的部分。
当 C 找到以下形式的表达式时:
(expression A) || (expression B)
并且表达式A被计算为TRUE
,表达式B是什么并不重要!
它可以是TRUE
,或者FALSE
,但是由于 ||
.
TRUE
因此,C 语言甚至不会计算后半部分:表达式 B。该部分被跳过,因此 ++c
被跳过并且永远不会计算。
只是为了好玩,如果你想改变这个程序使 ++c
确实发生,设置 b
等于 -1
,这样当你有 ++b
, 它变成 0 (false)
.
int a = 5, b = -1, c = 0, d;
现在,表达式将这样计算:
d = (6 && 0) || [ lazy, short-circuit evaluation ];
d = 0 || [ second expression is now required! ];
d = 0 || 1;
d = 1;
输出:
6011