Solution de l’exercice 3.3

On écrit effr. En effet, on affiche d’abord le caractère 'e' (*++p : le pointeur est incrémenté puis déréférencé), puis 'f' (dans ++*p, p n’est pas modifié, mais seulement le caractère pointé par p, à savoir 'e', qui est incrémenté), puis 'f' encore (dans *(p++), le pointeur est déréférencé et post-incrémenté : p pointe donc à présent sur 'r'), puis 'r' (car *p++ équivaut à *(p++), puisque les opérateurs de déréférencement et d’incrémentation ont la même priorité et s’évaluent de droite à gauche). En fin de compte, p pointe sur la chaîne restante "te", tandis que la chaîne d’origine s s’est transformée en "vfrte".

Notons que vu la façon dont l’opérateur << agit sur les fichiers de sortie (voir chapitre 9), l’écriture :

cout << *++p << ++*p <<  *(p++) << *p++; 

aurait provoqué l’affichage de la chaîne tsev, la chaîne d’origine étant transformée en "veste". En effet, dans ce cas, les arguments sont évalués de droite à gauche, et affichés dans l’ordre inverse, à cause des appels imbriqués de la procédure d’affichage.

Tout cela explique pourquoi il est préférable d’éviter ce genre d’écriture peu claires !


Retour au texte.