Chúng ta hãy đi qua biểu thức từ trái sang phải:
a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ]
Điều đầu tiên tôi nhận thấy là chúng tôi đang sử dụng toán tử ternary từ việc sử dụng ?. Vì vậy, sự phụ thuộc:
0xFULL ? '\0' : -1
đang nói "nếu 0xFULLlà khác không, trả về '\0', ngược lại -1. 0xFULLlà một chữ thập lục phân với hậu tố dài không dấu - có nghĩa là nó là một kiểu chữ thập lục phân unsigned long long. Điều đó thực sự không quan trọng, bởi vì 0xFcó thể nằm trong một số nguyên thông thường.
Ngoài ra, toán tử ternary chuyển đổi các loại của các điều khoản thứ hai và thứ ba thành loại phổ biến của chúng. '\0'sau đó được chuyển đổi thành int, chỉ là 0.
Giá trị của 0xFcách lớn hơn 0, vì vậy nó vượt qua. Biểu thức bây giờ trở thành:
a[ 0 :>>>=a<:!!0X.1P1 ]
Tiếp theo, :>là một máy vẽ . Nó là một cấu trúc mở rộng tới ]:
a[0 ]>>=a<:!!0X.1P1 ]
>>=là toán tử dịch chuyển bên phải đã ký, chúng ta có thể tạo khoảng trống từ đó ađể làm cho nó rõ ràng hơn.
Hơn nữa, <:là một sơ đồ mở rộng tới [:
a[0] >>= a[!!0X.1P1 ]
0X.1P1là một chữ thập lục phân với số mũ. Nhưng bất kể giá trị, !!bất cứ điều gì khác không là đúng. 0X.1P1là 0.125khác không, vì vậy nó trở thành:
a[0] >>= a[true]
-> a[0] >>= a[1]
Đây >>=là toán tử dịch chuyển bên phải đã ký. Nó thay đổi giá trị của toán hạng bên trái của nó bằng cách dịch chuyển các bit của nó về phía trước theo giá trị ở phía bên phải của toán tử. 10trong nhị phân là 1010. Vì vậy, đây là các bước:
01010 >> 1 == 00101
00101 >> 1 == 00010
00010 >> 1 == 00001
00001 >> 1 == 00000
>>=trả về kết quả hoạt động của nó, miễn là sự dịch chuyển a[0]vẫn khác không cho mỗi lần bit của nó được dịch chuyển sang phải một, vòng lặp sẽ tiếp tục. Nỗ lực thứ tư là nơi a[0]trở thành 0, vì vậy vòng lặp không bao giờ được nhập.
Kết quả là, ?được in ba lần.