Przejdźmy do wyrażenia od lewej do prawej:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
Pierwszą rzeczą, którą zauważam, jest to, że korzystamy z operatora trójskładnikowego z użycia ?
. Podwyrażenie:
0xFULL ? '\0' : -1
mówi „jeśli 0xFULL
jest niezerowe, zwróć '\0'
, w przeciwnym razie -1
. 0xFULL
jest literą szesnastkową z niepodpisanym długim sufiksem - co oznacza, że jest literą szesnastkową typu unsigned long long
. To nie ma znaczenia, ponieważ 0xF
może mieścić się w regularnej liczbie całkowitej.
Ponadto operator trójskładnikowy przekształca typy drugiego i trzeciego wyrażenia na ich wspólny typ. '\0'
jest następnie konwertowany na int
, co jest sprawiedliwe 0
.
Wartość 0xF
jest znacznie większa od zera, więc mija. Wyrażenie staje się teraz:
a[ 0 :>>>=a<:!!0X.1P1 ]
Dalej :>
jest digraf . Jest to konstrukcja, która rozwija się do ]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
jest podpisanym operatorem prawej zmiany, możemy a
to zrobić, aby było wyraźniej.
Co więcej, <:
jest to digraf, który rozwija się do [
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
jest literałem szesnastkowym z wykładnikiem wykładniczym. Ale bez względu na wartość, !!
wszystko, co nie jest zerem, jest prawdą. 0X.1P1
jest 0.125
niezerowe, więc staje się:
a[0] >>= a[true]
-> a[0] >>= a[1]
Jest >>=
to podpisany operator prawej zmiany. Zmienia wartość lewego operandu, przesuwając bity do przodu o wartość po prawej stronie operatora. 10
w formacie binarnym jest 1010
. Oto kroki:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
zwraca wynik działania, więc dopóki przesunięcie a[0]
pozostaje niezerowe za każdym razem, gdy jego bity są przesunięte o jeden w prawo, pętla będzie kontynuowana. Czwarta próba dotyczy miejsca, w którym a[0]
się znajduje 0
, więc pętla nigdy nie jest wprowadzana.
W rezultacie ?
jest drukowany trzy razy.