c++ - 神秘的浮点异常

标签 c++ floating-point-exceptions

<分区>

Possible Duplicate:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

我和我的 friend 正忙着想出我们能想到的最糟糕的 for 循环(所以不要告诉我这是糟糕的代码,因为它本该如此!)。

我的 friend 想出了这个 for 循环:

for (int i = 0; i++ & ++i % (++i % 2) ? --i : i++; i++);

看起来没问题,但由于 float 异常,即使是第一次也无法进入。 所以我的第一个想法是模除以 0。但它似乎并没有,因为如果你这样做,它运行良好:

for (int i = 0; i < 100; i++) {
    i++ & ++i % (++i % 2);
}

但这不会:

for (int i = 0; i < 100; i++) {
    i++ & ++i % (++i % 2) ? --i : i++;
}

但它变得陌生了。第一种情况运行良好,第二种情况不会:

for (int i = 0; i < 100; i++) {
    i++ & ++i % (++i % 2) ? 0 : 1;
}

for (int i = 0; i < 100; i++) {
    i++ & ++i % (++i % 2) ? 1 : 0; // 1 and 0 switched
}

所以现在我对发生的事情真的很困惑,但它又变得更奇怪了。如果你把大小写放在 中? 0 : 1 (运行良好)进入 if 语句,它再次抛出浮点异常:

for (int i = 0; i < 100; i++) {
    if (i++ & ++i % (++i % 2) ? 0 : 1);
}

我完全迷失了。有人知道这里发生了什么吗?

最佳答案

i++ &++i 处出错。 & 运算符不对其操作数进行排序,因此在两边都增加一个增量会导致未定义的行为。

顺便说一下,它可能是除以零的异常,但不一定来自 FPU。

关于c++ - 神秘的浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14700477/

相关文章:

c++ - 为什么内置类型和类在不使用时会受到不同对待?

php - php中相近的数字相减

C++变量数据被覆盖

c++ - 调用 SendInput() 会导致意外行为

c++ - 如何阻止内存泄漏?

c++ - 如何在启动时隐藏鼠标指针?

c++ - VS2015 与 VS2013 中的不同优化导致浮点异常

c++ - Visual Studio C++ 2008/2010 - 浮点 NaN 中断

c - 没有 float 或 double 变量的浮点异常