On écrit effr
. En effet, on affiche dabord le caractère 'e
' (*++p
: le pointeur est incrémenté puis déréférencé), puis 'f
' (dans ++*p
, p nest 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 dincré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 dorigine s sest transformée en "vfrte
".
Notons que vu la façon dont lopérateur <<
agit sur les fichiers de sortie (voir chapitre 9), lécriture :
cout << *++p << ++*p << *(p++) << *p++;
aurait provoqué laffichage de la chaîne tsev
, la chaîne dorigine étant transformée en "veste
". En effet, dans ce cas, les arguments sont évalués de droite à gauche, et affichés dans lordre inverse, à cause des appels imbriqués de la procédure daffichage.
Tout cela explique pourquoi il est préférable déviter ce genre décriture peu claires !