为什么“0f”在C ++中不被视为浮点字面值?

时间:2010-10-18 17:03:43

标签: c++ syntax floating-point syntax-error notation

为什么0f在C ++中不被视为浮点文字?

#include <iostream>

using namespace std;

int main(){
  cout << 0f << endl;

  return 0;
}

编译上面给我

  

C2509(语法错误:'数字上的错误后缀')

使用VS2008。

6 个答案:

答案 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的语法相同(我认为是真的),我们有:

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)*

现在,您在浮点结尾处看到的fF已定义在FS上方。

现在让我们看一下语法来识别有效的浮点常数:

{D}+{E}{FS}?        
{D}*"."{D}+({E})?{FS}?  
{D}+"."{D}*({E})?{FS}?  

现在,如果您仔细查看,则没有可识别0f的规则。

使用rule1我们可以0e0f

使用rule2,我们可以.0f0.0f

使用rule3,我们可以0.f0.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)

这不一定是唯一的原因,但lL后缀可以应用于整数文字或浮点文字。 42L的类型为long int; 42.0L的类型为long double

必须消除带有L后缀的数字文字,以确定它是整数还是浮点数。允许F后缀本身来确定文字的类型将是不一致的并且可能令人困惑。这也会使在未来版本的语言中添加新后缀变得更加困难。