考虑以下代码:
执行后,
现在轮到处理
可以用这个例子来阐明优先级和结合性的概念吗?当我第一次看到这段代码时,我真的感到很困惑。我曾经认为表达式
提前感谢您的帮助。
int a = 3;
int b = 0;
b = a > 0 ? ++b, ++a : --a, b = 0;
执行后,
b
的值变成了0
,a
的值变成了4
。这意味着条件表达式a > 0
的结果被判断为true
,并且执行了表达式a++
,同时在逗号之后也执行了表达式b = 0
。换句话说,表达式b = 0
不是三元运算符的操作数,而++b
是。否则,如果条件表达式的结果不是false
,b = 0
就不会被执行。
我的问题是:“编译器根据什么规则将b = 0
从三元运算符的操作数中剔除?”
第三个语句中的运算符包括:++
和--
,它们具有最高的优先级;>
,其次;? :
和=
,它们的优先级排在第三位;最后是优先级最低的,
。我知道具有更高优先级的运算符应该先确定它们的操作数,因此首先处理++
、--
和>
。然后,该语句等价于:b = (a > 0) ? (++b), (++a) : (--a), b = 0;
现在轮到处理
=
和 ?:
。 =
和?:
的结合方向是从右到左,所以我认为编译器将从右端解析语句。第一个遇到的运算符是=
,因此b = 0
被分组在一起。接下来遇到的操作符是,
。由于它的优先级低于当前正在分析的操作符,因此我假设编译器会跳过它。然后编译器遇到了:
,这是三元运算符的一部分,所以它继续解析。(实际上在解析整个三元运算符之前,我不知道编译器怎么能知道:
是?:
的一部分)问题出现在这里。编译器遇到的下一个运算符是,
,但编译器还没有确定?:
的操作数。逗号的优先级低于?:
。理论上应该跳过它;令人惊讶的是,在实际测试中,此时(++b)
和(++a)
已被逗号运算符连接,并且都被视为?:
的操作数。这使我感到困惑。为什么最后一个,
被忽略了,而不包含在?:
的操作数中,而在语句中的前一个,
被保留在三元运算符的操作数中呢?可以用这个例子来阐明优先级和结合性的概念吗?当我第一次看到这段代码时,我真的感到很困惑。我曾经认为表达式
b = 0
也是三元运算符的一部分;因此,只有在a>0
为false
时,b = 0
才会执行。提前感谢您的帮助。
int b;
然后++b
看起来像是未定义行为。 - gsgb
的声明。原本b
是一个具有全局作用域的变量,因此它将被初始化为0。谢谢你提醒我。 - Michael Lu