Valeur de retour dans if-else - C++
Le code ci-dessous imprime:
5
Pourquoi faut-il imprimer 5? Aussi, si il revient 5 pourquoi il n'a pas l'impression de "James"? Je ne comprends pas le code ci-dessous. Si je supprime l'autre mot, il imprime -1. Cependant ne devrait-il pas retourner une valeur par défaut?
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int fonk()
{
int a = 5, b = 3;
int c = a*b;
if(c >10)
{
if( a<b && a >0)
{ cout <<"James";
return a;
}
else if(b<0)
{
return b;
}
}
else return -1;
}
int main()
{
int x = fonk();
cout << x;
}
Ce code ne doit jamais être de retour 5. Je voudrais assurez-vous que vous n'avez pas d'erreurs du compilateur qui empêchent l'application d'être recompilées pour assurez-vous que vous êtes en train de commencer le droit de l'exécutable.
Quel compilateur? Pour moi, il n'a absolument pas d'impression ou de retour de 5...
ce code ne peut pas être compilé, comme tous les chemin retourne des valeurs
J'ai trouvé une citation sur UB: "[n3337:6.6.3.2]: qui Coule à la fin d'une fonction est l'équivalent d'un retour sans valeur; il en résulte un comportement non défini dans la valeur de retour de la fonction." mais c'est bien formée au programme, donc, le compilateur doit passer ce code.
c'est parce que parfois, quelqu'un va vouloir écrire du code comme
Quel compilateur? Pour moi, il n'a absolument pas d'impression ou de retour de 5...
ce code ne peut pas être compilé, comme tous les chemin retourne des valeurs
J'ai trouvé une citation sur UB: "[n3337:6.6.3.2]: qui Coule à la fin d'une fonction est l'équivalent d'un retour sans valeur; il en résulte un comportement non défini dans la valeur de retour de la fonction." mais c'est bien formée au programme, donc, le compilateur doit passer ce code.
c'est parce que parfois, quelqu'un va vouloir écrire du code comme
if (condition) return 1 else throw_exception();
. Le compilateur ne sait pas que throw_exception()
ne retourne pas (bien que certains compilateurs vous permettent de déclarer qu'il n'est pas). Il serait ennuyeux d'avoir à écrire return 0;
à la fin de la fonction juste de la fermer une erreur sur comment aurait il y a un chemin qui ne reviendra pas. Fondamentalement, C++ priorise le code est correct d'être raisonnable, plus de code incorrect utiles erreurs...OriginalL'auteur user1559792 | 2013-11-01
Vous devez vous connecter pour publier un commentaire.
Vous frapper comportement indéfini. Votre fonction ne fait pas
return
quoi que ce soit! Regardez chaque condition:c>10
? oui.a<b && a >0
? no.b<0
? no.Si vous n'avez jamais touché le
return
s. Cela ne signifie absolument rien de ce qui pourrait arriver dans votre programme. Dans votre cas, il semble juste d'arriver5
est stocké où le programme s'attend à unreturn
valeur.OriginalL'auteur BoBTFish
Donc les deux premières lignes de la fonk delcare les valeurs suivantes:
Donc
a
est de 5,b
est 3 etc
est de 15.15 est supérieur à 10.
ce n'est pas vrai, donc le James/retour d'une branche n'est pas exécutée.
b est de 3, ce qui est >= 0, de sorte que le retour b instruction n'est pas exécutée.
cette déclaration se réfère à "c > 10", le c > 10 était vrai, alors cette clause else n'est pas exécutée.
votre fonction se termine sans retour, il invoque "un Comportement non défini".
Solutions: Supprimer le 'else' de
else return -1;
ou ajouter unreturn -2;
de voir le cas où votre code suivi aucun de ces chemins.Je vois que vous êtes en utilisant GCC -- ajouter le 'Mur' option pour obtenir maximale diagnostics à partir du compilateur, il devrait vous dire que votre fonction est un chemin de code qui ne retourne pas de valeur.
OriginalL'auteur kfsone
Nah, vous l'avez un peu mal. Votre dernier reste appartient à la première instruction if, de sorte que ne sera jamais appelé. Votre fonction advient-il de retour 5 parce que ce qui arrive à être à l'endroit où normalement le compilateur place la valeur de retour.
Vous ne pouvez pas compter sur que si que c'est un comportement non défini par la norme C++ section 6.6.3 (si mon google compétences me servir de droite).
OriginalL'auteur villintehaspam
c'est hors-sujet pour ce site, mais permet de passer à travers chaque ligne de
c est 15 maintenant
mise à jour: pourquoi il renvoie 5 - habituellement, la valeur de retour de la fonction est placée (e)registre ax (je suppose que vous êtes sur plate-forme x86), de sorte que votre compilateur utilisé ax pour stocker la valeur d'un lors de la comparaison
la question "faut démontrer une compréhension minimale du problème étant résolu", si l'OP n'a même pas essayer de déboguer le code - ce n'est pas négligeable, la compréhension, je peux dire que pas de n'importe quel type d'analytique/debug travail qui a été fait ici, à tous les
OriginalL'auteur Iłya Bursov
Si vous sortez d'une fonction qui retourne
int
sansreturn
ing une valeur, le résultat est indéfini. Pas de valeur par défaut.Le compilateur pourrait imprimer 5, pourrait imprimer 0, coukd impression 4232732, ou il pourrait formater votre disque dur. Tous les woukd être juridique C++ résultats de votre programme.
La façon de gérer cela est de deux ordres: activer les avertissements et les mises en garde que des erreurs, comme il y a très certainement un wsrning pour ne pas tous les chemins de contrôle de retourner une valeur.
Deuxièmement, ne pas faire de fonctions où tous les chemins de contrôle de retourner une valeur.
OriginalL'auteur Yakk - Adam Nevraumont