我最近决定满足我长期以来的好奇心。 在 C 中除以零时会发生什么? 我一直只是用逻辑来避免这种情况,但很好奇像 C 这样不能抛出可捕获异常的语言如何处理这种情况。
这是我非常简单的测试(在 Windows 10 上使用 GCC 编译):
int main()
{
double test1 = 1.0/0.0;
printf( "%f", test1 );
int test2 = 1/0;
printf( "%d", test2 );
}
使用
double
类型完成的操作给了我一个可爱的小指示,表明结果不是数字:1.#INF00
。到目前为止一切都很好..
但是,当使用
int
类型执行除以零时,程序就“停止工作”了。我在 Windows 上运行这个程序,所以我收到了那个可爱的对话框的提醒。
我对这种行为很好奇。为什么让程序崩溃是整数除以零的选择解决方案?难道真的没有其他解决方案,比如类似于
double
的方式来处理除以零吗?每个编译器(或者只是 GCC)上都有相同的行为吗?
除以零会调用未定义的行为。当调用未定义行为时,任何事情都可能发生。
引自 ISO 国际 C 编程语言标准,草案 N1570“6.5.5 乘法运算符”:
5 / 运算符的结果是第一个操作数除以 第二; % 运算符的结果是余数。在这两个操作中,如果 第二个操作数为零,行为未定义。
引自 N1570 3. 术语、定义和符号:
3.4.3
1 未定义的行为 使用不可移植或错误的程序构造或错误数据时的行为, 本国际标准对此没有提出要求
2 注意 可能的未定义行为包括完全忽略情况和不可预测的情况 结果,在翻译或程序执行过程中以记录的方式表现 环境(有或没有发出诊断消息),终止翻译或 执行(发出诊断消息)。
这是未定义的行为。
C11 §6.5.5 乘法运算符
运算符的结果是第一个操作数除以第二个操作数所得的商;/
运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为未定义。
%
c 中未定义整数除以零的行为。因此输出可以取决于任何东西,包括编译器。本质上,这是因为没有特定的位模式来表示整数类型的无穷大。
浮点除以零被定义:并且应该返回浮点的无穷大的最佳表示。