Vamos passar pela expressão da esquerda para a direita:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
A primeira coisa que noto é que estamos usando o operador ternário do uso de ?
. Então a subexpressão:
0xFULL ? '\0' : -1
está dizendo "se 0xFULL
for diferente de zero, retorne '\0'
, caso contrário -1
. 0xFULL
é um literal hexadecimal com o sufixo longo não assinado - o que significa que é um literal hexadecimal do tipo unsigned long long
. Isso realmente não importa, porque 0xF
pode caber dentro de um número inteiro regular.
Além disso, o operador ternário converte os tipos do segundo e do terceiro termos no tipo comum. '\0'
é então convertido para int
, o que é justo 0
.
O valor de 0xF
é muito maior que zero, então passa. A expressão agora se torna:
a[ 0 :>>>=a<:!!0X.1P1 ]
Em seguida, :>
é um dígrafo . É uma construção que se expande para ]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
é o operador de turno certo assinado, podemos separá-lo a
para torná-lo mais claro.
Além disso, <:
é um dígrafo que se expande para [
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
é um literal hexadecimal com um expoente. Mas não importa o valor, o valor !!
de qualquer coisa que não seja zero é verdadeiro. 0X.1P1
é 0.125
que é diferente de zero, então ele se torna:
a[0] >>= a[true]
-> a[0] >>= a[1]
O >>=
é o operador de turno certo assinado. Ele altera o valor do seu operando esquerdo, deslocando seus bits para a frente pelo valor no lado direito do operador. 10
em binário é 1010
. Então, aqui estão as etapas:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
retorna o resultado de sua operação, desde que o deslocamento a[0]
permaneça diferente de zero para cada vez que seus bits forem deslocados para a direita em um, o loop continuará. A quarta tentativa é ondea[0]
fica 0
, então o loop nunca é inserido.
Como resultado, ?
é impresso três vezes.