我最近决定满足我的好奇心。 当你在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?
答案 0 :(得分:3)
除以零会调用未定义的行为。 未定义的行为被调用时会发生任何事情。
引自N1570 6.5.5乘法运算符:
5 /运算符的结果是第一个操作数除以的商 第二; %运算符的结果是余数。在这两个操作中,如果值为 第二个操作数为零,行为未定义。
来自N1570的引用3.术语,定义和符号:
3.4.3
1个未定义的行为 在使用不可移植或错误的程序结构或错误数据时, 本国际标准没有要求
2 注意可能的未定义行为包括完全忽略不可预测的情况 结果,在翻译或程序执行过程中以文件化的方式表现 环境(有或没有发出诊断信息),终止翻译或 执行(发出诊断信息)。
答案 1 :(得分:2)
这是未定义的行为。
C11§6.5.5乘法运算符
/
运算符的结果是第一个操作数除以第二个操作数的商;%
运算符的结果是余数。 在两个操作中,如果第二个操作数的值为零,则行为未定义。
答案 2 :(得分:1)
整数除以零的行为在c中是未定义的。所以输出可以依赖于任何东西,包括编译器。基本上这是因为没有特定的位模式来表示整数类型的无穷大。
定义浮点除以零:并且应该返回浮点的无穷大的最佳表示。