2013-02-05 65 views
0

可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)神秘浮点异常

我的朋友和我都搞乱一轮苦思最差的,我们能想到的循环(所以不要告诉我这是可怕的代码,因为它应该是!)。

我的朋友想出了这个for循环:

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

它看起来确定,但它失败甚至是第一次进入由于浮点异常。 所以我的第一个念头是模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(其中细RAN)到if语句再次抛出浮点异常:

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

我完全失去了这一点。任何人有任何想法这里发生了什么?

+0

我什至不是什么。 –

+1

http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-i-i-i-i-i-etc – chris

+0

如果您将&更改为&&,会发生什么? – Thalia

回答

3

它出错了i++ & ++i&运算符不会对其操作数进行排序,因此在两侧添加增量会导致未定义的行为。顺便说一下,它可能是除零除外,但不一定来自FPU。

1

一般来说,在C和C++的单个表达式中混合使用这样的多个增量操作是一个坏主意,因为它通常会导致未定义的行为。有了未定义的行为,神秘地改变行为并不令人惊讶。

另一方面,Java为所有算术和逻辑运算(非fpstrict表达式中的浮点指数精度除外)提供了严格的规范。您可以将所有这些内容放入Java中(忽略int不再是有效的布尔表达式),并让它们给出一致的答案,尽管它可能不是您所期望的。