2013-07-31 19 views
5

Jestem zdezorientowany tym, jak ten kod zostanie wykonany. Przypuśćmy, że mamyróżnica między * y ++ a ++ * y?

int x=30,*y,*z; 
y=&x; 

jaka jest różnica między * y ++ a ++ * y? a także jaki będzie wynik tego programu?

#include<stdio.h> 
int main(){ 

    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; 
    x++; 
    printf("%d %d %d ",x,y,z); 
    return 0; 
} 
+1

Pomyśl o '++ * y' i' * ++ y'. –

+0

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

+1

Nie możesz po prostu * uruchom * program, który znajduje wyjście? (Cóż, jeśli naprawisz to, aby nie mieć niezdefiniowanego zachowania najpierw ...) –

Odpowiedz

8

Wyrażenie x = *y++ to efekty takie same jak:

x = *y; 
y = y + 1; 

A jeśli wyrażenie jest tylko *y++; (bez przyporządkowania) następnie jej nic, ale takie same jak y++;, czyli y początek wskazując na następnym miejscu po przyrost.

drugie wyrażenie ++*y oznacza przyrost wartości wskazanych przez y że samo jak: *y = *y + 1; (nie wskazówka zwiększany) Lepiej będzie jasne z odpowiedzi na pierwsze pytanie:

Załóżmy, że Twój kod jest:

int x = 30, *y; 
int temp; 
y = &x; 

temp = *y++; //this is same as: temp = *y; y = y + 1; 

Pierwsza *y zostanie przypisana do zmiennej temp; w związku z tym temp przypisany 30, a następnie wartość y zwiększa się o jeden i punkt początkowy do następnej lokalizacji po lokalizacji x (gdzie naprawdę nie ma żadnej zmiennej).

Następna sprawa: Załóżmy, że Twój kod jest:

int x = 30, *y; 
int temp; 
y = &x; 

temp = ++*y; //this is same as *y = *y + 1; temp = *y; 

Pierwsza wartość przyrostów *y z 30 do 31 a następnie 31 jest przypisany do temp (Uwaga: x jest teraz 31).

następne części pytania (czytaj komentarze):

int x = 30, *y, *z; 

y = &x;  // y ---> x , y points to x 
z = y;  // z ---> x , z points to x 
*y++ = *z++; // *y = *z, y++, z++ , that is 
       // x = x, y++, z++ 
x++;   // increment x to 31 
5

jaka jest różnica między * y ++ i ++ * y?

W przypadku wyrażenia *y++ i *z++; ponieważ wersja Postfix ++ ma pierwszeństwo przed *, kompilator widzi to jako;

*(y++) = *(z++); 

W przypadku ++*y; kompilator widzi to jako ++(*p) i najpierw zwiększy wartość obiektu, który wskazuje (x w tym przypadku), a następnie zwraca jego zwiększoną wartość.

Tabela podsumowująca inne możliwości;

Expression     Meaning 
------------------------------------------------------------------------------------- 
*y++ or *(y++)   Value of expression is *y before increment; increment y latter 
(*y)++     Value of expression is *y before increment; increment *t later 
*++y or *(++y)   Increment y first; value of expression is *y after increment 
++*y or ++(*y)   Increment *y first; value of expression is *y after increment 

EDIT: Jak podkreślił Eric Lippert w swoim komentarzu, że mówiąc: wartość wyrażenia jest *y przed przyrost, przyrost y później jest mylące, chcę wyjaśnić tutaj, że słowa, które Ten ostatni stosowany i po podkreślić, że poprzednie lub następnego wartości *y odpowiednio zostanie używaj w wyrażeniach.
Należy zauważyć, że efekt uboczny może być wytwarzany w dowolnej kolejności, albo efekt uboczny produkuje jako pierwszy, a przypisana wartość jako pierwsza, albo wartość przypisana jako pierwsza, a efekt uboczny wytwarza drugą. Aby uzyskać więcej szczegółów, przeczytaj odpowiedzi: - 1, 2 podana przez Eric Lippert.

+0

Najpierw usuń poziomy przewijak .. –

+0

myślisz "* y ++" == '* (y ++) '**? ** –

+0

Tak. Jest poprawna. – haccks

1

Ufam, że rozumiesz, co operatory ++ i * oznaczają, gdy są używane osobno. Gdy są używane razem, pierwszeństwo ma operator. W C++ operator ++ ma wyższy priorytet niż operator *. Zatem skutecznie *y++ oznacza *(y++) i ++y* oznacza (++y)*. Mam nadzieję, że to pomoże.

+1

Istnieje błąd w SO. Napisałem "* (y ++)" i widzę go wyraźnie, kiedy zaczynam edytować, ale wyświetla się tylko "(y ++)". –

+0

Nie błąd: przeczytaj: http://stackoverflow.com/editing-help –

+0

To nie jest błąd. '*' ma specjalne znaczenie w edytorze. Przeczytaj faq na ten temat. Edytowałem, żeby było jasne ... I witajcie w SO. –

6

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ść.

Powiązane problemy