考虑以下代码:
int a = 3;
int b = 0;
b = a > 0 ? ++b, ++a : --a, b = 0;
执行后,我得到bto become 的值和 to become的0值。
这意味着条件表达式的结果,被评估为并且表达式已被执行,而后面的表达式也已被执行。换句话说,表达式不是三元运算符的操作数,while是。否则,将不会执行,因为条件表达式未评估为.a4a > 0truea++b = 0 ,b = 0++bb = 0false
我的问题是“编译器根据什么规则踢出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 > 0is时执行false。
提前致谢。