Following program works differently - if compiled with flag -g or without: -------------- #include <iostream> using namespace std; int main(){ unsigned char a[10]; a[0] = 'A'; a[2] = 'B'; a[0] ^= a[2] ^= a[0] ^= a[2]; cout <<"a0="<<a[0]<<" a2="<<a[2]<<endl; } ============================== VITALY:/tmp>g++_4.0.2 -O3 a.cc VITALY:/tmp>./a.out a0=B a2=A VITALY:/tmp>g++_4.0.2 -g a.cc VITALY:/tmp>./a.out a0= a2=A =============================== :/tmp>g++_4.0.2 -v Using built-in specs. Target: i686-pc-linux-gnu Configured with: ../gcc-4.0.2/configure --prefix=/jer/sys/contrib/linux/gcc-4.0.2_i686/ --with-static-libgcc --disable-shared -enable-languages=c,c++ Thread model: posix gcc version 4.0.2
It's not a gcc bug. The code relies on the results of intermediate subexpressions. According to Stroustrup, The C++ Programming Language, section 6.2.2, "The order of evaluation of subexpressions within an expression is undefined." You should use sequence points e.g.: a ^= b, b ^= a, a ^= b;
*** This bug has been marked as a duplicate of 11751 ***
Thank you very much.