我现在正在学习编程语言(BNF,扫描仪等),C中的十六进制浮点常数需要指数似乎很奇怪。
根据C99标准,
§6.4.4.2浮动常数
hexadecimal-floating-constant:
hexadecimal-prefix hexadecimal-fractional-constant
binary-exponent-part floating-suffix[opt]
hexadecimal-prefix hexadecimal-digit-sequence
binary-exponent-part floating-suffix[opt]
编写一个扫描器可以很容易地解析带有可选指数的十六进制浮点常量。为什么C标准使十进制浮点的指数可选,十六进制浮点需要?
答案 0 :(得分:7)
C99 Rationale第6.4.4.2节
中介绍了这一点C99的新功能: C99添加了十六进制表示法,因为它更多 清楚地表达了浮动常数的重要性。该 binary-exponent部分是必需的,而不是可选的 十进制表示法,以避免由
f
后缀导致的歧义 被误认为是十六进制数字。
例如,1.0f
是float
类型的十进制浮点常量,但0x1.0f
不明确,必须写为0x1.0p0f
。
出于同样的原因,指数由p
而不是e
引入,因为e
是有效的十六进制数字。