0
votes

Pourquoi cette déclaration de cas nécessite-t-elle un "si sinon" et pas seulement un "si"?

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

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.


4 commentaires

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 là, votre programme a un comportement indéfini. Vous devez retour ou lancer dans chaque chemin accessible.


Si vous ne souhaitez pas ajouter de nouveau cas dans string_feeling Vous pouvez modifier hachit pour être par exemple bool hachit (const strication et sentiment, string_feeling & v) < / Code> Pour retourner False sans réglage V Quand Sentiment est en valide, sinon défini v et retourne vrai


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


4 Réponses :


3
votes

Compilez votre programme avec des avertissements activés comme g ++ -wall -wextra -werror et il ne compilera même pas, car string_feeling hachit (chaîne const & sentiment) ne revient pas une valeur dans tous les cas.

Compilation du code sans avertissement activé est un moyen sûr de perdre du temps.


0 commentaires

2
votes

Quand aucune des conditions dans les trois 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é.

(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 Enum code> p> xxx pré>

et renvoyez-la quand aucune condition n'est remplie . 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
}


0 commentaires

0
votes

Si aucun si conditions se rencontrera, hachage est allé à xxx

puisque vous n'avez pas explicitement écrit le retour instruction, la fonction renvoie la valeur par défaut 0 , qui est égale à EGOOD .

Cependant, la valeur de retour par défaut n'est pas toujours 0 . Ceci est un comportement non défini .

Si vous exécutez ce code avec un autre compilateur, vous peut obtenir des résultats différents. >


1 commentaires

"La fonction renvoie la valeur par défaut 0" ... "Cependant, la valeur de retour par défaut n'est pas toujours 0" c'est un peu contradictoire.



1
votes

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>

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 $ 
  • Pour nommer votre ENUM 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>

  • 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 strcasecmpmp code> sur son .c_str () code>, permettant également de gérer "bon" etc p> li> ul> p>


0 commentaires