除以 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 时,编译器可能至少会发出警告。
如果它发生在 constexpr
或 consteval
上下文中,则行为是 well-defined,并且要求编译器不编译代码:
constexpr void f() {
int a = 9 / 0; // error, never produces a valid result
}
或
void f() {
constexpr int a = 9 / 0; // error
}
主要原因是 所有 行为在编译时定义良好,因此在这些上下文中没有 UB。
我是 C++ 新手。我听说除以 0 会导致 运行 时间错误,但是当我尝试它时,它抛给我一个编译器错误 C2124 并且没有创建目标文件,因此编译器会自动 运行在创建目标文件之前查看它是否可执行的代码? (顺便说一句,我正在使用 Visual studio 社区)
int main() { int a = 9 / 0; }
这取决于您除以 0 的上下文。如果您在仅 需要 在 run-time 处计算表达式的上下文中执行此操作,那么它就是未定义的行为:
void f() {
int a = 9 / 0; // UB
}
请注意,UB 意味着任何事情都可能发生,包括编译器注意到代码有错误,并拒绝对其进行编译。实际上,当您将常量除以 0 时,编译器可能至少会发出警告。
如果它发生在 constexpr
或 consteval
上下文中,则行为是 well-defined,并且要求编译器不编译代码:
constexpr void f() {
int a = 9 / 0; // error, never produces a valid result
}
或
void f() {
constexpr int a = 9 / 0; // error
}
主要原因是 所有 行为在编译时定义良好,因此在这些上下文中没有 UB。