考虑以下代码:
int a = 3;
int b = 0;
b = a > 0 ? ++b, ++a : --a, b = 0;
执行后,我得到b
to become 的值和 to become的0
值。
这意味着条件表达式的结果,被评估为并且表达式已被执行,而后面的表达式也已被执行。换句话说,表达式不是三元运算符的操作数,while是。否则,将不会执行,因为条件表达式未评估为.a
4
a > 0
true
a++
b = 0
,
b = 0
++b
b = 0
false
我的问题是“编译器根据什么规则踢出b = 0
三元运算符的操作数?”
第三条语句中的运算符包括:++
和--
,具有最高优先级,>
,具有第二大优先级,? :
和=
,具有第三大优先级和,
最低优先级。我知道优先级较高的运算符应该更早地确定它们的操作数,以便首先处理++
,--
和>
。那么语句等价地是:
b = (a > 0) ? (++b), (++a) : (--a), b = 0;
现在,=
轮到?:
处理了。=
和?:
is的结合性right-to-left
,所以我认为编译器会从右端解析语句。遇到的第一个运算符 is=
和 sob = 0
组合在一起。第二个遇到的运算符是,
。由于它的优先级低于当前正在分析的运算符,我假设编译器会跳过它。然后编译器遇到了:
,它是三元运算符的一部分,所以一直解析。(其实我不知道编译器在解析整个三元运算符之前怎么知道它:
是一部分)问题来了。编译器遇到的下一个运算符是,但编译器尚未完成确定操作数的操作数?:
,
?:
然而。的,
优先级低于?:
。理论上应该跳过;令人惊讶的是,在实际测试中,此时(++b)
和(++a)
已经被运算符连接起来,,
并且都被认为是 的操作数?:
。这让我很困惑。为什么最后一个,
被忽略并且不包含?:
在前一个,
in 语句的操作数中,而保留在三元运算符的操作数中?
有人可以用这个例子澄清优先级和关联性的概念吗?第一次看到这段代码时,我对执行结果感到非常困惑。我原以为表达式b=0
也是三元运算符操作数的一部分;因此b = 0
只会在a > 0
is时执行false
。
提前致谢。