c - C 中的 0/0 - gcc-7 或更高版本
问题描述
在数学上,0 / 0
是未定义的。但是,在 C 编程中(尤其是gcc
ubuntu 上的编译器 gcc-7.3.0),它产生的答案为1
. 我想知道原因。它是通过重复减法工作的吗?因为,同样的代码,如果我使用n = 1 / n
,我会得到一个浮点异常。但是,对于 gcc-5.3.0,它会产生错误。
#include <stdio.h>
int main() {
int n = 5;
n = n - 5;
switch (n) {
case 0:
printf("n= %d", n);
n = n / n;
printf("n calc= %d", n);
break;
case 5:
printf("n=5");
break;
default:
printf("n=1");
break;
}
return 0;
}
解决方案
除以零是 C 编程中未定义的行为(C11 6.5.5 §6)。这意味着没有可预测的结果,也不知道您的程序可能会做什么。
尝试解释为什么您会得到“任何事情都可能发生”的特定结果的原因并不是很有意义。它可能打印 1,它可能打印 42,它可能什么也不打印。该程序可能会崩溃和烧毁。如果您运行该程序两次,您可能会得到不同的结果。等等。
至于为什么您不会收到编译器错误,编译器无法或没有义务查找或诊断运行时错误。程序员需要避免大多数未定义行为的情况。
int x = 0/0;
如果您使用纯整数常量表达式(例如 这是程序员的工作。因此,您应该养成在应用操作数之前始终检查 or 的右操作数/
是否%
为零的习惯。
推荐阅读
- python - Python 中的多处理:有没有办法在不累积内存的情况下使用 pool.imap?
- sql - 如何为 BigQuery 标准 SQL 案例语句创建多个“THEN”子句?
- python - 使用 Python moderngl 计算 100 张图像之间的欧几里德距离的最佳方法是什么?
- java - 有什么方法可以通过反射工具获取所有类型 X 的实例
- java - Keycloak 重定向 URI 给出 https://localhost 而不是 http://localhost
- python-2.7 - 在python2.7的文件名中提取带有瑞典语ÅÄÖ的zip文件
- android - 在android中通过BLE传输图像
- python - 抓取时出错:“ValueError:请求 url 中缺少方案”
- mysql - 选择所有,除非 MYSQL 中的特定单元格值
- azure - 通过 Azure 数据工厂访问托管在私有 IP 上的 Azure VM 中的 API