IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Nécessité du return dans fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut Nécessité du return dans fonction
    Bonjour a toutes et a tous ,
    J'ai fait ce petit programme en m'inspirant d'un exemple ou l'auteur utilisait un return ... a chaque fin de fonction crée . Je les ai viré et ca fonctionne quand meme . Je me suis dit que c'est normal puisque lorsque je fait l'appel de mes fonctions , je place le resultat dans une variable . Donc , dans quel cas , ils est nécéssaire de faire un return machin chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
    int nb_article();
    int remise(int nb);
     
    int main(){
     int nombre;
     int reduction;
     
     printf("Le prix du jean sans remise est de 30 euros\n");
     printf("10%% de remise entre 5 et 10 jeans acheté\n");
     printf("20%% de remise entre 10 et 100 jeans acheté\n");
     nombre=nb_article();
     printf("Vous avez séléctionné %d jeans\n",nombre);
     reduction=remise(nombre);
     printf("Le prix a l'unité sera de:%d Euros\n",reduction);
    return 0;
    }
     
    int nb_article(){
     int article;
     do{
        printf("Combien d'article voulez vous?\n");
        scanf("%d",&article);
       }while(article<=4);
     
    }
    int remise(int nb){
     int prix=30;
     int reduc,op;
     if(nb>=5 && nb<=10){
      op=(prix*10)/100;
      reduc=prix-op;}
     if(nb>10 && nb<=100){
      op=(prix*20)/100;
      reduc=prix-op;}
    }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Ton truc compile parce que ton compilo est uuuultra souple, et encore.
    Tu dois avoir des warning, qui ne doivent pas être ignorés.
    Ou alors il ne compile pas du tout mais tu as une version précédente compilée qui se lance, et tu ignores la sortie qui t'indique ce comportement.

    Si une fonction retourne quelque chose (donc non void), il faut bien un moment indiquer ce qu'elle doit retourner...
    Sinon au mieux tu as des alertes ou erreurs.
    Au pire ça retourne n'importe quoi.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Chercheur en sécurité

    Informations forums :
    Inscription : Juin 2013
    Messages : 335
    Par défaut
    Bonjour,

    Je ne suis pas sur de savoir quelle est ta question

    - Soit tu ne comprend pas comment marche un return. Et là je te conseille de reprendre un tutoriel depuis la première page.
    - Soit tu te poses la question un peu plus subtile suivante:
    Citation Envoyé par Version intéressante
    Mon code devrait ne pas marcher puisque ma fonction déclare retourner un int et il n'y a pas de return. Pourquoi mon code peut-il être exécuté?
    Je vais répondre à la version intéressante en espérant que ce soit la bonne...

    En fait, le C est un langage qui permet de faire beaucoup de choses, y compris "n'importe quoi". C'est dû à des raisons de design et surtout de performances.

    Normalement, quand tu fais un return, ton programme va mettre une valeur de retour dans un registre, et cette valeur va être lue par la fonction appelante. Si la fonction ne retourne rien, alors ce registre contiendra la valeur qu'il y avait avant. Ca peut être 0, 42 , -3558468, ou n'importe quoi. On parle d'un comportement indéfini (undefined behavior) (UB). C'est très mauvais, à partir du moment ou tu as un UB, considère que ton programme peut faire n'importe quoi, et peut même donner des résultats différents entre deux exécutions. C'est d'ailleurs confirmé par la norme C

    Citation Envoyé par Norme C11
    If the } that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.
    Bref, évite les UB, c'est un très bon moyen de perdre plein de temps à déboguer ton programme quand il deviendra complexe. Et ça n'amusera pas tes collègues.

    Edit: grillé
    Edit2: Arf, en relisant le message original, l'OP ne doit juste pas comprendre comment marchent les return... Et accessoirement les variables locales... Je laisse quand même mon message au cas ou il serve à un lecteur

  4. #4
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    C'etait bien cette question que je me posais , a savoir : Mon code devrait ne pas marcher puisque ma fonction déclare retourner un int et il n'y a pas de return. Pourquoi mon code peut-il être exécuté?
    J'aurai aimé avoir un message d'erreur a la compilation, de cette facon j'aurai compris qu'il faut systématiquement faire un return apres mes fonctions non void . Mais malheureusement ca passe quand meme !
    Je vais suivre vos conseils et le faire sans manquements.
    Merci de votre aide

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Parce que les compilos C peuvent être souples.
    Plus ils sont vieux, plus ils le seront.
    Faudrait au moins indiquer lequel tu utilises.
    Il faut activer tous les warnings dans les options de compilation. -wall
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Il s'agit de gcc version 7.4.0 .
    Je suis passé a la version version 8.3.0 . Et effectivement , apres avoir activé les warning , le manque de return sur mes fonctions est signalé !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Seule la fonction main() autorise à ne pas avoir de return explicite. Et seulement depuis C99.

    Citation Envoyé par https://en.wikipedia.org/wiki/Entry_point#C_and_C.2B.2B
    In case a return value is not defined by the programmer, an implicit return 0; at the end of the main() function is inserted by the compiler; this behavior is required by the C++ standard.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. plusieurs return dans une seule fonction?
    Par grodashe dans le forum Débuter
    Réponses: 4
    Dernier message: 01/01/2010, 17h09
  2. plusieurs return dans une fonction?
    Par contremaitre dans le forum C
    Réponses: 27
    Dernier message: 21/02/2008, 09h35
  3. valeur du return dans une "fonction"
    Par Papy214 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/12/2007, 15h53
  4. Réponses: 4
    Dernier message: 25/09/2006, 13h53
  5. SSH "return" dans des fonctions
    Par geoffrey_k dans le forum Réseau
    Réponses: 6
    Dernier message: 08/11/2004, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo