Exercice : Un
À l'aide du programme « alambiqué » suivant, nous souhaitons écrire « a b a b ».
char b(){
printf("a ");
return 'a';
}
char a(){
printf("b ");
return 'b';
}
void ba(char b, char a){
printf(" %c %c \n", b, a);
return;
}
int main(){
ba(b(), a());
return 0 ;
}
char b(){ printf("a "); return 'a'; } char a(){ printf("b "); return 'b'; } void ba(char b, char a){ printf(" %c %c \n", b, a); return; } int main(){ ba(b(), a()); return 0 ; }
Que peut-on dire après l'exécution de la fonction main qui donne l'affichage suivant : « b a a b » ?
Votre choixChoix attenduRéponse
Dans la suite des caractères affichés, les 2 premiers peuvent avoir un ordre variable en fonction du compilateur utilisé.
En effet, la norme C n'impose pas l'ordre d'évaluation des paramètres à l'appel d'une fonction.
Ceci signifie que, pour la liste (par1, par2, par3), les évaluations suivantes sont autorisées :
par1, par2 et par3,
par2, par3 et par1,
par3, par2 et par1,
par3, par1 et par2, etc.
En pratique, le compilateur utilise un automate d'analyse. Le premier et le troisième cas sont ceux que l'on retrouvera.
Parmi ces deux cas, il est probable que le second soit plus courant, car il correspond à un automate lié à un type de grammaire couramment utilisé.
Attention ! Se baser sur ce fait et introduire du code tenant compte de l'ordre d'évaluation réduira la portabilité de votre programme.