C警告:双除以零

新手上路,请多包涵

情况1:

 #include <iostream>

int main()
{
    double d = 15.50;
    std::cout<<(d/0.0)<<std::endl;
}

它编译时没有任何警告并打印 inf 。好的,C++ 可以处理除以零,( 现场观看)。

但,

案例二:

 #include <iostream>

int main()
{
    double d = 15.50;
    std::cout<<(d/0)<<std::endl;
}

编译器给出以下警告( 现场查看):

 warning: division by zero [-Wdiv-by-zero]
     std::cout<<(d/0)<<std::endl;

为什么编译器会在第二种情况下给出警告?

0 != 0.0

编辑:

 #include <iostream>

int main()
{
    if(0 == 0.0)
        std::cout<<"Same"<<std::endl;
    else
        std::cout<<"Not same"<<std::endl;
}

输出:

 Same

原文由 Jayesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 469
2 个回答

浮点除以零 由 IEEE 明确定义 并给出无穷大(根据分子的值是正数还是负数(或 NaN 为 ±0) )。

对于整数,无法表示无穷大,并且语言将操作定义为具有 未定义的行为,因此编译器会帮助您尝试引导您远离该路径。

但是在这种情况下,由于分子是 double ,除数( 0 )也应该提升为双精度,并且没有理由在不发出警告的情况下在这里发出警告对于 0.0 所以我认为这是一个编译器错误。

原文由 Motti 发布,翻译遵循 CC BY-SA 4.0 许可协议

在标准 C++ 中,这两种情况都是 未定义的行为。任何事情都可能发生,包括格式化您的硬盘。您不应期望或依赖“return inf. Ok”或任何其他行为。

编译器显然决定在一种情况下而不是另一种情况下发出警告,但这并不意味着一种代码可以,而另一种则不行。这只是编译器生成警告的一个怪癖。

来自 C++17 标准 [expr.mul]/4:

二进制 / 运算符产生商,二进制 % 运算符产生第一个表达式除以第二个表达式的余数。 如果 /% 的第二个操作数为零,则行为未定义。

原文由 M.M 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题