【问题标题】:C Integer Behavior: Dividing by Zero [duplicate]C整数行为:除以零[重复]
【发布时间】:2016-06-04 12:20:57
【问题描述】:

我最近决定满足我长期以来的好奇心。 在 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?

【问题讨论】:

  • 我会向你推荐这个答案stackoverflow.com/questions/3004095/… 不幸的是我想说这基本上是重复的......
  • GCC OSX 10.7.5:警告main.c:6: warning: division by zero打印输出inf0CLANG OSX 10.7.5:main.c:6:18: warning: division by zero is undefined [-Wdivision-by-zero] int test2 = 1/0;打印输出inf0
  • 我不明白反对意见。
  • 我也不知道!我标记为重复,请原谅!
  • 我没有投反对票,但我对此表示同情。在问这里之前你至少环顾了一下?

标签: c division zero


【解决方案1】:

除以零会调用未定义的行为。当未定义的行为被调用时,任何事情都可能发生。

引用N1570 6.5.5 乘法运算符:

5 / 运算符的结果是第一个操作数除以 第二; % 运算符的结果是余数。在这两种操作中,如果 第二个操作数为零,行为未定义。

引自 N1570 3. 术语、定义和符号:

3.4.3

1 未定义的行为 行为,在使用不可移植或错误的程序构造或错误数据时, 本国际标准对此没有要求

2 注意 可能的未定义行为包括完全无视情况和不可预测 结果,在翻译或程序执行期间以文件的方式表现 环境(无论是否发出诊断消息),终止翻译或 执行(发出诊断消息)。

【讨论】:

    【解决方案2】:

    这是未定义的行为。

    C11 §6.5.5 乘法运算符

    / 运算符的结果是第一个操作数除以第二个操作数的商; % 运算符的结果是余数。 在这两种操作中,如果第二个操作数的值为零,则行为未定义。

    【讨论】:

      【解决方案3】:

      整数除以零的行为在 c 中未定义。所以输出可以依赖于任何东西,包括编译器。本质上这是因为没有特定的位模式来表示整数类型的无穷大。

      定义了浮点除以零:并且应该返回浮点对无穷大的最佳表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 1970-01-01
        • 2016-11-06
        • 1970-01-01
        相关资源
        最近更新 更多