C'est vrai que j'ai tendance à plus faire du C++ que du C, et donc la pré-incrémentation a du sens. Ceci dit, le compilateur n'est pas contraint d'optimiser, et une variable temporaire peut donc être générée lors de la post-incrémentation pour récupérer le résultat de la post-incrémentation.
À titre d'illustration, en C++, on surcharge classiquement l'opérateur de post-incrémentation ainsi (T étant un type quelconque) :
// Post incrémentation
T const operator ++(typename const & target)
{
T tmp(target) ;
++target ;
return tmp ;
}
// Pré incrementation
T const & T::operator ++(int)
{
// On fait l'incrémentation ici
return *this
}
On voit bien que la post-incrémentation devrait créer une copie temporaire à retourner (même si c'est un objet anonyme qui est créé, ça dépend des options d'optimisation).
L'incrémentation ne devrait pas être faire en même temps qu'une autre opération : le C ne garanti pas forcément un ordre d'exécution des instruction dans une même expression. Le choix est laissé à l'implémentation. Par exemple, dans l'expression suivante, le résultat est indéterminé par le standard C. f(i++, i -=2) ;
Donc non, la post-incrémentation est à proscrire sauf cas particuliers.
[^] # Re: Sécurité ?
Posté par LupusMic (site web personnel, Mastodon) . En réponse à la dépêche Un nouveau serveur httpd : Ashd, A Sane HTTP Daemon. Évalué à -2.
À titre d'illustration, en C++, on surcharge classiquement l'opérateur de post-incrémentation ainsi (T étant un type quelconque) :
// Post incrémentation
T const operator ++(typename const & target)
{
T tmp(target) ;
++target ;
return tmp ;
}
// Pré incrementation
T const & T::operator ++(int)
{
// On fait l'incrémentation ici
return *this
}
On voit bien que la post-incrémentation devrait créer une copie temporaire à retourner (même si c'est un objet anonyme qui est créé, ça dépend des options d'optimisation).
L'incrémentation ne devrait pas être faire en même temps qu'une autre opération : le C ne garanti pas forcément un ordre d'exécution des instruction dans une même expression. Le choix est laissé à l'implémentation. Par exemple, dans l'expression suivante, le résultat est indéterminé par le standard C.
f(i++, i -=2) ;Donc non, la post-incrémentation est à proscrire sauf cas particuliers.