Reprenons l'expression de gauche à droite:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
La première chose que je remarque, c'est que nous sommes à l'aide de l'opérateur ternaire de l'utilisation de ?
. Si la sous-expression:
0xFULL ? '\0' : -1
est-disant "si 0xFULL
est non-nul, le retour '\0'
, sinon, -1
. 0xFULL
est une hexadécimal littérale avec le unsigned long long suffixe - sens, c'est une hexadécimal littéral de type unsigned long long
. Qui n'a pas vraiment d'importance, parce qu' 0xF
peut s'adapter à l'intérieur d'un régulier entier.
Aussi, l'opérateur ternaire convertit les types de la deuxième et troisième termes de leur type. '\0'
est ensuite convertie en int
, ce qui est juste 0
.
La valeur de 0xF
est plus grand que zéro, de sorte qu'il passe. L'expression devient alors:
a[ 0 :>>>=a<:!!0X.1P1 ]
Ensuite, :>
est un digraphe. C'est une construction qui permet de ]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
est la signature de l'opérateur de décalage à droite, nous pouvons espace de a
pour la rendre plus claire.
De plus, en <:
est un digraphe qui s'étend à l' [
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
est une hexadécimal littérale avec un exposant. Mais peu importe la valeur, l' !!
de tout ce qui est non-nulle est vraie. 0X.1P1
est 0.125
qui est non-nul, de sorte qu'il devient:
a[0] >>= a[true]
-> a[0] >>= a[1]
L' >>=
est la signature de l'opérateur de décalage à droite. Il modifie la valeur de son opérande de gauche en déplaçant ses bits de l'avant par la valeur de l'exploitant du côté droit. 10
en binaire est - 1010
. Donc, voici les étapes:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
retourne le résultat de son opération, tant et aussi longtemps que de changer de a[0]
reste non nul de tous les temps ses bits sont décalés à droite par un, la boucle continue. La quatrième tentative est où a[0]
devient 0
, de sorte que la boucle n'est jamais entré.
En conséquence, ?
est imprimé trois fois.