2
votes

Pourquoi str! = "Hello" && "goodbye" ne fonctionne-t-il pas?

J'essaye de quitter la fonction "faire" si les chaînes "bonjour" ou "au revoir" sont saisies , cette fonction fonctionne uniquement pour "bonjour" mais pas "au revoir". Quelqu'un peut-il m'expliquer quel est le problème avec ma fonction? Aussi s'il y a une meilleure façon de le faire, j'aimerais aussi voir. Merci

​​"Bonjour" || "Au revoir" "Hello", "Goodbye"

#include <iostream>
#include <string>



int main()
{
    std::string str;
    do {

        std::cout << "Say Hello, sir.";
        std::cin >> str;

    } while (str != "Hello" && "Goodbye");

    std::cout << "You're rude, bro";
}

Je m'attends à ce que l'instruction "do" se termine et continue vers l'instruction cout après la saisie de "Hello" ou "Goodbye". p>


4 commentaires

Vous devriez écrire while (str! = "Hello" || str! = "Goodbye") . Les comparaisons sont toujours individuelles.


@lilitmouton vous aurez probablement besoin de str! = "Goodbye". À l'heure actuelle, votre deuxième condition est juste une chaîne plutôt que le booléen que vous voulez.


@AlexG: C'est aussi un malentendu sur la façon dont les comparaisons et les opérateurs logiques fonctionnent ensemble. Votre version bouclera pour toujours.


@AlexG dans votre exemple, vous devez utiliser && au lieu de ||


3 Réponses :


3
votes

Votre code pendant évalue (str! = "hello" && "goodbye") . En C ++, c'est égal à ((str! = "Hello") && true) . "Goodbye" est évalué à true car il s'agit d'une chaîne littérale, qui prend la valeur true car ce n'est pas un nullptr .

Vous devez faire (str! = "Bonjour" && str! = "Au revoir") .


4 commentaires

Parce que la chaîne est évaluée comme si le vrai bacause est défini Je ne suis pas sûr de ce que vous dites ici. Il est évalué à true car il s'agit d'un littéral de chaîne, qui est un const char * , et les pointeurs évaluent à true s'ils ne sont pas nullptr


Merci Tas pour l'explication. L'explication a été ajoutée à ma réponse.


@Tas parce que c'est un littéral de chaîne, qui est un caractère const - juste pinailler: Le type d'un littéral de chaîne est un tableau de N const char .


un littéral de chaîne, qui est évalué à vrai s'ils ne sont pas nullptr. - Et comme un littéral de chaîne ne peut pas être un nullptr , ils sont toujours true .



7
votes

La condition str! = "Hello" && "Goodbye" est effectivement (str! = "Hello") && "Goodbye" . L'opérateur && ne joint pas plusieurs opérandes de ! = . C'est un opérateur complètement séparé.

Le premier opérande de && , str! = "Hello" , compare str à "Hello" , qui est ce que vous voulez. Le deuxième opérande, "Au revoir" , n'est pas ce que vous voulez.

Quand "Goodbye" est l'opérande de && , il est converti en bool . (En détail, ce littéral de chaîne est d'abord converti en un pointeur vers son premier caractère, puis en bool .) Le résultat de la conversion d'un pointeur non nul en bool est < code> vrai .

Donc, str! = "Hello" && "Goodbye" équivaut à str! = "Hello" && true , qui est identique à str ! = "Bonjour" .

La condition souhaitée est str! = "Bonjour" && str! = "Au revoir" .


4 commentaires

Yay! Quelqu'un qui connaît la logique booléenne!


@BenVoigt Maintenant tu m'as rendu triste: '(


@Swordfish: Je ne voulais pas dire que vous ne l'êtes pas, c'était un contraste avec la réponse précédemment proposée.


@BenVoigt Et je ne voulais pas vraiment être triste ^^



2
votes

Fermez, il vous suffit d'être plus explicite.

str != "Hello" && str != "Goodbye"

Vous devez faire chaque comparaison de str séparément.


0 commentaires