pichulia   9년 전

pair<int, int> x;
x.first ^= x.second ^= x.first ^= x.second;


위의 코드는 pair변수인 x의 first와 second 값을 서로 교환하는 평범한 코드입니다.


근데 위의 코드를 C++로 채점했을 땐 오답이 뜨고

C++11로 채점했을 땐 정답이 뜨는 현상이 생겼는데요...

그 말은 C++ 4.6.3버젼 컴파일러에서는 저 위의 함수가

원하는대로가 아니라, 기묘하게 동작함을 의미하는거 일테지요....


int형이나 char 변수가 아닌 float 등은 저 ^= swap이 안먹힌다는건 이미 알고있었는데 (컴파일에러를 띄워주니까)

pair 자료구조도 안먹힌다는건 처음 알았습니다...

원인이 무엇일까요?

wookayin   9년 전

pair<int, int> 도, int 두개도, 모두 엄밀하게는 안됩니다. 이 코드는 undefined behavior 라서 그렇습니다..
C++11에서 sequence point에 대한 스펙 개정이 생겼는데, 이 때문에 컴파일러 구현 방식이 바뀌어서 동작이 달라지는 것으로 추정할 수 있겠네요.

http://stackoverflow.com/questions/28782068/undefi... 를 보면 자세한 설명이 나와있으니 참고하세요. (실행되는 순서에 따라 어떻게 값이 변하는지)
http://stackoverflow.com/questions/20842602/swappi... 도 도움이 될것 같네요.

한줄요약 : XOR SWAP 같은거 쓰는거 아닙니당..

pichulia   9년 전

앗 저럴수가...실행순서에 저런 함정이 있었다니.. 놀라운 사실 하나 배워가네요


하지만 ^=^=^= 은 애정입니다.

습관화되서... gcd 계산을 하는 한, 앞으로도 계속 쓸꺼같네요ㅋㅋㅋㅋ

wookayin   9년 전

위에서 쓰면 안된다고 설명드렸는데 왜 계속 쓰시려고 하시나요.. (..)

std::swap(x, y); 보다 타이핑도 오래걸리고 가독성도 구리고 심지어 연산속도도 느린데.. 전혀 쓸 이유가 없지않나요?

pichulia   9년 전

구제의 길이 있습니다. gcd함수를 짤 때 while문에 중괄호를 안써도 되게 만들어주죠...

gcd(p,q){while(p%q)q^=p^=q^=p%=q; return q;}

사실 이게 유일한 장점...아니 장점이라고 해야하나 이걸....

wookayin   9년 전

You're fired (ㅋㅋㅋㅋㅋㅋ)

pichulia   9년 전

으앙 해고당함 ㅠㅅㅜ

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