web-dev-qa-db-fra.com

Pourquoi plusieurs opérateurs de décrémentation ne fonctionnent-ils pas en C lorsqu'ils fonctionnent en C ++?

En regardant this question et en essayant une partie du code:

int x = 100;

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

J'ai tenté de compiler avec gcc et j'ai eu l'erreur suivante:

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

Mais compiler avec g++ travaux. Pourquoi ce code est-il valide en C++ mais pas en C?

48
MD XF

En C, --x Est une valeur, pas une valeur l. Son effet est de décrémenter x et d'évaluer la nouvelle valeur assignée de x. Puisque --x N'est pas une valeur l, il ne peut pas être décrémenté.

En C++, --x Est une valeur l, pas une valeur r. Son effet est de décrémenter x, et d'évaluer à x comme une valeur l. Étant donné que --x Est à nouveau une valeur l, elle peut à nouveau être décrémentée.

La raison pour laquelle il est logique que --x Soit une valeur l en C++ est que C++ a introduit des types de référence. Donné

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 C n'a pas de types de référence, il n'y a pas grand intérêt à ce que --i Soit une valeur l. Historiquement, cela n'a jamais été le cas, et contrairement à C++, C n'a jamais trouvé de raison impérieuse de modifier les règles.

Notez que C++ nécessitait des modifications plus approfondies que de faire de --x Une valeur l pour le laisser fonctionner. Faire de --x Une valeur l, sans autre chose, rendrait --x Un comportement indéfini, car il n'y aurait pas de point de séquence entre la modification de x et la valeur l suivante à conversion de valeur. Encore plus clairement pour ----x. C++ a dû modifier les règles de séquençage pour le faire fonctionner. En C, les modifications des règles de séquençage peuvent entraîner des problèmes pour que les compilateurs existants se conforment aux nouvelles règles, de telles modifications seraient donc probablement rejetées à moins qu'il y ait un gros avantage.

90
user743382