Deux raisons principales. En bref, l'examiner attentivement; il pourrait y avoir une bonne raison pour cela, mais si il est TRÈS explicite dans vos commentaires, car il peut être fragile et, comme vous le dites vous-même, les gens ne sont généralement pas l'habitude de voir ce type de code.
Xor au niveau du bit != Logique xor (à l'exception de 0 et de 1)
Tout d'abord, si vous êtes d'exploitation sur d'autres valeurs que false
et true
(ou 0
et 1
, comme les entiers), l' ^
opérateur peut introduire comportement n'équivaut pas à une logique xor. Par exemple:
int one = 1;
int two = 2;
// bitwise xor
if (one ^ two)
{
// executes because expression = 3 and any non-zero integer evaluates to true
}
// logical xor; more correctly would be coded as
// if (bool(one) != bool(two))
// but spelled out to be explicit in the context of the problem
if ((one && !two) || (!one && two))
{
// does not execute b/c expression = ((true && false) || (false && true))
// which evaluates to false
}
De crédit de l'utilisateur @Patrick pour exprimer cette première.
Ordre des opérations
Deuxièmement, |
, &
, et ^
, que les opérateurs au niveau du bit, ne pas faire de court-circuit. En outre, plusieurs opérateurs au niveau du bit enchaînés dans un seul énoncé, même avec des parenthèses explicites, peuvent être réorganisées par l'optimisation des compilateurs, parce que tous les 3 opérations sont normalement commutative. Ceci est important si l'ordre des opérations de questions.
En d'autres termes
bool result = true;
result = result && a() && b();
// will not call a() if result false, will not call b() if result or a() false
ne sera pas toujours donner le même résultat (ou à la fin de l'état)
bool result = true;
result &= (a() & b());
// a() and b() both will be called, but not necessarily in that order in an
// optimizing compiler
Ceci est particulièrement important parce que vous ne pouvez pas les méthodes de contrôle a()
et b()
, ou quelqu'un d'autre peut venir le long et les modifier par la suite de ne pas comprendre la dépendance, et de provoquer un méchant (et souvent de presse-construire uniquement) bug.