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
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
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 :
qui donne
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);
a = 1, b = 0
a = 1, b = 2
a = 2, b = 2
je veux savoir si il faut traiter a avant b
c' est un cas général
merci
on va dire qu'on est déjà dans la fonction ...
non
J'aurai plutot ditEnvoyé par bigboomshakala
a=0, b=0
a=1, b=2
a=2, b=2
Non ?? Sinon pourquoi a=1 dans le premier appel ?
Bonjour,
Non, il n'y a absolument aucun impératif à traiter a avant b !je veux savoir si il faut traiter a avant b
c' est un cas général
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.
et non, c'est le piège.Envoyé par niglo
j'ai oublié un cas :
le dernier donne
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;
eta = 3, b = 2
i = 4
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)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 f(i+2,i+1) i = i+2;
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.
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 ???
On part de i=0 et fait 3 fois i++, donc pour moi, i vaut 3 :i = 0;
g(i++,i,i++,i,i,i++)
Arrow
g(3,4,2,4,4,1)
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![]()
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.lorsque des arguments doivent être évalués avant d'être passés à la fonction, ils sont évalués en partant de la fin
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à.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
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...Envoyé par niglo
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.
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...
Partager