È una trappola di operator precedence. La precedenza dell'operatore determina il modo in cui le operazioni sono "raggruppate" (come il modo in cui i risultati 2*3+4
vengono "raggruppati" nello 2*3
). L'aggiunta di parentesi cambia il modo in cui le cose sono "raggruppate" (ad esempio,fa sì che "3+4
" sia raggruppato "insieme).
x^1!=1
è equivalente a x^(1!=1)
, che può essere semplificato in x^0
.
int(x^1)!=1
è equivalente a (x^1)!=1
(perché hai parentesi aggiunto manualmente qui; la parte int
non è molto rilevante, è la parentesi che sono importanti).
Come potete vedere, x^(1!=1)
e (x^1)!=1
non sono la stessa cosa.
Se il tuo obiettivo è controllare il primo bit, ti suggerisco di usare un bit-AND (&
). È quindi possibile fare semplicemente if (x & 1)
(ma attenzione, mescolando &
e ==
si verificheranno gli stessi problemi che si erano verificati in precedenza, quindi utilizzare le parentesi se si desidera scrivere if ((x & 1) == 1)
).
Avere una ricerca sulla precedenza degli operatori. –
Perché stai usando '^' (esclusivo bit per bit o) invece di '&' (bitwise e)? Questo test non fa esattamente quello che pensi che faccia. –
Cerca cosa fa quell'operatore, vuoi un bit AND NON XOR! –