J'ai été surpris par ce code:
if (a =! b) { // let it be on false
...
}
Mais a
n'est jamais attribué par une valeur. De quoi parle cet opérateur?
C'est deux opérateurs, =
et !
, pas une. Ce pourrait être une manière d’écriture obscurcie
a = !b;
if (a) {
// whatever
}
fixer a
à l'inverse logique de b
et tester si le résultat est vrai (ou, de manière équivalente, si b
était faux).
Ou cela pourrait être une faute de frappe de a != b
.
Il y a bien longtemps, lorsque les dinosaures parcouraient la Terre et que C s'exécutait sur la cinquième édition d'UNIX sur PDP-11, =!
était l'opérateur "pas égal". Cet usage était déconseillé avec la création de Standard C. Cela signifie donc maintenant "attribuer l'inverse logique", comme dans a = !b
. Ceci est un bon argument pour toujours entourer les opérateurs binaires d'espaces, juste pour que les humains lisent le code ce que pense le compilateur.
Je suis un peu surpris que personne d'autre ne l'ait mentionné, mais je suis peut-être le seul SO utilisateur à avoir jamais touché un compilateur C aussi ancien.
a
reçoit la négation booléenne de b
dans cette ligne. C'est juste un faux format
if( a = !b ) {
... et une mauvaise mission cachée dans une condition.
a =! b
est juste une façon amusante de mettre
a = !b
c'est-à-dire l'affectation de not b
à a
.
La valeur de l'expression est a
après l'affectation.
Avec le code ci-dessous, vous pouvez voir que la valeur de l'expression a = !b
est !false
(c'est-à-dire true
) et vous pouvez ensuite voir que l'assignation a eu lieu en vérifiant la valeur de a
, qui est également true
.
#include <iostream>
int main()
{
bool a = false;
bool b = false;
if(a)
printf("a is true!\n");
else
printf("a is false!\n");
if(a = !b)
printf("expression is true!\n");
else
printf("expression is false!\n");
if(a)
printf("a is true!\n");
else
printf("a is false!\n");
}
Résultat:
a is false!
expression is true!
a is true!
Selon la liste des opérateurs C/C++, il n’existe aucun opérateur tel que =!
. Cependant, il y a un opérateur !=
( différent de , opérateurs de comparaison/opérateur relationnel)
=!
opérateurs est dans l'instruction if
et quelqu'un essaie de taper !=
au lieu de =!
parce que !=
est l'opérateur de comparaison qui retourne vrai ou faux.b
à a
et il/elle a commis une faute de frappe en oubliant de mettre un espace après le signe égal. C'est de cette façon que le compilateur l'interprète. Selon Priorité des opérateurs en c ++: !
) précédent est 3 et associativité est Droite à gauche Ce sont deux opérateurs différents: le =
Opérateur (affectation) avec le !
_ opérateur. Il peut en principe être traduit en une affectation de a
à la valeur annulée de b
.
if (a = !b)
Mais, ce que l'utilisateur voulait probablement écrire était le !=
opérateur:
if (a != b)
Ce n'est pas un opérateur unique, c'est cependant un excellent moyen de brouiller le code.
Si elle était écrite à la place a=!b
, L'espace blanc ne vous laisserait peut-être pas croire qu'il s'agissait d'un opérateur unique.
Les compilateurs ont des avertissements pour l'affectation dans une expression conditionnelle, à moins que vous n'encapsuliez la totalité de l'instruction dans un ensemble de parenthèses. Cet exemple est parfait pour savoir quand cet avertissement serait utile.
Ces deux instructions sont fonctionnellement identiques, mais l'une génère un avertissement et l'autre non:
if (a =! b) // Generates a warning with `-Wparentheses` (gcc)
if ((a =! b)) // No such warning
- Wparentheses
Avertir si des parenthèses sont omises dans certains contextes, par exemple lorsqu'il existe une affectation dans un contexte dans lequel une valeur de vérité est attendue ou lorsque des opérateurs sont imbriqués dont les préséances sont souvent confondues.
Ceci, bien sûr, suppose que vous êtes un programmeur responsable et que vous lisez réellement les avertissements que votre compilateur a émis.
if (a = !b) // Assign A the value of (logical) NOT B and then test the truth
L’avertissement du compilateur mentionné ci-dessus est réellement utile dans le cas où la personne qui a écrit ce code a transposé accidentellement !
Et =
. Toutefois, d'après les commentaires cryptés en ligne de votre question initiale, a = !b
Est probablement l'intention de l'auteur.
C++ n'a pas de =!
opérateur, ce qui signifie immédiatement qu'il s'agit d'un =
opérateur suivi d'un !
_ opérateur. Donc, vous avez simplement a = !b
dans la condition if
.
Tout est une question de clarté du code:
Il devrait être écrit comme suit: if (a = !b)
if (a = !b)
revient à dire que si a
est affecté à !b
. Donc, techniquement, deux opérateurs distincts sont utilisés, =
qui est une opération d’affectation, et !
qui est une expression logique.
Il suffit de mettre un espace entre =
et !
cela résout cette confusion.
Il pourrait y avoir trois raisons à cela:
Ce pourrait être une faute de frappe du !=
_ opérateur, ce qui signifie différent de. Exemple:
if (a != b) {
// a is not equal to b
}
Cela pourrait être une erreur de frappe a == !b
, signifiant a
est égal à not b
, qui serait le plus souvent utilisé avec des booléens. Exemple:
if (a == !b) {
// The boolean a is equal to not b (a is not equal to b)
}
Il pourrait essayer d’attribuer a
à l’inverse de b
. Exemple:
bool a = !b; // Sets a to the opposite of b
Je pense que c'est l'une des erreurs d'écriture ou d'impression. Parce que si nous ne pouvons pas compiler ce code car il contient une erreur de compilation. Et ici, cela est à l'intérieur de la clause if, le type de retour doit être booléen. Alors, comment est-ce possible? La réponse est simplement une erreur ou, comme le dit Mike , une manière d’écriture obscurcie .
Et seulement possible si les deux variables a et b sont booléennes et seront compilées ainsi a est égal à (pas) b i.e (a =! B).
Ceci peut être considéré comme a
est attribué à !b
.
J'essaie de répondre à votre question et, en accord avec Mike réponse , je ne fais qu'ajouter.
Vous pouvez aussi le comprendre par a=!!b
.
Le code a=!b
résultats 0
à a
et a=!!b
résultats 1
à a
.
Le =!
n'est pas un opérateur unique, mais la combinaison de ces deux. On demande à ces types de question de mal guider les étudiants pour vérifier leurs compétences en matière de codage .