Mari kita lihat ungkapan dari kiri ke kanan:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
Hal pertama yang saya perhatikan adalah bahwa kami menggunakan operator ternary dari penggunaan ?
. Jadi subekspresi:
0xFULL ? '\0' : -1
mengatakan "jika 0xFULL
bukan nol, kembali '\0'
, jika tidak -1
. 0xFULL
adalah heksadesimal heksadesimal dengan akhiran panjang-panjang unsigned - yang berarti itu adalah heksadesimal harafiah jenis unsigned long long
. Itu tidak terlalu penting, karena 0xF
dapat masuk ke dalam bilangan bulat biasa.
Juga, operator ternary mengubah jenis istilah kedua dan ketiga menjadi jenis umum mereka. '\0'
kemudian dikonversi menjadi int
, yang adil 0
.
Nilai 0xF
jauh lebih besar dari nol, sehingga melewati. Ekspresi sekarang menjadi:
a[ 0 :>>>=a<:!!0X.1P1 ]
Selanjutnya, :>
adalah digraf . Ini adalah konstruksi yang diperluas ke ]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
adalah operator shift kanan yang telah ditandatangani, kita dapat mengaturnya a
agar lebih jelas.
Selain itu, <:
adalah digraf yang diperluas ke [
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
adalah heksadesimal literal dengan eksponen. Tapi tidak peduli nilainya, !!
apa pun yang bukan nol itu benar. 0X.1P1
adalah 0.125
yang bukan nol, sehingga menjadi:
a[0] >>= a[true]
-> a[0] >>= a[1]
The >>=
merupakan operator pergeseran kanan ditandatangani. Ini mengubah nilai operan kirinya dengan menggeser bitnya ke depan dengan nilai di sisi kanan operator. 10
dalam biner adalah 1010
. Jadi, inilah langkah-langkahnya:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
mengembalikan hasil operasinya, sehingga selama pergeseran a[0]
tetap tidak nol untuk setiap kali bitnya bergeser tepat satu, loop akan terus berlanjut. Upaya keempat adalah di mana a[0]
menjadi 0
, sehingga loop tidak pernah dimasukkan.
Hasilnya, ?
dicetak tiga kali.