왼쪽에서 오른쪽으로 표현을 봅시다.
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
내가 주목하는 첫 번째는의 사용에서 삼항 연산자를 사용하고 있다는 것입니다 ?. 하위 표현식 :
0xFULL ? '\0' : -1
" 0xFULL0이 아닌 경우 return '\0', 그렇지 않으면 -1. 0xFULL는 부호없는 긴 접미사 가있는 16 진수 리터럴입니다 unsigned long long. 즉 , 형식의 16 진수 리터럴입니다 . 0xF일반 정수 안에 들어갈 수 있기 때문에 실제로 중요하지 않습니다 .
또한 삼항 연산자는 두 번째 및 세 번째 항의 유형을 공통 유형으로 변환합니다. '\0'다음으로 변환됩니다 int단지 인 0.
값 0xF이 0보다 크므로 통과합니다. 이제 표현은 다음과 같습니다.
a[ 0 :>>>=a<:!!0X.1P1 ]
다음 :>은 digraph 입니다. 다음으로 확장되는 구조입니다 ].
a[0 ]>>=a<:!!0X.1P1 ]
>>=부호가있는 오른쪽 시프트 연산자 a입니다. 더 명확하게하기 위해 간격을 둘 수 있습니다.
또한 다음과 같이 <:확장되는 digraph입니다 [.
a[0] >>= a[!!0X.1P1 ]
0X.1P1지수가있는 16 진 리터럴입니다. 그러나 가치에 관계없이 !!0이 아닌 것은 사실입니다. 0X.1P1인 0.125은가되도록 0이 아닌, 어느 :
a[0] >>= a[true]
-> a[0] >>= a[1]
는 >>=서명 오른쪽 시프트 연산자입니다. 연산자 오른쪽의 값만큼 비트를 앞으로 이동하여 왼쪽 피연산자의 값을 변경합니다. 10이진수로입니다 1010. 단계는 다음과 같습니다.
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=a[0]비트가 1 씩 오른쪽으로 시프트 될 때마다 시프트 가 0이 아닌 한, 루프는 계속 작동하므로 연산 결과를 리턴합니다 . 네 번째 시도는 where a[0]가 0되어 루프가 입력되지 않습니다.
결과적으로 ?세 번 인쇄됩니다.