48 votes

Pourquoi les opérateurs de décrémentation multiple ne fonctionnent-ils pas en C alors qu'ils fonctionnent en C++ ?

Regarder ce et de tester une partie du code :

int x = 100;

while ( 0 <-------------------- x )
{
    printf("%d ", x);
}

J'ai essayé de compiler avec gcc et j'ai obtenu l'erreur suivante :

file.c: In function 'main':
file:c:10:27: error: lvalue required as decrement operand
 while ( 0 <-------------------- x )

Mais la compilation avec g++ travaux. Pourquoi ce code est-il valable en C++ mais pas en C ?

91voto

En C, --x est une valeur, pas une lvalue. Son effet est de décrémenter x et l'évaluer à la valeur nouvellement attribuée de x . Puisque --x n'est pas une lvalue, elle ne peut pas être décrémentée.

En C++, --x est une lvalue, pas une rvalue. Son effet est de décrémenter x et évaluer à x en tant que valeur l. Puisque --x est à nouveau une lvalue, elle peut être décrémentée à nouveau.

La raison pour laquelle il est logique que --x pour être une lvalue en C++ est parce que C++ a introduit les types de référence. Étant donné que

void f(int &);
int i;

il peut être judicieux d'appeler f(--i) qui passe i par référence après l'avoir décrémenté.

Puisque le C n'a pas de types de référence, il n'y a pas d'utilité à --i étant une lvalue. Historiquement, cela n'a jamais été le cas, et contrairement au C++, le C n'a jamais eu de raison impérieuse de changer les règles.

Notez que le C++ a nécessité des modifications plus importantes que de faire --x une lvalue pour que cela fonctionne. Création de --x une lvalue, sans rien d'autre, rendrait --x comportement non défini, parce qu'il n'y aurait pas de point de séquence entre la modification de la x et la conversion subséquente de lval en valeur. C'est encore plus évident pour ----x . Le C++ a dû modifier les règles de séquençage pour que cela fonctionne. En C, les modifications des règles de séquençage pourraient poser des problèmes aux compilateurs existants pour se conformer aux nouvelles règles, de sorte que de telles modifications seraient probablement rejetées à moins qu'elles ne présentent un avantage important.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X