Soldan sağa ifadesini inceleyelim:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
Fark ettiğim ilk şey, üçlü operatör kullanmanın kullanılmasıdır ?. Yani alt ifade:
0xFULL ? '\0' : -1
eğer" söylediğini 0xFULLsıfırdan, dönüş olduğunu '\0'aksi takdirde -1. 0xFULLile onaltılık değişmezi olan işaretsiz uzun uzun sonek - bu tip bir onaltılık değişmezi olduğu anlamına unsigned long longçünkü, gerçekten önemli olsa değildir. 0xFDüzenli tamsayı içine sığabilir.
Ayrıca, üçlü operatör ikinci ve üçüncü terimlerin türlerini ortak türlerine dönüştürür. '\0'sonra dönüştürülür int, sadece 0.
Değeri 0xFsıfırdan çok daha büyük, bu yüzden geçiyor. İfade şimdi:
a[ 0 :>>>=a<:!!0X.1P1 ]
Sonra, :>bir digraf . Aşağıdakilere genişleyen bir yapıdır ]:
a[0 ]>>=a<:!!0X.1P1 ]
>>=imzalı sağ vardiya operatörü, adaha net hale getirmek için bunu boşluk bırakabiliriz .
Dahası, <:aşağıdakilere genişleyen bir digraftır [:
a[0] >>= a[!!0X.1P1 ]
0X.1P1bir üssü olan onaltılık bir değişmez değerdir. Ama değer ne olursa olsun, !!sıfır olmayan herhangi bir şey doğrudur. 0X.1P1bir 0.125hale gelir, böylece sıfır olmayan, aşağıdakilerden biridir:
a[0] >>= a[true]
-> a[0] >>= a[1]
>>=İmzalı sağa kaydırma operatörüdür. Sol işleneninin değerini, operatörün sağ tarafındaki değerle ileri doğru kaydırarak değiştirir. 10ikili 1010. İşte adımlar:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=a[0], bitlerinin her bir sağa kaydırıldığı her defasında sıfırdan farklı kaldığı sürece, işlemin sonucunu döndürür, döngü devam eder. Dördüncü girişim nerede a[0]olur 0, bu yüzden döngü asla girilmez.
Sonuç olarak, ?üç kez yazdırılır.