2014-10-17 9 views
16

Nie jestem pewien, czy oświadczenie poniżej jest dobrze zdefiniowany przez standardowe C lub nieCzy * p ++ + = 2 jest dobrze zdefiniowane?

*p1++ += 2; 

lub innej podobnej klauzuli:

*E1++ <operator>= E2 

od standardowych C o post-przyrostu:

Wynikiem operacji Postfiks ++ jest wartość argumentu operacji. Po uzyskaniu wyniku wartość argumentu jest zwiększana. (Oznacza to, że dodano wartość 1 odpowiedniego typu.) Zobacz dyskusje na temat operatorów dodatków i złożonych dla dla informacji o ograniczeniach, typach i konwersjach oraz o skutkach operacji na wskaźnikach. Efekt uboczny aktualizacji przechowywanej wartości argumentu będzie występować pomiędzy punktem poprzednim i następnym sekwencji.

I o coumpund-przypisania:

Przypisanie związek op postać E1 = E2 różnym od prostego przypisania ekspresji E1 = E1 op (E2), wyłącznie tym lwartością E1 ocenione tylko raz.

+0

Cóż, co dokładnie wywołało podejrzenie, że może być nieokreślone? Dla mnie na przykład wszystko wygląda dobrze, co sprawia, że ​​trudno mi nawet zacząć odpowiadać na pytanie: nie wiem na czym się skupić. – AnT

+2

Nie pisz kodów w projekcie takim jak ten, z wyjątkiem badań nad nim. – wshcdr

+9

Pisanie tego rodzaju nieczytelnego kodu, aby dodać więcej kodu w jednym wierszu, jest złym programowaniem. :) – Almo

Odpowiedz

23

Załóżmy przepisać lekko aby uczynić go bardziej jasne:

(*p1++) += 2 

Więc stara wartość p1 będą dereferencjonowane i 2 zostaną dodane do jego referenta. I p1 zostanie zwiększony po dereferencji (lub przynajmniej po wczytaniu starej wartości i oczekiwaniu na dereferencję). Nie ma problemu: żadne z elementów nie jest używane więcej niż jeden raz.

Mając na uwadze powyższe, należy rozważyć przepisanie kodu dla jasności:

*p1 += 2; 
++p1; 
+9

"wtedy" nie jest całkiem poprawne, efekt uboczny + = może wystąpić przed lub po efekcie ubocznym ++. Kluczowe jest to, że znajdują się one na różnych obiektach skalarnych. – Cubbi

3

Postfix operator inkrementacji (++) daje wartość argumentu, to znaczy daje wartość R. Wartość r oznacza, że ​​jest ona używana po lewej stronie operatora przypisania (=) jako operand.

int i = 0; 
i++ = 0 // [Error] lvalue required as left operand of assignment 

W przypadku

*p1++ += 2; 

Postfix ++ nie jest stosowana na *p1, ale jest stosowany do wskaźnika p1++. Jest tak, ponieważ Postfix ++ ma wyższy priorytet niż operator derereferencji *. Tak, kompilator będzie analizować powyższe oświadczenie

*(p1++) += 2; 

a ten mówi, że:

  • *p1 musi być oceniana (w celu wytworzenia zmiennej) przed dodaniem 2 i przypisywanie wynik do niego.
  • Wynik do zapisania do *p1 musi zostać oceniony przed przyrostem do p1.
  • Po oszacowaniu *p1 można w dowolnym momencie zwiększyć inkrementację p1.
+0

Czy ostatnie oświadczenie jest gwarantowane w C++? – BlueTrin

+0

@ BlueTrin; Tak. – haccks

+1

Pomyślałbym, że gdy oceni się "p1", w każdej chwili może być zwiększane "p1". – BlueTrin

Powiązane problemy