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 !