You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:22:30