web-dev-qa-db-fra.com

Quelle est la différence entre les opérateurs d'affectation + = et = + C

Je me demandais s'il y avait une différence entre =+ et += (et d'autres opérateurs d'affectation également). J'ai essayé et les deux ont fait la même chose. Y a-t-il donc une différence ou une convention? Les deux fonctionnent-ils parce que mes compilateurs ne vérifient pas les standards?

Edit: j'ai fait une erreur. J'ai utilisé de mauvaises entrées lors de mes tests, ce qui m'a amené à penser qu'ils faisaient tous les deux la même chose. Il s'avère que ce sont deux choses différentes.

+= opérateur ajoute rvalue à lvalue

x += y;
x = x + y;

=+ simplement attribue rvalue à lvalue

x =+ y;
x = +y;
x = y;
6
Michael

En C moderne, ou même en C modérément ancien, += est un opérateur d'affectation composé, et =+ est analysé comme deux jetons distincts. = et +. Les jetons de ponctuation peuvent être adjacents.

Donc, si vous écrivez:

x += y;

c'est équivalent à

x = x + y;

sauf que x n'est évalué qu'une seule fois (ce qui peut être important si c'est une expression plus compliquée).

Si vous écrivez:

x =+ y;

alors il est analysé comme

x = + y;

et le + est un opérateur unaire plus.

Très les premières versions de C (vers le milieu des années 1970, avant la publication de K & R1 en 1978) utilisaient différents symboles pour les affectations composées. Où le C moderne utilise +=, début C utilisé =+. Début C n'avait pas unaire +, mais il avait un unaire -, et l'utilisation de =- a causé des problèmes; les programmeurs écriraient x=-y voulant dire x = -y, mais il a été interprété en silence comme x =- y. La langue a été modifiée quelque temps avant 1978 pour éviter ce problème. Pas plus tard qu'en 1999, j'ai travaillé avec un compilateur (VAXC sur VMS) qui avertissait d'une utilisation ambiguë de =-, mais utiliserait l'ancien sens. Cela ne devrait plus être un problème à moins que vous ne soyez un amateur qui joue avec des très anciens logiciels et/ou matériels.

11
Keith Thompson