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é 0xF
può 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 a
per 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.125
che è 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. 10
in 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.