【问题标题】:Dividing by 0 is a compiler error or a runtime error除以 0 是编译器错误或运行时错误
【发布时间】:2020-12-17 13:33:11
【问题描述】:

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

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

【问题讨论】:

  • 你是用常数0除还是用变量来产生除以零?
  • 这是未定义的行为,因此两个答案都是正确的,以及“它将正常运行”和“你会得到nasal demons
  • @Steve 这里是代码int main() { int a = 9 / 0; }
  • 编译器不必运行你的代码来指向它。解析器告诉您此代码包含除以零。尝试使用 int div = 0; int a = 9 / div;
  • 如果你写int x= 5/3;,那么通常不会在运行时进行除法

标签: c++ visual-studio compiler-errors runtime-error


【解决方案1】:

这取决于您执行除以 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。

【讨论】:

  • 可以给个参考吗?我没找到。除以文字0 是UB,而在常量表达式中它可以被明确定义,这不是很奇怪吗?
  • @idclev463035818 定义明确,不是格式正确,实际上是格式错误。那是你的问题吗?在最后加了一行解释。
  • 是的,这就是我的意思。忘记编译时没有UB,但我仍然想知道为什么不保证int a = 9 / 0;的错误有什么好处@
  • @idclev463035818 不完全确定。可能需要额外的措辞才能使这个(非常)特殊的案例格式不正确,这不值得吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多