49 votes

Que signifie = + en C?

Je suis tombé sur =+ par opposition à la norme += aujourd'hui dans certains codes C; Je ne suis pas tout à fait sûr de ce qui se passe ici. Je ne pouvais pas non plus le trouver dans la documentation.

78voto

Jerry Coffin Points 237758

Dans les versions anciennes de C, =+ était équivalent à += . Des restes de celui-ci ont été trouvés à côté des premiers os de dinosaures. De plus, cela n'a pas de signification particulière - c'est juste un = suivi d'un + .

37voto

Jonathan Leffler Points 299946

Vous pouvez trouver des preuves de l'ancienne notation de la 7ème Édition du Manuel UNIX (Vol 2a) daté de janvier 1979, disponible en ligne à http://cm.bell-labs.com/7thEdMan/.

Le chapitre est intitulé"C Manuel de Référence"de Dennis M. Ritchie, et est dans la version PDF du manuel, mais pas dans la version HTML. Dans la partie pertinente, il dit:

7.14.1 lvalue = expression

La valeur de l'expression remplace celle de l'objet visé par la lvalue. Les opérandes n'ai pas besoin de l' même type, mais les deux doivent être de type int, char, float, double, ou un pointeur. Si aucun opérande est un pointeur, l'affectation se déroule comme prévu, éventuellement précédé par la conversion de l'expression à droite. Lorsque les deux opérandes sont de type int ou des pointeurs de toute nature, pas de conversion a lieu; la valeur de l'expression est simplement stockée dans l'objet visé par la lvalue. Ainsi, il est possible de générer des pointeurs qui sera la cause de l'adressage des exceptions lorsqu'il est utilisé.

7.14.2 lvalue =+ expression
7.14.3 lvalue =- expression
7.14.4 lvalue =* expression
7.14.5 lvalue =/ expression
7.14.6 lvalue =% expression
7.14.7 lvalue =>> expression
7.14.8 lvalue =<< expression
7.14.9 lvalue =& expression
7.14.10 lvalue =^ expression
7.14.11 lvalue = | expression

Le comportement d'une expression de la forme ‘E1 =op E2" peut être déduit en prenant comme équivalent à ‘E1 = E1 op E2"; cependant, E1 est évaluée qu'une seule fois. En outre, les expressions comme ‘i =+ p", dans lequel un pointeur est ajouté à un nombre entier, sont interdits.


Séparément, il y a un papier 'Évolution de C' par L Rosler dans le "SYSTÈME UNIX®: Lectures et Applications, Volume II", initialement publié par AT&T, comme leur Revue Technique pour le mois d'octobre 1984, plus tard publié en 1987 par Prentice Hall, (ISBN 0-13-939845-7). Une partie de ce qui est:

III. La Gestion Des Changements Incompatibles

Inévitablement, certaines des modifications qui ont été apportées modifier la sémantique de l'existant valide les programmes. Ceux qui maintiennent les différents compilateurs utilisés à l'interne essayer de faire en sorte que les programmeurs ont avertis que ces changements prennent effet, et que l'introduction d'une nouvelle version du compilateur n'a pas la force de tous les programmes à être recompilé immédiatement.

Par exemple, dans les premières implémentations de l'expression ambiguë x=-1 a été interprété comme "décrémenter x par 1". Il est maintenant interprété comme "affecter la valeur -1 pour x". Ce changement a eu lieu au cours des trois versions majeures. Tout d'abord, le compilateur et l' lint programme vérificateur ont été modifiés afin de générer un message d'avertissement sur la présence d'un "old-fashioned" de cette opération, comme l' =-. Ensuite, les analyseurs ont été modifiés pour la nouvelle sémantique, et les compilateurs mis en garde contre une ambigu opération d'affectation. Enfin, les messages d'avertissement ont été éliminés.

Soutien pour l'utilisation d'un "old-fashioned de l'initialisation"

int x 1;

(sans un signe égal) a été supprimée par une stratégie similaire. Cela permet à l'analyseur de produire plus intelligent de la syntaxe d'erreur de diagnostic.

Comme prévu, quelques C utilisateurs ignoré les avertissements jusqu'à l'introduction de l'incompatibles compilateurs forcés à choisir entre l'évolution de leur obsolètes code source ou de prendre en charge l'entretien de leurs propres versions du compilateur. Mais sur l'ensemble de la stratégie de progressive changement a été un succès.

12voto

user786653 Points 9811

C'est juste une cession suivie par unaire plus.

 #include <stdio.h>
int main() {
    int a;
    a =+ 5;
    printf("%d\n",a);
    return 0;
}
 

Imprime "5". Changer a =+ 5 à a =- 5 et il affiche "-5". Un moyen plus facile de lire a =+ 5 est probablement a = +5 .

9voto

onemasse Points 2851

C'est une ancienne variante défunte de '+ ='. Dans les compilateurs modernes, cela équivaut à un opérateur d'affectation suivi d'un '+' unaire.

5voto

Heinzi Points 1491

je pense

 a =+ 5;
 

devrait être équivalent à

 a = (+5);
 

et donc être un code de très mauvais style.

J'ai essayé le code suivant et il a imprimé "5":

 #include <iostream>
using namespace std;

int main()
{
    int a=2;
    a =+ 5;
    cout << a;
}
 

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