Först och främst ger xor bara true om två bool värden (även bits) är olika och dit test blir (a^b)^c så c testas mot resultatet av a^b inte mot de andra värdena. Du får dela up testet och det är enklare med != eller == bättre men om du måste använda xor så kan du göra
cout << !(!(a ^ c) || !(a ^ c) || !(b ^ c)) << endl;
vilket ger dig 0 om minst två av värdena är lika
XOR (^) arbetar från vänster till höger, så a ^ b ^ c är det samma som att skriva (a ^ b) ^ c. XOR arbetar på bitnivå och ger följande resultat på bitar:
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
Så det som händer i din kod är följande
a = c = 4 (bas 10) = 0100(bas 2)
b = 6(bas 10) = 0110(bas 2)
a ^ b:
0100
^ 0110
------
0010
(a ^ b) ^ c:
0010
^ 0100
------
0110
Därefter typomvandlar du resultatet till bool vilket betyder att allt som inte är 0 är sant och därmed blir resultatet 1