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

Agn*_*ian 15 c++ floating-point syntax syntax-error notation

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

#include <iostream>

using namespace std;

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

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译上面的内容给了我

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

使用VS2008.

zwo*_*wol 22

如果有明确说明这个设计决定的原因,它将在C99​​"理由"文件中(C++从C中逐字复制所有这些东西而不重新考虑它).但事实并非如此.这就是关于'f'后缀的所有内容:

§6.4.4.2浮动常数

与现有实践一致,浮点常量定义为具有类型double.由于C89允许仅包含float操作数的表达式在float算术中执行而不是double,float因此需要表达显式常量的方法.该long double类型引发了类似的问题.

FL后缀已被添加到输送型信息与浮点常量,很像L后缀确实为长整数.浮动常量的默认类型保持双倍,以便与先前的实践兼容.小写f,l也允许作为后缀.

这里一个隐含的原因,虽然.请注意:"已添加...后缀以传递具有浮动常量的类型信息." 该标准的作者认为数字常量在到达后缀时已经明确地是整数或浮点数.后缀仅用于类别中的额外特异性,它不能将数字从一个类别翻转到另一个类别.这由实际语法(C99§6.4.4)支持,该语法首先将数字常量定义为整数常量或浮点常量,然后为每个常量定义单独的后缀类.

  • +1.这是唯一真正提供了这一决定背后可能的理由的答案. (3认同)

cod*_*ict 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)*
Run Code Online (Sandbox Code Playgroud)

现在,f或者F您在浮点结束时看到的是FS上面定义的.

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

{D}+{E}{FS}?        
{D}*"."{D}+({E})?{FS}?  
{D}+"."{D}*({E})?{FS}?  
Run Code Online (Sandbox Code Playgroud)

现在,如果你仔细看到,没有任何规则可以识别0f.

使用rule1我们可以拥有 0e0f

使用rule2我们可以拥有.0f0.0f

使用rule3我们可以拥有0.f0.0f

什么你的情况实际发生的是00f将被词法分析器作为一个整型常量消耗Df将被消耗的FS令牌.现在,当解析看到a D后跟FS没有匹配规则时,它会发出错误:

error: invalid suffix "f" on integer constant
Run Code Online (Sandbox Code Playgroud)


Dak*_*ins 15

因为0是整数常量.

编辑:codepad.org(假设g ++)给出的错误消息可能更容易理解."错误:整数常量上的无效后缀"f""."0.f"将起作用,因为0.(或0.0,同样的东西)是一个十进制常量,并且要求一个十进制常量是一个浮点数比要求一个整数常量是一个浮点数更有意义:)

  • @Vulcan Eager:为什么真的重要?它的重要性在于为什么要索引你使用[]而不是<>的数组,或者为什么程序的入口点是一个名为`main`而不是`StartHere`的函数.没有为什么超出*'cos标准如此* (11认同)
  • @Dakota,这正是我添加“f”后缀以强制编译器将其视为浮点数的原因。 (2认同)

Oli*_*rth 11

因为你需要0.0f.