ลองทำนิพจน์จากซ้ายไปขวา:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
?แจ้งให้ทราบล่วงหน้าสิ่งแรกที่ผมก็คือว่าเราจะใช้ผู้ประกอบการที่ประกอบไปด้วยจากการใช้ subexpression ดังนั้น:
0xFULL ? '\0' : -1
ไม่ว่าจะเป็น "ถ้า0xFULLเป็นที่ไม่ใช่ศูนย์กลับ'\0'มิฉะนั้น-1. 0xFULLเป็นตัวอักษรเลขฐานสิบหกกับไม่ได้ลงนามต่อท้ายยาวยาว - ความหมายมันเป็นตัวอักษรเลขฐานสิบหกชนิดunsigned long longที่ไม่ได้เรื่องจริงๆ แต่เนื่องจาก. 0xFสามารถพอดีภายในจำนวนเต็มปกติ
นอกจากนี้ผู้ประกอบการที่ประกอบไปด้วยสามแปลงประเภทของคำที่สองและสามเป็นประเภทที่พบบ่อย '\0'จะถูกแปลงไปแล้วซึ่งเป็นเพียงint0
มูลค่าของ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เกิดการวนซ้ำดังนั้นจึงไม่เคยเข้ามา
เป็นผลให้?พิมพ์สามครั้ง