代码之家  ›  专栏  ›  技术社区  ›  Agnel Kurian

为什么C++中的“0F”不被当作浮点文字?

  •  14
  • Agnel Kurian  · 技术社区  · 14 年前

    0f 在C++中作为浮点文字处理?

    #include <iostream>
    
    using namespace std;
    
    int main(){
      cout << 0f << endl;
    
      return 0;
    }
    

    编译上面的代码给了我

    使用VS2008。

    6 回复  |  直到 13 年前
        1
  •  22
  •   zwol    14 年前

    如果有一个明确的理由,这个设计决定,它将在C99“理性”文件(C++复制所有这些东西从C逐字而不重新考虑它)。但事实并非如此。这就是关于“f”后缀所说的一切:

    §6.4.4.2浮动常数

    与现有实践一致,浮点常量被定义为 类型 double . 因为C89只允许包含 float 操作数 演出地点 浮动 算术而不是 双重的 ,一种方法 表达明确 常数是可取的。这个 long double 类型 提出了类似的问题。

    这个 F L 添加了后缀以传递类型信息 浮动常数,很像 后缀用于长整数。违约 浮动常数的类型保持为双精度,以便与以前的实践兼容。 小写 f l 也可以用作后缀。

    在那里 不过,这是一个隐含的原因。请注意措辞:“the。。。添加后缀是为了传递带有浮动常量的类型信息 已经 当你得到后缀的时候,它是明确的整数或浮点。后缀只用于类别内的特殊性,它不能将数字从一个类别翻转到另一个类别。这是由实际语法(C99第6.4.4节)支持的 第一 将数值常量定义为整数常量或浮动常量,然后定义 分离

        2
  •  20
  •   codaddict    14 年前

    假定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 .

    0e0f

    使用规则2我们可以 .0f 0.0f

    使用规则3我们可以 0.f 0.0华氏度

    0 属于 将被词法分析器作为整型常量使用 D f 将作为 四季酒店 然后 四季酒店 如果没有匹配规则,则会显示错误:

    error: invalid suffix "f" on integer constant
    
        3
  •  15
  •   Dakota Hawkins    14 年前

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

        4
  •  11
  •   Oliver Charlesworth    14 年前

    因为你需要 0.0f .

        5
  •  3
  •   TonyK    13 年前

    给你一个“因为”:如果 int 常数与 f 后缀自动转换为 float ,然后 0x0f 会模棱两可。

        6
  •  0
  •   Keith Thompson    10 年前

    l L 42L 属于类型 long int ; 42.0L long double .

    必须消除后缀的歧义才能确定它是整数还是浮点。允许 F 后缀本身决定文字的类型是不一致的,可能会造成混淆。这也使得在将来的语言版本中添加新的后缀更加困难。

    推荐文章