Q我有一些代码,其中包含诸如
a ? b = c : d之类的表达式,有些编译器接受它,但有些则不接受。
A在语言的原始定义中,=的优先级低于?:,因此早期编译器往往会卡在上面的表达式上,试图将其解析为好像是这样写的:
(a ? b) = (c : d)然而,由于它没有其他合乎逻辑的含义,后来的编译器允许了这个表达式,并将其解释为好像隐含了一个内部括号集:
a ? (b = c) : d这里,左侧操作数是=简单地是b,而不是无效的a ? b。事实上,ANSI/ISO C 标准中指定的语法实际上要求这种解释。(标准中的语法不是基于优先级的,它规定任何表达式都可以出现在?和:符号之间。)
像问题中的表达式一样,ANSI 编译器可以完全接受,但如果你必须在旧编译器下编译它,你可以随时添加显式的内部括号。
参考文献:K&R1 第 2.12 节,第 49 页
ISO 第 6.3.15 节
Rationale 第 3.3.15 节