Возможный дубликат:
Почему этот оператор не работает в java x ^= y ^= x ^= y;
Образец кода
int a=3;
int b=4;
a^=(b^=(a^=b));
В c++ переменные меняются местами, а в java мы получаем a=0, b=4 почему?
Возможный дубликат:
Почему этот оператор не работает в java x ^= y ^= x ^= y;
Образец кода
int a=3;
int b=4;
a^=(b^=(a^=b));
В c++ переменные меняются местами, а в java мы получаем a=0, b=4 почему?
Записывая свой обмен в одном выражении, вы полагаетесь на побочные эффекты внутреннего выражения a^=b
по отношению к внешнему выражению a^=(...)
. Ваши компиляторы Java и C++ работают по-разному.
Чтобы правильно выполнить замену xor, вы должны использовать как минимум два оператора:
a ^= b;
a ^= (b ^= a);
Однако лучший способ поменять местами переменные — это сделать это обычным способом с временной переменной, и позволить компилятору выбрать лучший способ сделать это на самом деле:
int t = a;
a = b;
b = t;
В лучшем случае компилятор не будет генерировать вообще никакого кода для указанной выше подкачки и просто начнет обрабатывать регистры, содержащие a
и b
, наоборот. Вы не можете написать какой-либо хитрый код xor, который вообще не превосходит никакого кода.
a
и b
являются одной и той же переменной.
- person ; 12.10.2010
Это также не гарантирует работу на С++. Это неопределенное поведение.
Вы должны сделать это в трех отдельных утверждениях:
a ^= b;
b ^= a;
a ^= b;