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 0xFULLjest niezerowe, zwróć '\0', w przeciwnym razie -1. 0xFULLjest literą szesnastkową z niepodpisanym długim sufiksem - co oznacza, że jest literą szesnastkową typu unsigned long long. To nie ma znaczenia, ponieważ 0xFmoż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ść 0xFjest 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 ato zrobić, aby było wyraźniej.
Co więcej, <:jest to digraf, który rozwija się do [:
a[0] >>= a[!!0X.1P1 ]
0X.1P1jest literałem szesnastkowym z wykładnikiem wykładniczym. Ale bez względu na wartość, !!wszystko, co nie jest zerem, jest prawdą. 0X.1P1jest 0.125niezerowe, 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. 10w 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.