J'ai accidentellement tapé =!
au lieu de !=
cela a provoqué un énorme bug dans un système qui n'a pas été détecté pendant un certain temps; Je l'ai corrigé depuis mais je suis curieux de savoir quoi =!
Est-ce que.
J'avais quelque chose comme ça
void foo(int param)
{
int a = 0;
...
if (a =! param)
{
// never got here even when `a` was not equal to `param`
}
...
}
Quelqu'un peut-il expliquer ce qui précède if
déclaration évalue?
Réponses:
26 pour la réponse № 1Cette expression:
a =! param
assigne la valeur !param
à a
. !param
est une version refusée de param évaluée dans un contexte booléen.
Les opérateurs d’affectation renvoient la valeur du côté droit. if (a = !param)
exécute aussi le if
corps, si !param
est vrai.
9 pour la réponse № 2
Ce n'est pas un seul =!
opérateur. Ses =
et !
, cession et négation.
Cela équivaut à if (a = !param)
, ou
a = !param;
if (a) {
}
6 pour la réponse № 3
=!
n'est pas un opérateur. C'est le =
(affectation), et le !
(booléen pas) opérateur.
Donc vous avez if (a = !param)
. L'affectation renvoie la valeur de l'affectation, vous avez donc essentiellement:
a = !param;
if (a) {
...
5 pour la réponse № 4
Si vous considérez qu'il peut s'agir de plusieurs jetons, l'effet devrait être simple:
if (a = !param)
2 pour la réponse № 5
Important: "=!" != "!="
:)
Mais: "=!" == "assignment of the negation of a value"
par exemple. en pseudo:
bool a= true;
bool b=!a;
alors b est faux!
1 pour la réponse № 6
=! N'est pas un opérateur. Vous pouvez le comprendre comme ça. Supposons qu'il y ait une déclaration a=!b
c’est une assignation de l’opérande b dans a mais ici la torsion est antérieure à l’assignation de b à a nous inversons l’état de b en préfixant l’opérande b avec! ce qui est fondamentalement logique pas opérateur.