为什么在C++中,0f
不被视为浮点字面量?
#include <iostream>
using namespace std;
int main(){
cout << 0f << endl;
return 0;
}
编译上述代码出现以下错误:
C2509(语法错误:数字后缀无效)
使用VS2008。
为什么在C++中,0f
不被视为浮点字面量?
#include <iostream>
using namespace std;
int main(){
cout << 0f << endl;
return 0;
}
编译上述代码出现以下错误:
C2509(语法错误:数字后缀无效)
使用VS2008。
假设C++用于浮点常量的语法与C相同(我认为是正确的),我们有:
一些快捷方式的定义来自ANSI C grammar
D [0-9]
L [a-zA-Z_]
H [a-fA-F0-9]
E [Ee][+-]?{D}+
FS (f|F|l|L)
IS (u|U|l|L)*
现在你看到浮点数结尾处的f
或F
是在上方定义的FS
中定义的。
现在让我们看一下语法,以识别有效的浮点常量:
{D}+{E}{FS}?
{D}*"."{D}+({E})?{FS}?
{D}+"."{D}*({E})?{FS}?
现在如果你仔细看,就会发现没有规则能够识别0f。error: invalid suffix "f" on integer constant
因为 0 是一个整数常量。
编辑:codepad.org(假设是g ++)给出的错误消息可能更容易理解。 "error: invalid suffix" f "on integer constant"。 "0.f" 将起作用,因为 0. (或 0.0,同样的事情)是一个十进制常量,并且要求将十进制常量转换为浮点数比要求将整数常量转换为浮点数更有意义 :)
因为你需要 0.0f
。
f
后缀的 int
常量自动转换为 float
,那么 0x0f
就会存在歧义。p+EXP
或 p-EXP
后缀的情况下,0x
后缀已经被视为强制整数(即 0x0.0
是语法错误);虽然尾数是十六进制,但指数是十进制,因此 0x0.0p+0f
没有歧义。然而,这仍然是一个很好的观点,可能已经存在于委员会成员的思想中。 - zwol这不是唯一的原因,但可以将l
或L
后缀应用于整数或浮点文字。 42L
为long int
类型; 42.0L
为long double
类型。
带有L
后缀的数字文字必须进行歧义消解,以确定其是整数还是浮点数。仅凭F
后缀来确定文本的类型可能会出现不一致和潜在的混淆。这也会使将来语言版本中添加新的后缀变得更加困难。