Đó là một cái bẫy của operator precedence. Ưu tiên toán tử xác định cách hoạt động được "nhóm" (giống như cách 2*3+4
kết quả trong nhóm "2*3
" được nhóm lại với nhau). Việc thêm dấu ngoặc đơn sẽ thay đổi cách mọi thứ được "nhóm" (ví dụ: 2*(3+4)
làm cho số 3+4
được "nhóm" với nhau).
x^1!=1
tương đương với x^(1!=1)
, có thể được đơn giản hóa thành x^0
.
int(x^1)!=1
tương đương với (x^1)!=1
(vì bạn đã thêm dấu ngoặc đơn theo cách thủ công ở đây; phần int
không phù hợp lắm; đó là dấu ngoặc đơn quan trọng).
Như bạn có thể thấy, x^(1!=1)
và (x^1)!=1
không giống nhau.
Nếu mục tiêu của bạn là kiểm tra bit đầu tiên, tôi có thể đề xuất sử dụng bitwise AND (&
). Sau đó, bạn có thể thực hiện if (x & 1)
(nhưng hãy cẩn thận, trộn &
và ==
sẽ dẫn đến các vấn đề tương tự như trước đây, vì vậy hãy sử dụng dấu ngoặc đơn nếu bạn muốn viết if ((x & 1) == 1)
).
Có tra cứu về quyền ưu tiên của toán tử. –
Tại sao bạn sử dụng '^' (bitwise độc quyền hoặc) thay vì '&' (bitwise và)? Bài kiểm tra này không hoàn toàn làm những gì bạn nghĩ. –
Tra cứu những gì nhà điều hành đó làm, bạn muốn một chút và không XOR! –