ISO C++
标准(我使用的是 ISO C++17)中有详细记录,整数除以 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;
}
虽然我知道被调用函数只能检查除数是否为 0 并抛出
domain_error
或 overflow_error
,但我想知道没有预定义零除异常的可能原因是什么。
(几乎)没有任何核心语言结构会抛出异常(当然除了
throw
)。该规则的唯一例外是 new
,它可能抛出 std::bad_array_new_length
,dynamic_cast
,它明确具有抛出和非抛出形式,以及 typeid
,它可能抛出 std::bad_typeid
。
抛出异常是一项成本高昂的操作,而首先使用 C++ 的主要原因之一是性能。强制程序在每次除法时都进行空值检查然后抛出异常是没有意义的。如果有人想要,他们可以将其包装在自己的函数中以代替内置的除法运算符。
在上面列出的异常中,操作本身的成本就已经很高,因此抛出异常是可以接受的。
核心语言必须尽可能具有性能。如果需要的话,其他一切都可以在库函数中完成。