2011-02-16 3 views
8

Mon professeur et moi nous sommes lancés dans un débat sur l'opérateur + = en C. Il dit que + = ou = + fonctionnera, mais il n'est pas certain pourquoi = + travaux.C Programmation: + = vs = +

int main() 
{ 
    int i = 0, myArray[5] = {1,1,1,1,1}; 

    while(i < 5) 
    { 
      myArray[i] += 3 + i; 
      printf("%d\n", myArray[i]); 
      i++; 
    } 

    system("pause"); 
} 

La sortie produira 4, 5, 6, 7, 8. La modification de l'opérateur + = à + donne les mêmes résultats. Cependant - = ne fait pas la même chose que = - (ce qui est évident car il traite le 3 comme un 3).

Alors gourous C:

  • Pourquoi ce travail avec = +?
  • Comment un compilateur C traite-t-il = + par rapport à + =?
+3

En utilisant quel compilateur donne-t-il les mêmes résultats ??? –

+3

La modification de l'opérateur à = + donne '3,4,5,6,7'. Peut-être avez-vous oublié de sauvegarder le fichier source avant de le recompiler ou quelque chose? – mtrw

+2

Votre professeur est incompétent et devrait prendre sa retraite. –

Répondre

22

Il a tort; += est complètement différent de =+. L'expression x =+ 3 est analysée en tant que x = (+3).
Ici, + devient l'opérateur unaire + (plutôt inutile). (l'opposé de la négation)

L'expression x =- 3 est analysée en tant que x = (-3), en utilisant l'opérateur de négation unaire.

1

+ est également un opérateur unaire comme l'est -.

+0

Vous manquez le saut logique qui fait que cela répond à la question. –

+1

Pour des questions comme celle-ci (questions non API), j'aime donner la réponse la moins spécifique qui va pousser l'affiche dans le sens de la solution. Tout ce que j'ai appris et je me suis souvenu que je suis arrivé à moi-même. Tout ce que j'ai oublié m'a été spoonfé. – Novikov

3

code

myArray[i] += 3 + i; 

donnera myArray[i] = myArray[i] + 3 + i;

alors

myArray[i] =+ 3 + i; 

cède myArray[i] = 3 + i

c'est ce que je suis.

14

Votre professeur se souvient anciennes versions de C dans lequel =+, =-, etc =* désigne en fait la même chose que +=, -=, *= etc. (Nous parlons plus que la version généralement appelée .. "K & R" ici la version 6 UNIX, si ma mémoire est bonne)

En actuelles versions de C, ils ne signifient pas la même chose; les versions avec le signe égal en premier seront analysées comme s'il y avait un espace entre les égaux et tout ce qui vient après. Cela se produit pour produire un programme valide (mais pas un programme qui fait ce que vous attendez) pour =- et =+ car - et + peuvent être utilisés comme opérateurs unaires.

=* ou =/ pourrait être utilisé pour régler l'argument.a *= 3 multipliera a par trois, et a /= 3 va diviser par trois, mais a =* 3 est une erreur sémantique (parce que unaire * ne peut être appliqué à des pointeurs) et a =/ 3 est une erreur de syntaxe (parce que / peut pas être utilisé comme unaire opérateur).

+0

Oui, si vous regardez le code dans le livre des Lions, vous verrez qu'il épelle l'opérateur comme '= +' (il contient aussi d'autres exemples de C de la période, comme l'utilisation de l'opérateur '. types de structure). – caf

+1

Voici le manuel B (C a été adapté de B) à: http://cm.bell-labs.com/cm/cs/who/dmr/kbman.html. Il montre les opérateurs d'égalité avec le signe égal dans la première position. –

+1

= + a été remplacé par + = lors du passage d'Unix version 6 à Unix version 7 dans les années 70, lorsque de nombreuses autres modifications ont été apportées au langage C, principalement grâce à l'utilisation de machines autres que le PDP. 11. –