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 0xFULL
là khác không, trả về '\0'
, ngược lại -1
. 0xFULL
là 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ì 0xF
có 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 0xF
cá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.1P1
là 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.1P1
là 0.125
khá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ử. 10
trong 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.