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
Version imprimable
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 donneCode:
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);
Citation:
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 ai pas compris ta réponse
J'aurai plutot ditCitation:
Envoyé 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 !Citation:
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.
merci
et non, c'est le piège.Citation:
Envoyé par niglo
j'ai oublié un cas :
le dernier donneCode:
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;
etCitation:
a = 3, b = 2
Citation:
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++) :arrow: le 2è i++ est évalué avant le 1er. c'est "très grosso modo" comme si on avait
(c'est juste illustratif)Code:
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++)
:arrow:
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 :Citation:
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 :oops:
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.Citation:
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à.
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...Citation:
Envoyé par niglo
Quant à l'ordre d'évaluation des arguments d'une fonction, il est effectivement non spécifié.
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.