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 0xFULL
sıfırdan, dönüş olduğunu '\0'
aksi takdirde -1
. 0xFULL
ile 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. 0xF
Dü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 0xF
sı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ü, a
daha 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.1P1
bir ü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.1P1
bir 0.125
hale 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. 10
ikili 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.