除以 0 会导致大多数 CPU 遵循某种升级过程,在该 CPU 制造商的行话中,这可能被称为异常、信号、中断、陷阱或其他任何内容。这些都没有——即使也使用了“异常”这个术语——与 C++ 语言异常有任何直接关系。
在 C++ 中,由于重复测试除以零的 CPU 周期和目标代码大小通常很昂贵,因此编译器为内置类型生成的代码不需要进行任何此类检查。在实践中,通常相信程序员会编写代码以避免被零除,在有用的除法子集中插入显式检查就足够了;考虑此类检查以避免冗余。
如果程序员想要一致的保证检查,他们可以创建一个用户定义类型(一个具有自定义重载运算符的类),它可以用来代替内置的数字类型,但需要花时间检查除以零(或下溢,溢出或开发人员所关心的任何其他问题)并根据程序员的喜好做出反应。我收集到像 JAVA 和 C# 这样的语言缺乏运算符重载,我想这意味着它们不能以这种方式轻松替换内置类型,需要更改侵入性代码来显式调用函数,而不是使用直观的数学运算符。
无论如何,由于 C++ 标准本身并没有为被零除的情况指定某些行为,因此实现可以自由地提供一些可能有用的行为(如果它选择的话)。可以想象,这可能包括以某种方式生成一个实际的 C++ 语言异常,但实际上它可能在 CPU 周期和代码大小方面过于昂贵,无法证明是合理的。也许 JAVA 实在是太慢太臃肿以至于像这样的一点额外检查既不存在也不存在......?;-)
假设您使用的是 x86 系列 CPU,除以 0 通知的术语是“中断”。但是,如果该机器运行的是 UNIX 或 Linux,则除法会在操作系统级别产生一个“信号”,您可以设置一个信号处理程序来获取问题通知。