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 0xFULLbukan nol, kembali '\0', jika tidak -1. 0xFULLadalah heksadesimal heksadesimal dengan akhiran panjang-panjang unsigned - yang berarti itu adalah heksadesimal harafiah jenis unsigned long long. Itu tidak terlalu penting, karena 0xFdapat 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 0xFjauh 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 aagar lebih jelas.
Selain itu, <:adalah digraf yang diperluas ke [:
a[0] >>= a[!!0X.1P1 ]
0X.1P1adalah heksadesimal literal dengan eksponen. Tapi tidak peduli nilainya, !!apa pun yang bukan nol itu benar. 0X.1P1adalah 0.125yang 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. 10dalam 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.