왼쪽에서 오른쪽으로 표현을 봅시다.
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
내가 주목하는 첫 번째는의 사용에서 삼항 연산자를 사용하고 있다는 것입니다 ?
. 하위 표현식 :
0xFULL ? '\0' : -1
" 0xFULL
0이 아닌 경우 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
되어 루프가 입력되지 않습니다.
결과적으로 ?
세 번 인쇄됩니다.