标准(我使用的是 ISO C++17)中有详细记录ISO C++,整数除以 0 的结果是未定义的。这也可以从头中可用的预定义异常列表中排除零除异常看出<stdexcept>:
namespace std {
class logic_error;
class domain_error;
class invalid_argument;
class length_error;
class out_of_range;
class runtime_error;
class range_error;
class overflow_error;
class underflow_error;
}
Run Code Online (Sandbox Code Playgroud)
虽然我知道被调用函数只能检查除数是否为 0 并抛出domain_erroror overflow_error,但我想知道没有预定义零除异常的可能原因是什么。
(几乎)没有任何核心语言结构会抛出异常(throw当然除外)。该规则的唯一例外是newwhich may throw a std::bad_array_new_length,dynamic_cast它显式地具有抛出和非抛出形式,并且typeid它可能抛出std\xe2\x80\x8b::\xe2\x80\x8bbad_typeid。
引发异常是一项成本高昂的操作,而使用 C++ 的首要原因之一是性能。强制程序在每次除法时都进行空值检查然后抛出异常是没有意义的。如果有人想要,他们可以将其包装在自己的函数中以代替内置的除法运算符。
\n在上面列出的异常中,操作本身的成本就已经很高,因此抛出异常是可以接受的。
\n核心语言必须尽可能具有性能。如果需要的话,其他一切都可以在库函数中完成。
\n