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类型引发了类似的问题.在
F和L后缀已被添加到输送型信息与浮点常量,很像L后缀确实为长整数.浮动常量的默认类型保持双倍,以便与先前的实践兼容.小写f,l也允许作为后缀.
这里是一个隐含的原因,虽然.请注意:"已添加...后缀以传递具有浮动常量的类型信息." 该标准的作者认为数字常量在到达后缀时已经明确地是整数或浮点数.后缀仅用于类别中的额外特异性,它不能将数字从一个类别翻转到另一个类别.这由实际语法(C99§6.4.4)支持,该语法首先将数字常量定义为整数常量或浮点常量,然后为每个常量定义单独的后缀类.
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我们可以拥有.0f或0.0f
使用rule3我们可以拥有0.f或0.0f
什么你的情况实际发生的是0的0f将被词法分析器作为一个整型常量消耗D和f将被消耗的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,同样的东西)是一个十进制常量,并且要求一个十进制常量是一个浮点数比要求一个整数常量是一个浮点数更有意义:)