【问题标题】:0 divided by 0 results in 1 in g++ 10.2 [closed]0除以0在g ++ 10.2中得到1 [关闭]
【发布时间】:2021-03-16 22:26:25
【问题描述】:

以下代码在使用g++ 10.2 编译时打印gcc says: 0 / 0 equals 1

#include <iostream>

int main() {
  int a = 0;
  std::cout << "gcc says: 0 / 0 equals " << (a / a) << std::endl;
  return 0;
}

Run it on godbolt

  • 应该是这样吗? (使用 clang 编译并执行它会返回 136 - Erroneous Arithmetic Operation)。
  • 这是某种代码优化的结果吗?
  • 有没有办法让它成为错误?

编辑:使用-fsanitize=undefined 编译会使g++ 产生运行时错误。感谢@chris。

【问题讨论】:

  • 故事的寓意:未定义的行为确实是未定义的行为。 整数除以零在 C++ 中没有定义,因此编译器完全可以假定 a / a 始终为 1a 为 0 的情况在它眼里不是根本不可能的。
  • (a / a) 替换为 (a ? std::to_string(a / a) : "oopsies") 或任何你想要的失败情况。
  • 我想-fsanitize=undefined 可以在这里进行更可靠的错误检测。此外,我注意到 Godbolt 链接没有警告选项,这些选项通常擅长防止某些类别的未定义行为。
  • 这能回答你的问题吗? c++ division by 0
  • @chris,谢谢,这正是我想要的。

标签: c++ g++


【解决方案1】:

除以零是未定义的行为。编译器将继续做任何使代码运行得最快的事情。而且它甚至不会是一致的。

没有办法使这个结果导致编译器错误,因为编译器在编译时并不总是知道分母是否为 0。您必须自己进行检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多