prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 3.17

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 节


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管