【发布时间】:2021-03-28 18:19:53
【问题描述】:
整数除以零是未定义的,应该会导致浮点异常,这就是我编写以下代码的原因
int j = 0 ;
int x = 1 / j;
在这种情况下,程序只是与 FPE 一起崩溃,但如果我不使用变量并且将使用像这样的文字值 int x = 1 / 0; 程序不会崩溃,而只是为 x 分配一些随机值!我试图通过添加自定义SIGFPE 处理程序来检测int x = 1 / 0; 是否真的导致崩溃,但我认为它在字面零除法期间从未被调用,但是当我首先将0 存储在变量中时它确实如此。因此,似乎字面上的零除法实际上从未使程序崩溃(我的意思是除法本身永远不会发生),在这种情况下,编译器(在我的情况下为 GCC)执行任何技巧(例如,用随机数替换 0) ?还是我误解了什么?
【问题讨论】:
-
使用浮点数,整数除以零是UB,因此编译器没有义务发出任何信号
-
1 / 0可能不是在运行时完成,而是由编译器完成。它的值是未定义的。 -
MS Visual C 发出 编译器 错误:除以零或取模。
-
不,未定义就是未定义。
-
这种未定义行为与所有其他未定义行为有何不同?