주의: undefined behavior를 다룹니다.
#include <iostream>
using namespace std;
int main()
{
int a = 4;
a = !(bool&)a;
cout << a;
}
g++(8.3.1) output: 5
reinterpret 을 통해 a를 bool로 해석하게 했고, bool은 1 또는 0으로 표현됩니다
(bool이므로 컴파일러는 다른 표현이 없다고 가정합니다)
이때 1을 0으로, 0을 1로 바꾸는 가장 빠른 방법은 ^= 1이므로, 컴파일러는 a = a^1 로 처리합니다.
reinterpret cast는 ub이므로, -O0 이더라도 동일한 결과를 출력합니다.
- a == false와 동일합니다
- a == true는 volatile든 뭐든 무조건 제거됩니다. int a = 4; cout << ((bool&)a == true); 는 4를 출력합니다.
'흑마법' 카테고리의 다른 글
정수를 컨테이너로 사용하기 (0) | 2022.08.06 |
---|