2013-02-05 3 views
0

가능한 중복 :
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)신비한 부동 소수점 예외

내 친구와 나는 그렇게하지 않는다 (우리가 생각할 수있는 루프 최악을 마련하려고 라운드 쌓여 있었다 그것이 있어야하기 때문에 이것은 끔찍한 코드라고 말해줘!).

내 친구가 루프이 함께했다 :

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 
} 

을하지만, 다시 괴상 얻는다 : 첫 번째 경우는 두 번째 경우는하지 않습니다 잘 실행됩니다. 당신은 if 문에 (미세 실행 한) ? 0 : 1의 경우를 넣을 경우 다시 부동 소수점 예외가 발생합니다 :

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-etc – chris

+0

&를 &&로 변경하면 어떻게됩니까? – Thalia

답변

3

i++ & ++i에 잘못되었습니다. & 연산자는 피연산자의 순서를 지정하지 않으므로 양쪽에 증가분을 지정하면 정의되지 않은 동작이 발생합니다.

그건 그렇고, 그것은 0으로 나누기 예외 일 것이지만 반드시 FPU에서 나오는 것은 아닙니다.

1

일반적으로 정의되지 않은 동작이 발생하기 때문에 C 및 C++의 단일 식에서 여러 증가 연산자를 혼합하는 것은 좋지 않습니다. 정의되지 않은 행동으로, 물건을 신비하게 행동을 바꾸는 것은 당연한 일이 아닙니다.

Java는 반면에 모든 산술 및 논리 연산에 엄격한 사양을 제공합니다 (비 fpstrict 표현식의 부동 소수점 지수 정밀도 제외). 이 모든 것을 Java에 넣을 수 있습니다 (int가 더 이상 유효한 부울식이 아니라는 사실은 무시하십시오). 그리고 기대 한 바가 아니더라도 일관된 답을 줄 수 있습니다.