Alors je suis nouveau à C ++, et je travaille à travers un didacticiel PDF qui me fait commencer avec des trucs de base. J'écris un programme de cas simple et j'ai vécu quelque chose de bizarre. Chaque fois que je n'avais pas le "sinon" après le "if (sentiment == ok)". L'affaire ne serait jamais appelée et si je suis entré dans quelque chose de hasard, cela me donnerait le texte de l'affaire Egood. Je me demandais pourquoi cela se passe et que j'apprends depuis que j'apprends C ++, je ne voulais pas simplement le brosser de ne jamais savoir pourquoi cela a fonctionné après avoir mis la déclaration d'autre là-bas. Donc, si quelqu'un pouvait m'expliquer cela, ce serait génial! Désolé pour ma mauvaise grammaire. P> p>
4 Réponses :
Compilez votre programme avec des avertissements activés comme Compilation du code sans avertissement activé est un moyen sûr de perdre du temps. P> g ++ -wall -wextra -werror CODE> et il ne compilera même pas, car string_feeling hachit (chaîne const & sentiment) code> ne revient pas une valeur dans tous les cas. P>
Quand aucune des conditions dans les trois (citation de N3337 6.6.3 La déclaration de retour) P> L'écoulement de la fin d'une fonction équivaut à un retour sans valeur; Il en résulte un comportement non défini dans une fonction de retour de valeur. P>
blockQuote> Pour éviter cela, vous devez ajouter une autre sorte à la et renvoyez-la quand aucune condition n'est remplie . P> si code> Les instructions code> inhalit code> Fonction deviennent true, aucun retour code> est exécuté dans la fonction et comportement non défini em> est invoqué.
Enum code> p> string_feeling hashit(string const& feeling) {
if (feeling == "Good" || feeling == "good" || feeling == "GOOD") {
return eGood;
}
if (feeling == "Bad" || feeling == "bad" || feeling == "BAD") {
return eBad;
}
if (feeling == "Ok" || feeling == "ok" || feeling == "OK") {
return eOk;
}
else cout << "";
return eOther; // add this
}
Si aucun puisque vous n'avez pas explicitement écrit le retour Cependant, la valeur de retour par défaut n'est pas toujours Si vous exécutez ce code avec un autre compilateur, vous si code> conditions se rencontrera, hachage code> est allé à code> instruction, la fonction renvoie la valeur par défaut 0 code>, qui est égale à EGOOD code>. p> 0 code>. Ceci est un comportement non défini code>. P> peut code> obtenir des résultats différents. P> P> P> P> >
"La fonction renvoie la valeur par défaut 0" i> ... "Cependant, la valeur de retour par défaut n'est pas toujours 0" i> c'est un peu contradictoire.
Vous devez toujours retourner une valeur sinon le comportement est indéfini
si vous ne pouvez pas modifier votre énorme pour ajouter un cas pour une sensation inconnue, vous pouvez modifier hachit em> pour retourner vrai si Le sentiment em> est valide et dans ce cas pour définir le paramètre de sortie avec la valeur ENUM correspondante, sinon pour renvoyer False sans régler le paramètre de sortie: P> Pour nommer votre ENUM Il peut être pratique dans Hashit em> pour obtenir la chaîne par valeur pour la modifier en minuscule puis pour le comparer avec "bon" "mauvais" et "ok" ou pour utiliser pi@raspberrypi:/tmp $ g++ -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
Hello! Please enter your first name here:
bruno
Hello, bruno!
How are you today? good
That's great!
pi@raspberrypi:/tmp $ ./a.out
Hello! Please enter your first name here:
bruno
Hello, bruno!
How are you today? aze
I do not understand how you are
pi@raspberrypi:/tmp $
string_feeling CODE> n'est pas très clair, quelle que soit la sensation d'entrée comme une chaîne, mieux de simplement nommer cela sentiment em> p> p> p>
li>
strcasecmpmp code> sur son .c_str () code>, permettant également de gérer "bon" etc p>
li>
ul> p>
Postez le code qui a le problème, plutôt que du code que vous semblez dire des travaux, mais aurait un problème si nous le modifions selon certaines instructions données séparément. Et supprimer le code qui n'est pas nécessaire pour démontrer le problème.
Avec ou sans un
sinon code> là, votre programme a un comportement indéfini. Vous devezretour code> oulancer code> dans chaque chemin accessible.Si vous ne souhaitez pas ajouter de nouveau cas dans
string_feeling code> Vous pouvez modifierhachit code> pour être par exemplebool hachit (const strication et sentiment, string_feeling & v) < / Code> Pour retourner False sans réglage V i> Quand Sentiment i> est en valide, sinon défini v i> et retourne vraiNotez sur l'efficacité du style de ce code. Ce n'est peut-être pas vital dans ce cas, mais on devrait penser à cela parfois. Vous faites trois comparaisons dans chaque instruction IF (), qui sont O (longueur) en complexité et le pire cas de votre fonction est O (9 * longueur). Majuscule la chaîne en premier (peut-il être "bon"?) Et vous obtenez O (4 * longueur) au pire ou faire une comparaison motif qui serait O (longueur) dans le pire des cas pour une fonction entière.