[C] Typy i wartości wyrażeń.

Owca90
Użytkownik
Użytkownik
Posty: 35
Rejestracja: 22 cze 2011, o 16:31
Płeć: Kobieta
Lokalizacja: Toruń
Podziękował: 3 razy

[C] Typy i wartości wyrażeń.

Post autor: Owca90 »

Witam,

Potrzebuję wytłumaczenia albo pokierowania w rozwiązywaniu zadań, gdzie należy pokazać typ i wartość wyrażenia, mając następujące założenia:

Kod: Zaznacz cały

int n=14
t[]={2,5,7,4}
*p=&t[2]
double x=8
z[]={5,2,1}
char napis[]="programowanie"
*tp=napis + 3

a) n/2*x
b) *z**p
c)p-t
d)*napis -tp[1]
e)napis +n/*t
f)*tp +(tp-napis)
g)(*p)++,t[2]
h)siezof(z)/sizeof(t)
Ostatnio zmieniony 16 wrz 2011, o 12:57 przez Afish, łącznie zmieniany 2 razy.
Powód: Znaczniki [code]!
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Typy i wartości wyrażeń.

Post autor: Afish »

Poczytaj o automatycznych promocjach i rzutowaniach typów.
Owca90
Użytkownik
Użytkownik
Posty: 35
Rejestracja: 22 cze 2011, o 16:31
Płeć: Kobieta
Lokalizacja: Toruń
Podziękował: 3 razy

[C] Typy i wartości wyrażeń.

Post autor: Owca90 »

Potrzebuję bardziej pomocy przy liczeniu wartości wyrażeń niż przy określeniu typu.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Typy i wartości wyrażeń.

Post autor: Afish »

To skompiluj ten kod i wypisz wartości.
Owca90
Użytkownik
Użytkownik
Posty: 35
Rejestracja: 22 cze 2011, o 16:31
Płeć: Kobieta
Lokalizacja: Toruń
Podziękował: 3 razy

[C] Typy i wartości wyrażeń.

Post autor: Owca90 »

Nie rozumiesz mnie, gdybym chciała mieć po prostu wyniki bez toku liczenia to pewnie zrobiła bym jak radzisz. Ale chcę przy okazji rozumieć co się dzieje i dlaczego jest taki wynik.
Awatar użytkownika
kwarc
Użytkownik
Użytkownik
Posty: 10
Rejestracja: 4 paź 2009, o 12:59
Płeć: Mężczyzna
Lokalizacja: polska
Podziękował: 1 raz

[C] Typy i wartości wyrażeń.

Post autor: kwarc »

hmmm mam nadzieję, że masz jakiś podstawy bo może Ci się to wydać niezrozumiałe, no to jedziemy!

Kod: Zaznacz cały

char napis[]="programowanie"
Zmienna 'napis' jest tylko wskaźnikiem na pewien obszar pamięci gdzie wrzucone są kolejno bajty w kodach oznaczające napis "programowanie" (każdy znak zajmuje jeden bajt). W uproszeniu w pamięci wygląda to następująco:

Kod: Zaznacz cały

INDEX ADRES(HEX) WARTOŚĆ
 0    0x00000000    p
 1    0x00000004    r
 2    0x00000008    o
 3    0x0000000C    g
i tak dalej. Zauważ że adres zwiększa się o 4, nie o jeden ponieważ pod adresem leżą 4 bajty (na architekturach 32 bitowych) do kolejnego znaku (podkreślam ZNAKU, nie adresu) odwołujesz się przez nawias klamrowy \(\displaystyle{ napis[0]}\), \(\displaystyle{ napis[3]}\) itp.

Kompilator, w dużym uproszeniu przekształci to w odwołanie do odpowiedniej komórki pamięci zwiększając adres bazowy (adres pierwszego znaku) o wartość przesunięcia podaną w nawiasie.

I teraz ciekawa rzecz, otóż, mając wyrażenie \(\displaystyle{ napis = napis+3}\), zmienna napis nie zwiększy się o 3, tylko o 12 (google: arytmetyka pointerów)! Oczywiście tym zajmuje się kompilator w locie, wiedząc że ma do czynienia ze wskaźnikiem. tak więc wyrażenie \(\displaystyle{ *napis+3 == napis[3]}\) (indeksujemy od 0) (nie muszę tłumaczyć że * zwróci to co jest pod adresem).

d) Ponieważ znak zapisany jest pod postacią bajtu w kodzie ASCII to wyrażenie \(\displaystyle{ *napis -tp[1] == napis[0] = tp[1]}\) a ponieważ \(\displaystyle{ tp = napis+3}\) czyli wskazuje na pamięć od znaku 3 (ogramowanie) to wynikiem tego działania będzie \(\displaystyle{ 'o'-'a' = 111 - 97 = 14}\) (liczę w pamięci mogło mi się coś przesunąć)

Myślę, że z takimi podstawami dasz radę z resztą zadań.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Typy i wartości wyrażeń.

Post autor: Afish »

kwarc pisze:Zmienna 'napis' jest tylko wskaźnikiem na pewien obszar pamięci gdzie wrzucone są kolejno bajty w kodach oznaczające napis "programowanie" (każdy znak zajmuje jeden bajt).
Nie jest wskaźnikiem, chociaż może być tak potraktowana. Kodowanie zależy od kompilatora, nie musi to być ASCII. Znak nie musi zajmować jednego bajtu, to również zależy od implementacji kompilatora.
kwarc pisze: W uproszeniu w pamięci wygląda to następująco:

Kod: Zaznacz cały

INDEX ADRES(HEX) WARTOŚĆ
 0    0x00000000    p
 1    0x00000004    r
 2    0x00000008    o
 3    0x0000000C    g
i tak dalej. Zauważ że adres zwiększa się o 4, nie o jeden ponieważ pod adresem leżą 4 bajty (na architekturach 32 bitowych) do kolejnego znaku (podkreślam ZNAKU, nie adresu) odwołujesz się przez nawias klamrowy \(\displaystyle{ napis[0]}\), \(\displaystyle{ napis[3]}\) itp.
Adres zwiększa się o sizeof(char) i to nie zależy od architektury. Poza tym chwilę wyżej napisałeś, że char zajmuje jeden bajt, a teraz twierdzisz, że adres zwiększa się o 4 bajty.
kwarc pisze:Kompilator, w dużym uproszeniu przekształci to w odwołanie do odpowiedniej komórki pamięci zwiększając adres bazowy (adres pierwszego znaku) o wartość przesunięcia podaną w nawiasie.
Pomnożoną przez sizeof(char) oczywiście.
kwarc pisze:I teraz ciekawa rzecz, otóż, mając wyrażenie \(\displaystyle{ napis = napis+3}\), zmienna napis nie zwiększy się o 3, tylko o 12 (google: arytmetyka pointerów)!
Jak zawsze zależy od sizeof(char). Pomijając już fakt, że napis = napis+3 nie skompiluje się, gdyż napis jest tablicą, a nie wskaźnikiem.
kwarc pisze:Oczywiście tym zajmuje się kompilator w locie, wiedząc że ma do czynienia ze wskaźnikiem. tak więc wyrażenie \(\displaystyle{ *napis+3 == napis[3]}\) (indeksujemy od 0) (nie muszę tłumaczyć że * zwróci to co jest pod adresem).
Oj nieprawda. *napis + 3 zwróci znak zwiększony o 3. Priorytet operatorów i te sprawy.
Owca90
Użytkownik
Użytkownik
Posty: 35
Rejestracja: 22 cze 2011, o 16:31
Płeć: Kobieta
Lokalizacja: Toruń
Podziękował: 3 razy

[C] Typy i wartości wyrażeń.

Post autor: Owca90 »

Dobra, to może inaczej, powiedzmy, że mamy

Kod: Zaznacz cały

double z[] = {5,3,2,1} 
*p=z+2
pytanie jest czym będzie p ?
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Typy i wartości wyrażeń.

Post autor: Afish »

Nie da się jednoznacznie powiedzieć, bo to zależy od rzutowań. Ja bym odpowiedział wskaźnik na wskaźnik na double.
ODPOWIEDZ