ลองทำนิพจน์จากซ้ายไปขวา:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
?
แจ้งให้ทราบล่วงหน้าสิ่งแรกที่ผมก็คือว่าเราจะใช้ผู้ประกอบการที่ประกอบไปด้วยจากการใช้ subexpression ดังนั้น:
0xFULL ? '\0' : -1
ไม่ว่าจะเป็น "ถ้า0xFULL
เป็นที่ไม่ใช่ศูนย์กลับ'\0'
มิฉะนั้น-1
. 0xFULL
เป็นตัวอักษรเลขฐานสิบหกกับไม่ได้ลงนามต่อท้ายยาวยาว - ความหมายมันเป็นตัวอักษรเลขฐานสิบหกชนิดunsigned long long
ที่ไม่ได้เรื่องจริงๆ แต่เนื่องจาก. 0xF
สามารถพอดีภายในจำนวนเต็มปกติ
นอกจากนี้ผู้ประกอบการที่ประกอบไปด้วยสามแปลงประเภทของคำที่สองและสามเป็นประเภทที่พบบ่อย '\0'
จะถูกแปลงไปแล้วซึ่งเป็นเพียงint
0
มูลค่าของ0xF
มันใหญ่กว่าศูนย์ดังนั้นมันจึงผ่านไป ตอนนี้การแสดงออกกลายเป็น:
a[ 0 :>>>=a<:!!0X.1P1 ]
ถัดไป:>
เป็นเดี่ยว มันเป็นโครงสร้างที่ขยายไปถึง]
:
a[0 ]>>=a<:!!0X.1P1 ]
>>=
เป็นผู้ดำเนินการกะด้านขวาที่ลงนามแล้วเราสามารถเว้นที่ว่างa
เพื่อให้ชัดเจนยิ่งขึ้น
ยิ่งไปกว่านั้น<:
คือ digraph ที่ขยายไปยัง[
:
a[0] >>= a[!!0X.1P1 ]
0X.1P1
เป็นตัวอักษรฐานสิบหกที่มีเลขชี้กำลัง แต่ไม่ว่าคุณค่า!!
ของสิ่งใดก็ตามที่ไม่ใช่ศูนย์จะเป็นจริง 0X.1P1
เป็น0.125
ที่เป็นที่ไม่ใช่ศูนย์จึงกลายเป็น:
a[0] >>= a[true]
-> a[0] >>= a[1]
นี่>>=
คือโอเปอเรเตอร์กะขวาที่เซ็นชื่อ มันเปลี่ยนค่าของตัวถูกดำเนินการด้านซ้ายโดยเลื่อนบิตไปข้างหน้าด้วยค่าทางด้านขวาของตัวดำเนินการ ในไบนารีคือ10
1010
ดังนั้นนี่คือขั้นตอน:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=
ส่งคืนผลลัพธ์ของการดำเนินการดังนั้นตราบใดที่การเลื่อนa[0]
ยังคงไม่เป็นศูนย์สำหรับทุกครั้งที่บิตถูกเลื่อนไปทางขวาหนึ่งวงจะดำเนินการต่อ ความพยายามครั้งที่สี่คือที่ที่a[0]
จะ0
เกิดการวนซ้ำดังนั้นจึงไม่เคยเข้ามา
เป็นผลให้?
พิมพ์สามครั้ง