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>
3 Réponses :
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") .
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 code >.
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" .
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 ^^
Fermez, il vous suffit d'être plus explicite.
str != "Hello" && str != "Goodbye"
Vous devez faire chaque comparaison de str séparément.
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||