您需要自己检查并抛出异常。在标准 C++ 中,整数除以零也不例外。浮点除/余数也不是零,但至少具有可能产生的特定有理值(例如各种NaN/Inf
值)。
中列出的例外情况[stdexcept.syn]
的部分ISO C++20
标准(本答案中使用的迭代)是:
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;
}
Now you could相当有说服力地认为overflow_error
(IEEE 754 浮点生成的无穷大将被视为溢出)或domain_error
(毕竟,这是输入值的问题)非常适合指示除以零。
然而,节[expr.mul]
特别指出(对于整数和浮点除法以及整数余数):
如果第二个操作数为/
or %
为零,行为未定义。
So, it could抛出这些(或任何其他)异常。它还可以格式化你的硬盘并嘲笑:-)
如果你想实现这样一个野兽,你可以使用类似的东西intDivEx
在以下程序中(使用溢出变体):
#include <iostream>
#include <stdexcept>
// Integer division/remainder, catching divide by zero.
inline int intDivEx (int numerator, int denominator) {
if (denominator == 0)
throw std::overflow_error("Divide by zero exception");
return numerator / denominator;
}
inline int intModEx (int numerator, int denominator) {
if (denominator == 0)
throw std::overflow_error("Divide by zero exception");
return numerator % denominator;
}
int main (void) {
int i = 42;
try {
i = intDivEx (10, 0);
} catch (std::overflow_error &e) {
std::cout << e.what() << " -> ";
}
std::cout << i << std::endl;
try {
i = intDivEx (10, 2);
} catch (std::overflow_error &e) {
std::cout << e.what() << " -> ";
}
std::cout << i << std::endl;
return 0;
}
这输出:
Divide by zero exception -> 42
5
您可以看到它抛出并捕获除以零的情况的异常(保持返回变量不变)。