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 :

fonction en c++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Points : 31
    Points
    31
    Par défaut fonction en c++
    salut,

    c 'est pour savoir si dans une fonction on doit traiter les arguments dans l ordre comme ils sont été définis. je pense que oui mais...

    merci

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    tu peux préciser ta penser ? est-ce que tu parles de l'évaluation des arguments avant l'entrée dans la fonction ? comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void f(int a,int b)
    {
    	cout << "a = " << a << ", b = " << b << endl;
    }
     
    [...]
     
    	int i=0;
    	f(i,i++);
    	f(i++,i);
    	f(i,i);
    qui donne

    a = 1, b = 0
    a = 1, b = 2
    a = 2, b = 2

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Points : 31
    Points
    31
    Par défaut
    je veux savoir si il faut traiter a avant b
    c' est un cas général

    merci

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    on va dire qu'on est déjà dans la fonction ...

    non

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Points : 31
    Points
    31
    Par défaut
    j ai pas compris ta réponse

  6. #6
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par bigboomshakala
    tu peux préciser ta penser ? est-ce que tu parles de l'évaluation des arguments avant l'entrée dans la fonction ? comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void f(int a,int b)
    {
    	cout << "a = " << a << ", b = " << b << endl;
    }
     
    [...]
     
    	int i=0;
    	f(i,i++);
    	f(i++,i);
    	f(i,i);
    qui donne

    a = 1, b = 0
    a = 1, b = 2
    a = 2, b = 2
    J'aurai plutot dit
    a=0, b=0
    a=1, b=2
    a=2, b=2

    Non ?? Sinon pourquoi a=1 dans le premier appel ?

  7. #7
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    je veux savoir si il faut traiter a avant b
    c' est un cas général
    Non, il n'y a absolument aucun impératif à traiter a avant b !

    En terme clair, tu peux traiter les arguments de la fonction dans n'importe quel ordre, voir (même si cela ne sert à rien) ne pas les traiter du tout.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 101
    Points : 31
    Points
    31
    Par défaut
    merci

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par niglo
    J'aurai plutot dit
    a=0, b=0
    a=1, b=2
    a=2, b=2

    Non ?? Sinon pourquoi a=1 dans le premier appel ?
    et non, c'est le piège.

    j'ai oublié un cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void f(int a,int b)
    {
       cout << "a = " << a << ", b = " << b << endl;
    }
     
    [...]
     
       int i=0;
       f(i,i++);
       f(i++,i);
       f(i,i);
       f(i++,i++);
       cout << "i = " << i << endl;
    le dernier donne
    a = 3, b = 2
    et
    i = 4

  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    lorsque des arguments doivent être évalués avant d'être passés à la fonction, ils sont évalués en partant de la fin

    ie :

    f(i++,i++) le 2è i++ est évalué avant le 1er. c'est "très grosso modo" comme si on avait
    (c'est juste illustratif)

    si on a une fonction g(a,b,c,d,e,f) :

    i = 0;
    g(i++,i,i++,i,i,i++)



    g(3,4,2,4,4,1)

    Les arguments sont évalués de droite à gauche. la valeur de ceux qui n'ont pas besoin d'être évalué (cas d'une expression se résumant à une variable) peut dépendre des évaluations des autres arguments (puisqu'ici i est modifié à chaque évaluation), d'où le piège.

  11. #11
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    ok merci pour ces explications !

    Par contre, pour l'exemple avec g(....), je comprend bien les 1,2,3 mais d'ou viennent les 4 ???

    i = 0;
    g(i++,i,i++,i,i,i++)

    Arrow

    g(3,4,2,4,4,1)
    On part de i=0 et fait 3 fois i++, donc pour moi, i vaut 3 :
    0++ = 1
    1++ = 2
    2++ = 3

    donc j'aurai tendance à dire g(3,3,2,3,3,1) mais je suppose qu'il y a encore un truc que j'ai pas compris

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    lorsque des arguments doivent être évalués avant d'être passés à la fonction, ils sont évalués en partant de la fin
    Je n'ai pas pu trouver une source claire sur le sujet, mais il me semble que ce n'est pas défini dans la norme. Et que pour avoir un ordre d'évaluation bien défini, il faut passer par des variables temporaires.

    Par contre, l'ordre d'empilement des paramètres sur la pile, est lui bien comme tu le décris (de la fin vers le début).

    Mais bon, on s'écarte du sujet là.

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par niglo
    ok merci pour ces explications !

    Par contre, pour l'exemple avec g(....), je comprend bien les 1,2,3 mais d'ou viennent les 4 ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = 0;
    g(i++,i,i++,i,i,i++)
    Ce code étant illégal, le compilateur aurait tout aussi bien le droit de mettre tout ce qu'il veut, 42, -314, de formater ton disque dur, d'envoyer des insultes en ton nom à ton patron/prof...

    Quant à l'ordre d'évaluation des arguments d'une fonction, il est effectivement non spécifié.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Et il n'y a donc pas de réponse meilleure que les autres vu que chaque compilo va faire comme il l'entend.
    Cf p.ex la liste des souhaits qui ne seront jamais exhaucés qui été exprimés pour GCC.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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