首页 > 解决方案 > C 中的 0/0 - gcc-7 或更高版本

问题描述

在数学上,0 / 0是未定义的。但是,在 C 编程中(尤其是gccubuntu 上的编译器 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;
}

标签: cdebugging

解决方案


除以零是 C 编程中未定义的行为(C11 6.5.5 §6)。这意味着没有可预测的结果,也不知道您的程序可能会做什么。

尝试解释为什么您会得到“任何事情都可能发生”的特定结果的原因并不是很有意义。它可能打印 1,它可能打印 42,它可能什么也不打印。该程序可能会崩溃和烧毁。如果您运行该程序两次,您可能会得到不同的结果。等等。

至于为什么您不会收到编译器错误,编译器无法或没有义务查找或诊断运行时错误。程序员需要避免大多数未定义行为的情况。

int x = 0/0;如果您使用纯整数常量表达式(例如 这是程序员的工作。因此,您应该养成在应用操作数之前始终检查 or 的右操作数/是否%为零的习惯。


推荐阅读