Exercice : Un exemple moins portable
Soit le programme suivant :
1
int ajout(int *i){
2
printf("ajout i=%d\n", *i) ;
3
*i+=10;
4
return *i;
5
}
6
int plus(int a, int b){
7
printf(" plus a=%d b=%d\n", a, b);
8
return a+b;
9
}
10
int main(){
11
int n=2 ;
12
plus(++n, ajout(&n));
13
}
int ajout(int *i){ printf("ajout i=%d\n", *i) ; *i+=10; return *i; } int plus(int a, int b){ printf(" plus a=%d b=%d\n", a, b); return a+b; } int main(){ int n=2 ; plus(++n, ajout(&n)); }
En considérant que vous utilisez un compilateur travaillant de façon identique à l'exercice précédent, indiquez les valeurs affichées.
i=2 : le 2e paramètre de la fonction plus étant évalué en premier, n a la valeur définie à l'initialisation.
a=13 : le 1er paramètre est évalué une fois après l'évaluation du second. La fonction ajout a modifié n avec la valeur 2+10=12. Cette valeur est utilisée dans l'expression. La pré-incrémentation modifie la valeur de n en 13 qui est utilisée comme valeur du paramètre.
b=12 : la fonction ajout retourne la valeur de n, après l'avoir modifiée.
Un ordre d'évaluation différent donnera : i=3, a=3, b=13.