在编写C++应用程序时,我发现我不能使用f
后缀(例如3f
(,因为Visual Studio向我显示了以下错误:"未找到文字运算符";。当然,当我使用.f
后缀(例如3.f
(时,问题就消失了。为什么?
以下是标准中的规则:
floating-point-literal:
decimal-floating-point-literal
hexadecimal-floating-point-literal
decimal-floating-point-literal:
fractional-constant exponent-part-opt floating-point-suffix-opt
digit-sequence exponent-part floating-point-suffix-opt
fractional-constant:
digit-sequence-opt . digit-sequence
digit-sequence .
exponent-part:
e sign-opt digit-sequence
E sign-opt digit-sequence
floating-point-suffix: one of
f l F L
如您所见,如果没有指数部分,.
必须始终包含在十进制浮点常量中。
K&R书将其解释为:
浮点常量包含小数点(123.4(或指数(1e-2(,或两者都包含;除非加后缀,否则它们的类型为double。后缀f或f表示浮点常量;l或l表示长双。
因此,我们的想法是,f
或l
将已经存在的浮点常量(double
(修改为float
或long double
的类型。后缀本身不会使非浮点常量变为浮点常量。
为什么不能在整数后面直接使用'f'文字?
如果允许f
后缀在形成整数的文本之后成为浮点,则十六进制整数/浮点将出现问题
0x1.23f // this is a float
0x1p23f // this is a float
0x123f // If this now a float? No, it remains an integer.
f
后缀从默认值double
更改浮点文字的类型。在C中,f
或F
后缀不会使浮点文字,而是使浮点常量。