RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 618380
Accepted
Qwertiy
Qwertiy
Asked:2020-01-23 21:56:06 +0000 UTC2020-01-23 21:56:06 +0000 UTC 2020-01-23 21:56:06 +0000 UTC

什么类型的`1.`?

  • 772

在这样的 C 程序中

double x = 1;
x %= 1.;

收到错误http://ideone.com/dDurEH

二进制 % 的无效操作数(有 'double' 和'long double')

由此可知表达式1.的类型为long double。

相同的代码,但专业人士只显示double http://ideone.com/nd49YK:

二进制“operator%”的“double”和“double”类型的无效操作数

是的,这样的加号检查也适用于双http://ideone.com/HCw0GG:

auto x = 1.;

cout 
<< sizeof (double) << ' '      // 8
<< sizeof (long double) << ' ' // 12
<< sizeof x << ' '             // 8
<< sizeof 1. << endl;          // 8

事实证明,C++ 推断类型double,而不是long double。

那么,这是 C 和 C++ 之间的差异之一,还是编译器错误?
constant 的正确类型1.是什么,它是否依赖于语言?

c++
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    αλεχολυτ
    2020-01-23T22:20:32Z2020-01-23T22:20:32Z

    视图常量在 C++ 和 C 中1.都有一个类型。double

    • C

      6.4.4.2/4:无后缀的浮点常量类型为double。如果以字母 for 为后缀F,则其类型为float。如果以字母lor为后缀L,则其类型为long double。

    • C++

      2.14.4/1:浮动文字的类型是double除非由后缀明确指定。

    ideone.com 上使用的编译器是 version 5.1.1 20150711。因此,如果有人有机会的话,在本地驱动它可能是有意义的。与 goodbolt (5.1) 类似的编译器会抛出正确类型的错误:

    error: invalid operands of types 'double' and 'double' to binary 'operator%'
    error: in evaluation of 'operator%=(double, double)' 
    

    一个可能的原因在于 value FLT_EVAL_METHOD,它指定了内部操作的计算精度。对于 ideone,这个值为2,因为 使用 32 位编译器:

    对于 gcc,FLT_EVAL_METHOD == 2是 32 位 x86 上的默认设置

    那些。所有浮点计算都依赖于long double.

    虽然,事实上,这不应该影响实常量的类型。

    事实证明,您可以通过添加键将 64 位 g++ 编译器上的值FLT_EVAL_METHOD从0更改为:2-mfpmath=387

    #include <stdio.h>
    #include <float.h>
    
    int main()
    {
        // 1 % 1.;
        printf( "%d\n", FLT_EVAL_METHOD);
    }
    

    结果:

    2
    

    在这种情况下,第二个参数long double的错误消息也将类型推断为 ideone 上的原始类型(对于 32 位):

    invalid operands to binary % (have 'int' and 'long double')
    

    Clang 需要一个不同的键:-mno-sse. 在这种情况下,两种类型的诊断消息都已显示double:

    invalid operands to binary expression ('double' and 'double')
    

    同时,我觉得第一个应该还是保留的int。

    总而言之,我们可以说诊断消息中的两个编译器在推断操作数的原始类型方面都存在问题。

    • 11
  2. Vlad from Moscow
    2020-01-23T22:47:34Z2020-01-23T22:47:34Z

    浮点常量1.的类型为double。

    像这样的错误信息

    二进制 % 的无效操作数(具有“double”和“long double”

    与 C 编译器如何处理表达式中浮点操作数的转换有关。例如,编译器可能会将浮点操作数转换为范围和精度超过基础浮点类型的相应范围和精度的格式。这样做是为了在计算表达式及其复合子表达式的过程中获得更准确的结果。

    来自 C 标准(5.2.4.2.2 浮动类型的特征<float.h>)

    9 除了赋值和强制转换(去除所有额外的范围和精度)之外,具有浮动操作数的运算符产生的值和经过通常算术转换的值以及浮动常量的值被评估为范围和精度可能大于 type 的要求。评估格式的使用以 FLT_EVAL_METHOD 的实现定义值为特征:24)

    -1 不确定;0 仅根据类型的范围和精度评估所有操作和常量;

    1 将 float 和 double 类型的操作和常量计算为 double 类型的范围和精度,将 long double 操作和常量计算为 long double 类型的范围和精度;

    2 根据long double 类型的范围和精度评估所有操作和常量。

    FLT_EVAL_METHOD 的所有其他负值表征实现定义的行为。

    如果您在FLT_EVAL_METHOD定义名称的地方包含一个标头,那么您可以获得以下结果

    #include <stdio.h>
    #include <float.h>
    
    int main(void) 
    {
        printf( "%d\n",  FLT_EVAL_METHOD );
    
        return 0;
    }
    

    控制台输出:

    2
    

    从上面引用的 C 标准中可以看出,这意味着常量将被转换为 type long double。

    但是,如果不包含头文件<float.h>,编译器似乎默认使用此选项来评估浮点表达式。

    • 5
  3. Qwertiy
    2020-01-23T22:15:32Z2020-01-23T22:15:32Z

    决定通过sizeof http://ideone.com/r54ZSs进行检查:

    #include <stdio.h>
    
    int main()
    {
        printf("%d %d %d", sizeof (double), sizeof (long double), sizeof 1.);
        return 0;
    }
    

    收到8 12 8。也就是平时的这个double。

    显然,错误分析中出现了一些错误,因为只有在那里它接收到不同类型的http://ideone.com/45lztk:

    int main()
    {
        int x = 1;
        x %= 1.;         // error: invalid operands to binary % (have 'int' and 'long double')
        x %= (double)1.; // error: invalid operands to binary % (have 'int' and 'double')
        return 0;
    }
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5