2011-12-05 12 views
5

mam to oświadczenie:Operator Pierwszeństwo w C - Zwracanie wartości

return *local_stack_var2++ + 42;

byłyby one odpowiednie kroki, gdy złamanie go:
1. dereference local_stack_var2
2. Dodać 42 do dereferencje local_stack_var2 (funkcja faktycznie zwróci tę wartość)
3. Zanim funkcja się zakończy, aktywuje post-inkrementację, zwiększając wartość obiektu wskazywanego przez local_stack_var2

Czyli w formacie kodu wyglądałoby to trochę tak?

int temp = *local_stack_var2 //step 1; 
int returnValue = temp + 42; //step 2, compiler will return THIS value  
*local_stack_var2 = *local_stack_var2 + 1; //step 3 
return returnValue; 

Dzięki!

+0

Pierwszeństwo pierwszeństwa i pierwszeństwo ... –

Odpowiedz

8

Zamknij, ale ++ (postincrement) ma wyższy priorytet niż unary *, więc to się dzieje najpierw. Kolejność operacji byłoby:

  1. post przyrost local_stack_var2 tak, że zwiększa się o jeden, ale wyrażenie do wartości pierwotnej, a nie zwiększana wartość
  2. dereference tej pierwotnej wartości
  3. dodać 42 co uzyskano przez dereferencji wyżej wymienionych wartości pierwotnej
  4. zwrot tej wartości

Więc w kodzie, to byłoby jak (nie dokładnie, ale blisko)

int* temp = local_stack_var2; 
local_stack_var2 = local_stack_var2 + 1; 
int retval = *temp; 
reval = retval + 42; 
return retval; 
+0

postincrement niekoniecznie zdarzyć * najpierw *. '++' mający wyższy priorytet niż '*' oznacza tylko, że jest 'local_stack_var2', który jest inkrementowany, a nie' * local_stack_var2' - pierwszeństwo kontroluje * co * jest inkrementowane, a nie * kiedy * jest zwiększane. Rzeczywisty przyrost może nastąpić w dowolnym momencie, dopóki funkcja nie powróci. – caf

+0

@ tak, tak właśnie myślałem, kiedy dodałem "podoba mi się" kursywą i dodano "(nie dokładnie, ale blisko)". Technicznie rzecz biorąc, żaden sposób, w jaki byś to napisał, byłby prawidłowy z tego powodu, ale nie sądziłam, że byłaby wystarczająco ważna, aby dotyczyć PO tym. –