[c] Post/pre inkrementacja
Idź do strony 1, 2  Następny
 
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> C/C++
Autor Wiadomość
zxczxc1
~user




Dołączył: 18 Paź 2008
Posty: 3


PostWysłany: 18-10-08 20:18 Zacytuj zaznaczone Odpowiedz z cytatem

Proszę o pomoc Wink
Proszę o podanie krok po kroku jak się wyznacza to i=(i++)+(++x)+(x++);

int i=1;
int x=0;
i=(i++)+(++x)+(x++);

z góry dzięki
pozdrawiam madzia ;*
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
erizo
~user




Dołączył: 24 Sie 2008
Posty: 578

Pomógł: 33

PostWysłany: 18-10-08 20:35 Zacytuj zaznaczone Odpowiedz z cytatem

zum Beispiel:
i=1;
x=2;
i=(i++)+(++x)+(x++);
i= 1 + 3 + 2;
i = 6;

Czyli, przy preinkrementacji najpierw zwieksza i uzywa juz zwiekszonej zmiennej, a przy postinkrementacji najpierw bierze wartosc (ktora np. uzyje do obliczenia danego wyrazenia), a pozniej zwieksza ta zmienna.

To tak po 'ludowemu' staralem sie wylozyc.

_________________
Całe życie na farcie i chciałbym tak do końca
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
tobix10
~user




Dołączył: 01 Gru 2007
Posty: 490

Pomógł: 44

PostWysłany: 19-10-08 10:00 Zacytuj zaznaczone Odpowiedz z cytatem

i = 7 bo i = 1 +3 + 3 (x byl inkrementowany tzn ze do nastepnego dzialania bedzie brana juz wartosc wieksza o 1 ) Smile no a x na sam koniec bedzie wynosil 4(przez ta ostatnia postinkrementacje )

// tak poza tym to ostatecznie i wyniesie 8 Smile troche zagmatwane ale w dzialaniu przeciez jest i++
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
erizo
~user




Dołączył: 24 Sie 2008
Posty: 578

Pomógł: 33

PostWysłany: 19-10-08 10:27 Zacytuj zaznaczone Odpowiedz z cytatem

no fakt, sorry <tempy łeb>

_________________
Całe życie na farcie i chciałbym tak do końca
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
zxczxc1
~user




Dołączył: 18 Paź 2008
Posty: 3


PostWysłany: 19-10-08 14:31 Zacytuj zaznaczone Odpowiedz z cytatem

Mi się wydaje, że rozwiązanie tego problemu nie jest takie oczywiste i działanie tej instrukcji jest nieprzewidywalne ze względu na to, że język C nie określa w jakiej kolejności wykonywać instrukcje...

Czyli nie można podać wyniku...

mam rację?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
moras
#Moderator




Dołączył: 17 Lut 2005
Posty: 721

Pomógł: 13

PostWysłany: 19-10-08 15:18 Zacytuj zaznaczone Odpowiedz z cytatem

Mylisz się, z dwóch powodów:
1. ANSI C jest gorliwie wartościowany
2. arytmetyczny operator + jest lewostronnie łączny

stąd podana przez ciebie instrukcja
c:
i=(i++)+(++x)+(x++);

nawiasuje się jako
c:
i=((i++)+(++x))+(x++);
to znaczy że przed obliczeniem 'głównej' sumy najpierw wartościujemy jej lewy argument analogicznie dla sumy wewnętrznej zwartościujemy najpierw lawy.

Wiemy ze i = 1 oraz x = 2*. Oznaczmy przez W wynik wyrazenia z prawej strony równości.

W = ( 1 + (++x) ) + (x++) instrukcja nie skończyła się wiec na razie nie zwiększamy
W = ( 1 + 3 ) + (x++) inkrementacja przed sumowaniem

Wiemy teraz ze i=1 oraz x=3

W = 4 + (x++) sumujemy lewy argument
W = 4 + 3 wstawiamy wartość x, nie inkrementujemy
W = 7

Przypisujemy wartość i = W. Otrzymujemy i = 7.
W tym momencie zakończyło się wykonanie instrukcji. Przechodzimy do zapamiętanych w jej trakcie inkrementacji
c:
i++
i
c:
x++

Otrzymujemy: i = 8 oraz x = 4.

*) teraz doczytałem, że pierwotnie x = 0. Nie chce mi się zmieniać, tym bardziej ze nie wnosi to niczego nowego w rozumowanie.


Użytkownik otrzymał punkt pomocy za ten post.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
bercik
~user



Ostrzeżenia: 1
Dołączył: 18 Paź 2008
Posty: 902
Skąd: Kraków
Pomógł: 27

PostWysłany: 19-10-08 16:10 Zacytuj zaznaczone Odpowiedz z cytatem

Hmmm...A nie łatwiej napisać jakiś program ,który by to obliczył?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
tobix10
~user




Dołączył: 01 Gru 2007
Posty: 490

Pomógł: 44

PostWysłany: 19-10-08 16:16 Zacytuj zaznaczone Odpowiedz z cytatem

wystarczyloby posluzyc sie debuggerem Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
moras
#Moderator




Dołączył: 17 Lut 2005
Posty: 721

Pomógł: 13

PostWysłany: 19-10-08 16:36 Zacytuj zaznaczone Odpowiedz z cytatem

bercik napisał:
Hmmm...A nie łatwiej napisać jakiś program ,który by to obliczył?

tobix10 napisał:
wystarczyloby posluzyc sie debuggerem :)


Niestety w obu przypadkach odwołujecie sie do tego jak obliczenia wykona kompilator. Co gdy kompilator został zle zaimplementowany i nie jest zgodny ze specyfikacja jezyka?


Użytkownik otrzymał punkt pomocy za ten post.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
zxczxc1
~user




Dołączył: 18 Paź 2008
Posty: 3


PostWysłany: 19-10-08 16:50 Zacytuj zaznaczone Odpowiedz z cytatem

@moras

O takie rozwiązanie problemu właśnie mi chodziło.

Dzięki ;*
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> C/C++ Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
 Polecane strony