除以0是编译器错误或运行时错误

团杜安:

我是C ++的新手。我听说除以0会导致运行时错误,但是当我尝试运行时,它抛出了编译器错误C2124并且未创建目标文件,因此编译器会在创建之前自动运行代码以查看其是否可执行一个目标文件?(我正在使用Visual Studio社区)

int main() { int a = 9 / 0; }
cigien:

这取决于您用0除的上下文。如果在仅需要在运行时对表达式求值的上下文中进行操作,则它是未定义的行为:

void f() {
  int a = 9 / 0;  // UB
}

请注意,UB意味着任何事情都可能发生,包括编译器注意到代码有错误,并拒绝对其进行编译。实际上,当您将常数除以0时,编译器可能至少会发出警告。

如果它发生在constexprconsteval上下文中,则行为是明确定义的,并且要求编译器不编译代码:

constexpr void f() {
  int a = 9 / 0;  // error, never produces a valid result
}

要么

void f() {
  constexpr int a = 9 / 0;  // error
}

这样做的主要原因是,所有行为在编译时都已定义好,因此在这些上下文中没有UB。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章