关于C++中assignment-expression语法合规性的疑问(附代码实例)
为啥
Test t = c?a:b = 1;是合法的? 哎,这个问题其实是运算符优先级和C++语法规则的细节搞混啦!我来给你掰扯清楚~
首先你可能搞错了运算符优先级:赋值运算符=的优先级比条件运算符?:要低,所以编译器会把c?a:b = 1解析成c ? a : (b = 1),而不是你以为的(c?a:b) = 1——这是关键的第一步!
接下来对照C++的语法规则拆解:
- 先看括号里的
b = 1:这是一个完全合法的assignment-expression,符合logical-or-expression assignment-operator initializer-clause的语法——b是primary-expression(属于logical-or-expression的底层分支),=是赋值运算符,1是合法的initializer-clause。 - 然后整个
c ? a : (b = 1)是一个conditional-expression,而根据C++标准里assignment-expression的定义,conditional-expression本身就是assignment-expression的合法形式之一(assignment-expression的第一个选项就是conditional-expression)。 - 所以整个
c?a:b = 1作为初始化器的assignment-expression是完全合法的,编译器的判定自然没问题。
反过来,如果真的是(c?a:b) = 1,那才会非法——因为这里条件表达式的结果是int类型的右值,不能被赋值。但实际编译器解析的是前者,所以完全符合规则。
内容的提问来源于stack exchange,提问作者xmh0511
相关产品推荐
相关产品推荐

