所以,我正在写一些代码,我在程序的一个部分中获得了意外的输出,这破坏了整个系统 .
我设法将问题提取并简化为基本的逻辑表达式 . 让我们说:
int i = 1, j = 1, k = 0;
printf("%d\n", ++i || ++j && k);
printf("%d, %d, %d\n", i, j, k);
return 0;
该程序的输出是:
1
2
1
0
由于 ||
运算符的短路特性,我认为 j
的值没有增加到 2
. 但是我很困惑第一个 "%d"
的值是 1
. 对于 &&
语句, k
的值是否应该为非零以返回 1
?或者根本不执行此语句,因为 ++i || ++j
不是 0
因此返回 1
?
- 我知道
&&
是逻辑的,如果expr1 && expr2的值为 both 非零,则expr1 && expr2的值为1 .
任何澄清将不胜感激,请原谅这个问题的基本性质 .
4 回答
来自C标准(6.5.14逻辑OR运算符)
这个表达
相当于
并且根据标准的引用,表达式返回整数值1,因为
++i
不等于零 . 不评估子表达式( ++j && k )
.运算符优先级 .
&&
的优先级高于||
.你的表达式与:
++i || (++j && k)
相同++i
是TRUE
,不再评估括号 .&&
的优先级高于||
. (见https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B)所以是
和
||
shortcircuits如果第一个运算符是真的,根据6.5.14p4 .如果您使用
gcc
或clang
并使用-Wall
编译代码,编译器将轻推您将这些括号放在那里 . 听取这些建议可能是一个好主意,因为有些人会被优先级混淆(我听说) .++i || ++j && k
被评估为1(真)因为i等于2(1),因为短路而不评估(j && k) .