De ce este `i += i++` 1 în C și 0 în C#? [duplicat] (Programare, C#, C, Operator Postfix)

zeronone a intrebat.

Posibil duplicat:
Ar putea cineva să explice aceste comportamente nedefinite (i = i++ + ++i , i = i++, etc…)

A fost o întrebare foarte frumoasă pe Stack overflow.

Pentru i = 0, de ce (i += i++) este egal cu 0?

Dar când am încercat același cod în C, a dat rezultate diferite:

int i = 0;          
i += i++;          // 1 in C and 0 in C#
printf("%d", i);

Dar următoarele:

i = i++ + i;       // 1 in C and 1 in C#
i += i++ + i;      // 1 in C

În C# se evaluează ++ și =+ operatori, mai întâi prin atribuirea tempVar pentru fiecare dintre ei și efectuând apoi operația pe tempVars. Cum o implementează C? Sau este diferit în funcție de arhitectură?

Comentarii

  • Pentru că un comportament nedefinit este nedefinit? –  > Por Xymostech.
  • Standardul C++, în infinita lor înțelepciune, a făcut ca ordinea în care sunt evaluate expresiile să fie nedefinită. –  > Por Robert Cooper.
  • @Hot Licks: „Nu este specificat dacă += sau ++ va fi evaluat primul.” — de fapt, nu este deloc o problemă. Precedența operatorilor spune clar ++ va fi evaluat primul –  > Por zerkms.
  • @zerkms – Nu chiar. Precedența nu este același lucru cu ordinea de evaluare. –  > Por Hot Licks.
  • @zneak i = i++ este, de asemenea, doar un comportament nedefinit. –  > Por Daniel Fischer.
1 răspunsuri
igon

Standardul C nu specifică o ordine de evaluare. Aceasta este lăsată la latitudinea implementării compilatorului.

Comentarii

  • Ordinea de evaluare a ce anume? –  > Por zerkms.
  • După cum ați spus în comentariu, nu se știe dacă += sau ++ este evaluat primul –  > Por igon.
  • Asta nu este important, pentru că în cazul de test, expresia este i++ + i (spre deosebire de ceea ce se afirmă în titlul întrebării). Care dintre ele este evaluată prima este nedefinită. –  > Por zneak.
  • @igon: Nu am spus asta. Se știe care este evaluat mai întâi – ++, , din cauza precedenței operatorilor. Nu este un răspuns? –  > Por zerkms.
  • Cred că da, deși văd că întrebarea a fost închisă… –  > Por igon.