为什么0f
在C ++中不被视为浮点文字?
#include <iostream>
using namespace std;
int main(){
cout << 0f << endl;
return 0;
}
编译上面给我
C2509(语法错误:'数字上的错误后缀')
使用VS2008。
答案 0 :(得分:22)
如果有明确说明此设计决定的理由,那么它将出现在C99“基本原理”文档中(C ++从C中逐字复制所有这些内容而不重新考虑它)。但事实并非如此。这就是关于'f'后缀的所有内容:
§6.4.4.2浮动常量
与现有实践一致,定义了一个浮点常量 输入
double
。由于C89允许表达式仅包含float
操作数 要在float
算术而不是double
中执行, 表达明确的float
常量是可取的。long double
类型 提出了类似的问题。已添加
F
和L
后缀以传达类型信息 浮点常量,就像L
后缀对长整数一样。默认 浮动常数的类型保持双倍,以便与先前的实践兼容。 小写f
和l
也可以作为后缀。
但 是隐含的原因。请注意:“已添加...后缀以传递具有浮动常量的类型信息。”该标准的作者认为数字常量为已经在到达后缀时明确地是整数或浮点数。后缀仅用于类别中的额外特异性,它不能将数字从一个类别翻转到另一个类别。这由实际语法(C99§6.4.4)支持, first 将数字常量定义为整数常量或浮点常量,然后定义单独的类每个后缀。
答案 1 :(得分:20)
假设C ++用于浮点常量的语法与C的语法相同(我认为是真的),我们有:
获取的一些快捷方式的定义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
的规则。
使用rule1我们可以0e0f
使用rule2,我们可以.0f
或0.0f
使用rule3,我们可以0.f
或0.0f
在你的情况下实际发生的是0
0f
将被词法分析器用作整数常量D
并且f
将被用作FS
令牌。现在,当解析看到D
后跟FS
且没有匹配规则时,它会发出错误:
error: invalid suffix "f" on integer constant
答案 2 :(得分:15)
因为0是整数常量。
编辑:codepad.org(假设g ++)给出的错误消息可能更容易理解。 “错误:整数常量上的无效后缀”f“”。 “0.f”将起作用,因为0.(或0.0,同样的东西)是一个十进制常量,并且要求一个十进制常量是一个浮点数比要求一个整数常量为浮点数更有意义:)
答案 3 :(得分:11)
因为您需要0.0f
。
答案 4 :(得分:3)
以下是“因为”:如果带有int
后缀的f
常量自动转换为float
,则0x0f
将不明确。
答案 5 :(得分:0)
这不一定是唯一的原因,但l
或L
后缀可以应用于整数文字或浮点文字。 42L
的类型为long int
; 42.0L
的类型为long double
。
必须消除带有L
后缀的数字文字,以确定它是整数还是浮点数。允许F
后缀本身来确定文字的类型将是不一致的并且可能令人困惑。这也会使在未来版本的语言中添加新后缀变得更加困难。