176 votes

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

J'ai été surpris par ce code:

if (a =! b) { // let it be on false
    ...
}

Mais a n'est jamais affecté par une valeur. Quel est cet opérateur?

393voto

Mike Seymour Points 130519

C'est deux opérateurs, = et !, pas un seul. Il peut être obscurci façon d'écrire

a = !b;
if (a) {
    // whatever
}

paramètre a à la logique inverse de b, et de tester si le résultat est vrai (ou, de manière équivalente, si b était faux).

Ou il pourrait être une erreur de frappe a != b.

279voto

Wexxor Points 1347

Il y a longtemps, quand les dinosaures parcouraient la terre et C a couru sur la 5e édition UNIX sur PDP-11, =! était "pas égal à' opérateur. Cet usage a été rendu obsolète par la création de la Norme C, alors maintenant, il signifie 'attribuer la logique inverse", comme en a = !b. C'est un bon argument pour toujours autour d'opérateurs binaires avec des espaces, juste pour faire comprendre à l' homme la lecture du code que le compilateur est de la pensée.

Je suis un peu surpris que personne d'autre ne parlé, mais là encore j'ai peut-être la seule de SORTE que l'utilisateur n'a jamais touché à un compilateur C que les anciennes.

54voto

Timbo Points 14117

a est affectée à la négation booléenne de b dans cette ligne. C'est juste une misformatted

if( a = !b ) {

... et un mal caché mission à l'intérieur d'un état.

46voto

splrs Points 1597
a =! b 

est juste une drôle de façon de mettre

a = !b

c'est à dire l'affectation d' not b de a.

La valeur de l'expression est - a après la cession.

Avec le code ci-dessous, vous pouvez voir que la valeur de l'expression a = !b est !false (c - true), et vous pouvez alors voir la cession a eu lieu en vérifiant la valeur de a, ce 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!

35voto

Mike Points 584

Les opérateurs en C++

En fonction de C/C++ liste des opérateurs il n'y a pas d'opérateur comme =!. Cependant, il est un opérateur != (Pas égal, les opérateurs de Comparaison/opérateur relationnel)

Il y a deux possibilités.

  1. Il pourrait être de la faute de frappe erreur que j'ai remarqué que =! des opérateurs en if déclaration et que quelqu'un essaie de type != au lieu de =! car != est l'opérateur de comparaison qui renvoie true ou false.
  2. Éventuellement, le développeur a été d'essayer d'attribuer à la négation booléenne de b de a et il/elle a fait une faute de frappe erreur et j'ai oublié de mettre un espace après le signe égal. C'est la façon dont le compilateur interprète, de toute façon. En fonction de la priorité des opérateurs en c++:
    • L'opérateur Logique NON (!) la priorité est 3 et l'Associativité est de Droite à gauche
    • Opérateur Direct d'affectation (=) la priorité est de 16 et de l'Associativité est de Droite à gauche

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X