C语言的短路评估

C语言的短路评估,c,operators,logical-operators,short-circuiting,C,Operators,Logical Operators,Short Circuiting,我在学习Kelley Pohl写的一本关于C的书中的C,有一个练习我不懂: int a = 0, b = 0, x; x = 0 && (a = b = 777); printf("%d %d %d\n", a, b, x); x = 777 || (a = ++b); printf("%d %d %d\n", a, b, x); 他们只是说想象输出并将其与真实输出进行比较。我以为输出会是 77777770 778 778 1 但事实确

我在学习Kelley Pohl写的一本关于C的书中的C,有一个练习我不懂:

int a = 0, b = 0, x;

x = 0 && (a = b = 777);
printf("%d %d %d\n", a, b, x);
x = 777 || (a = ++b);
printf("%d %d %d\n", a, b, x);
他们只是说想象输出并将其与真实输出进行比较。我以为输出会是

77777770

778 778 1

但事实确实如此

0 0 0

01


&&
运算符使用。如果
&&
运算符的任一侧为
false
,则整个表达式为
false

C检查运算符左侧的真值,在您的情况下为
0
。由于
0
在c中为false,因此永远不会计算操作的右侧表达式
(a=b=777)

第二种情况类似,只是如果左侧表达式返回
true
,则
|
返回
true
。还要记住,在c语言中,任何不是
0
的东西都被认为是
true

希望这有帮助。

来自C标准(6.5.13逻辑与运算符)

3如果两个操作数比较,&&运算符应产生1 不等于0;否则,它将产生0。结果的类型为int

4与按位二进制和运算符不同,&&运算符保证 从左到右评价;如果对第二个操作数求值,则 第一次和第二次评估之间的序列点 操作数如果第一个操作数比较等于0,则第二个操作数 未计算操作数。

在这个表达式语句中

x = 0 && (a = b = 777);
第一个操作数的比较值等于0。因此不计算第二个操作数,即变量
a
b
的值不变。因此,变量
x
将根据本节第3段设置为
0

来自C标准(6.5.14逻辑或运算符)

3如果| |运算符的任何一个操作数进行比较,则| |运算符应产生1 不等于0;否则,结果为0。结果为int类型

4与按位|运算符不同,| |运算符保证 从左到右评价;如果对第二个操作数求值,则 第一次和第二次评估之间的序列点 操作数。If第一个操作数与第二个操作数的比较不等于0 未计算操作数。

在这个表达式语句中

x = 777 || (a = ++b);
第一个操作数的比较结果不等于0。因此不计算第二个操作数,即变量
a
b
的值不变。。因此,变量
x
将根据本节第3段设置为
1

如果要更改表达式中操作数的顺序,请执行以下操作:

x = (a = b = 777) && 0;
x = (a = ++b) || 777;

你得到了预期的结果。

答案就在你问题的标题中。什么让你困惑?你对短路评估的理解是什么?你是对的对不起,我的英语不好,所以我没有真正理解维基百科。感谢EveryonRelated:需要记住的其他关键事项是赋值的优先级很低(只有逗号运算符较低),并且
a | | b
的计算结果为
0
1