Esaminiamo l'espressione da sinistra a destra:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
La prima cosa che noto è che stiamo usando l'operatore ternario dall'uso di ?. Quindi la sottoespressione:
0xFULL ? '\0' : -1
sta dicendo "se 0xFULLè diverso da zero, return '\0', altrimenti -1. 0xFULLè un letterale esadecimale con il suffisso long-long senza segno - il che significa che è un letterale esadecimale di tipo unsigned long long. Ciò non ha molta importanza, perché 0xFpuò rientrare in un intero normale.
Inoltre, l'operatore ternario converte i tipi del secondo e terzo termine nel loro tipo comune. '\0'viene quindi convertito in int, che è giusto 0.
Il valore di 0xFè molto più grande di zero, quindi passa. L'espressione ora diventa:
a[ 0 :>>>=a<:!!0X.1P1 ]
Successivamente, :>è un digrafo . È un costrutto che si espande per ]:
a[0 ]>>=a<:!!0X.1P1 ]
>>=è l'operatore di spostamento a destra firmato, possiamo distanziarlo aper renderlo più chiaro.
Inoltre, <:è un digrafo che si espande a [:
a[0] >>= a[!!0X.1P1 ]
0X.1P1è un letterale esadecimale con un esponente. Ma non importa il valore, il valore !!di qualsiasi cosa diversa da zero è vero. 0X.1P1è 0.125che è diverso da zero, quindi diventa:
a[0] >>= a[true]
-> a[0] >>= a[1]
Il >>=è l'operatore spostamento a destra firmato. Cambia il valore dell'operando di sinistra spostando i suoi bit in avanti del valore sul lato destro dell'operatore. 10in binario è 1010. Quindi, ecco i passaggi:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=restituisce il risultato del suo funzionamento, quindi finché lo spostamento a[0]rimane diverso da zero per ogni volta che i suoi bit vengono spostati a destra di uno, il loop continuerà. Il quarto tentativo è dove a[0]diventa 0, quindi il ciclo non viene mai inserito.
Di conseguenza, ?viene stampato tre volte.