흑마법

!(bool&)a

프로필사진
fienestar
2023. 9. 21. 15:42

주의: 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