C语言的短路评估
我在学习Kelley Pohl写的一本关于C的书中的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 但事实确
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
。