web-dev-qa-db-fra.com

Qu'est-ce que c'est =! opérateur?

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?

175
m0nhawk

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.

391
Mike Seymour

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.

279
Wexxor

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.

54
Timbo
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!
46
splrs

opérateurs en C++

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)

Il y a deux possibilités.

  1. C'est pourrait être une faute de frappe car j'ai remarqué que =! 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.
  2. Le développeur a peut-être tenté d'assigner la négation booléenne de 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 ++:
    • Opérateur NON logique (!) précédent est 3 et associativité est Droite à gauche
    • Opérateur Affectation directe (=) précédent est 16 et Associativité est De droite à gauche
35
Simpal Kumar

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)
21
Shoe

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.


En utilisant des espaces d'une manière plus raisonnable, la déclaration est en fait:

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.

20
Andon M. Coleman

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.

18
AnT

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.

12
Ryman Holmes

Il pourrait y avoir trois raisons à cela:

  1. 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
    }
    
  2. 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)
    }
    
  3. Il pourrait essayer d’attribuer a à l’inverse de b. Exemple:

    bool a = !b; // Sets a to the opposite of b
    
11
Jojodmo

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).

10
Ranjit

Ceci peut être considéré comme a est attribué à !b.

6
Nitin Misra

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 .

4
Sudhir Yadav