jaka jest różnica między *y++
a ++*y
?
Znaczenie wyrażenia w języku C charakteryzuje się dwie rzeczy: co wartość produkuje i co skutki uboczne produkuje.
Przeanalizujmy pierwsze wyrażenie.
Przyrostek Postfix ma wyższy priorytet niż dereferencje, więc jest to *(y++)
.
Przyrostek przyrostka powoduje efekt uboczny: zmienia wartość y
, wskazując inną lokalizację. Przyrostek przyrostkowy również generuje wartość: wartość, którą miał y
, zanim została zwiększona. Operator *
następnie odrzuca tę wartość, aby wytworzyć wartość l: to jest coś, co można wykorzystać jako zmienną, do przechowywania lub pobierania.
Zauważam, że efekt uboczny może wystąpić w dowolnym momencie przed lub po zakończeniu dereferencji. Jeśli powiedział
q = *y++
wówczas efektem ubocznym ++
może się zdarzyć w dowolnym momencie. Może to być:
q = *y;
y = y + 1;
lub mógłby być traktowany jako
t = y;
y = y + 1;
q = *t;
Oba są całkowicie legalne. (Z wyjątkiem oczywiście, że jeśli y
sam jest wyrazem z efektami ubocznymi, te efekty uboczne muszą być wytwarzane tylko raz. Dla jasności, zrobię to założenie przez cały czas.)
Co powiecie na ++*y
? Jest to proste: *y
tworzy zmienną, zawartość zmiennej jest zwiększana, a wartość wyrażenia jest wartością inkrementowaną. Należy zauważyć, że kolejny efekt uboczny może być wytwarzany z kolejnością:
q = ++*y
można traktować jako:
t = *y + 1;
*y = t;
q = t;
lub
t = *y + 1;
q = t;
*y = t;
Pamiętaj, C nie powodują bardzo wiele ograniczeń w kolejności występowania efektów ubocznych, więc należy zachować ostrożność.
Pomyśl o '++ * y' i' * ++ y'. –
Widzę, że masz do czynienia ze wskaźnikami, ale może to pomóc: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops
Nie możesz po prostu * uruchom * program, który znajduje wyjście? (Cóż, jeśli naprawisz to, aby nie mieć niezdefiniowanego zachowania najpierw ...) –