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

Dividing by 0 is a compiler error or a runtime error

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

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

这取决于您除以 0 的上下文。如果您在仅 需要 在 run-time 处计算表达式的上下文中执行此操作,那么它就是未定义的行为:

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

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

如果它发生在 constexprconsteval 上下文中,则行为是 well-defined,并且要求编译器不编译代码:

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

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

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