문제를 푸는 도중에 아래와 같은 코드를 사용하였습니다. solve라는 함수에서 b라는 전역변수를 1로 고치고 0을 리턴한다고 할때 당연히 ans1의 결과와 ans2의 결과가 1이 나올줄 알았는데 ans1의 결과는 0이 나오고 ans2의 결과는 1이 나왔습니다. 
즉, 저의 예상과는 다르게 solve()가 실행되고 + b가 실행된 것이 아니라 + b가 실행되고 동작을 한 것 같은데요.

이와 같은 상황이 발생한 이유가 컴파일러의 최적화 때문인가요? 만약 최적화 때문이라고 하면 저런 식으로 글로벌 변수가 값이 바뀌지 않을 것이라 마음데로 가정하고 최적화를 진행한 컴파일러의 잘못인가요? 아니면 c++에서는 덧셈 연산의 순서를 보장하지 않는가요? 

doju   7달 전

기본적으로 연산자 및 함수의 인자들 사이에서의 실행 순서는 명시되어 있지 않습니다(unspecified).

http://en.cppreference.com/w/cpp/language/eval_ord...
http://stackoverflow.com/questions/7112282/order-o...

여담으로 minGW-W64 5.2.0, g++ 4.8.4 버전으로 테스트해 봤는데 둘 다 1이 반환되네요.

koosaga   7달 전

1. 컴파일러 최적화는 표준 안에서 진행되어야 하며 만약에 말씀하신 것이 표준으로 지켜져 있던 거라면 컴파일러의 버그가 맞습니다

2. 표준에 연산 순서가 명시되어 있는지는 http://en.cppreference.com/w/cpp/language/operator... 같은 자료를 참조하시면 도움이 될거 같습니다. 전 귀찮아서 저 자료를 읽지도 않았고 더 찾아보지도 않았습니다.

3. 실수로라도 저런 코드를 아주 짜지 않는 것이 최선임은 명확합니다. 애매한 표현을 쓰고 싶다면 그에 따른 책임( = c++ 표준 달달 외우기..) 을 모두 져야 합니다. 

모두 좋은 답변 감사합니다!

댓글을 작성하려면 로그인해야 합니다.