15 svar
289 visningar
Elias93 är nöjd med hjälpen
Elias93 130
Postad: 3 jun 2019 15:43

Vad händer i denna färdiga kod?

Hej!

Vad händer här? Koden kommer från lärare. 

 

Det svåra är if satsens vilkor. Vad kommer först, == ++ -- eller * ? Vad gör parantesen (*p2)-- som inte *p1++ gör? 

Enligt debuggern pekar ptr2 och ptr3 på samma sak vilket jag tolkar som att if satsen blir false.

 

int arr[] = {1, 2, 3};
int *ptr1 = arr;
int *ptr2 = &arr[2]; // Before
int *ptr3 = do_it(ptr1, ptr2); // After
// The function do_it
int *do_it(int *p1, int *p2) {
if (*p1++ == (*p2)--) {
return p1;
} else {
return p2;
}
}

Laguna Online 28470
Postad: 3 jun 2019 15:46

Har du provkört? 

Elias93 130
Postad: 3 jun 2019 16:19 Redigerad: 3 jun 2019 16:30

Ja, som sagt

Elias93 130
Postad: 3 jun 2019 16:23 Redigerad: 3 jun 2019 16:26

Här är en bild på det mer utförliga svaret

Aerius 504 – Fd. Medlem
Postad: 3 jun 2019 16:35

Vad tror du händer i if-satsen. Att köra en debugger och hänvisa till den visar inte på någon egen förståelse. Det måste stå i kursboken vilken prioriteringsordning olika operatorer har.

Elias93 130
Postad: 3 jun 2019 16:47 Redigerad: 3 jun 2019 16:52

Om jag hade vetat hade jag ju inte frågat er. Men om ni inte vill svara så säg bara till.   Jag kan tänka mig olika varianter: 

Om == händer först så jämförs det som ptr1 och ptr2 pekade på från början, d.vs. 1 och 3. Då skickas p2 (parametern ptr2 )tillbaka till main och och prt1 eller det den pekar på ändras inte. 

Om ++ och -- sker först och sedan * och sedan jämförelsen == så borde *p1++ göra att ptr1 pekar på index 1 istället för index 0 och att värdet där står till vänster i if satsen. Alltså 2. (*p2)-- borde betyda att 3an minskas till en 2a på indexplats 2 för att *p2 är omgivet av en parantes. Då får vi 2 == 2 vilket ger true

Aerius 504 – Fd. Medlem
Postad: 3 jun 2019 19:13

Nu är det mycket lättare att ge hjälp utifrån hur du tänkt. Jag tänkte så som du beskrev nu. Men som du skrev i första inlägget så blir if-satsen false. Det som händer i if-condition är ptr1 ökas med ett, men eftersom det är postfix operatorn av ++ så utvärderas ptr1 med * innan ++ ökar på. Det vill säga *ptr1++ får värdet 1. Parenteser ändrar precedence för operatorer. Så först utvärderas ptr2 med *, vilket ger en int med värdet 3. Sen används operatorn -- på denna int. Men eftersom -- är en postfix operator tilldelas inte (*ptr2) det nya värdet och har fortfarande värdet 3. Sist utvärderas == operatorn, den jämför om 1 == 3 vilket är falskt. Alltså returneras ptr2 så ptr2 och ptr3 innehåller samma pekaradress. Nu har ++ operatorn stegat upp ptr1 ett steg i arrayen, men -- operatorn har inte stegat ptr2. Utan den har sänkt värdet i arrayens sista element från 3 till 2. Titta i debuggern så ser du att arrayen har [1, 2, 2] istället för [1, 2, 3].

Laguna Online 28470
Postad: 3 jun 2019 19:31

Liksom i matte är det bra att rita när man ska begripa pekarhantering i C. 

Elias93 130
Postad: 3 jun 2019 21:45 Redigerad: 3 jun 2019 21:47

Tack! Om *ptr++ blir 1 när operationerna sker i den ordningen, vad var ptr från början? I den ursprungliga arrayen så var ju elementet på plats 0 redan 1. Eller menar du att pekaren stegar till indexplats ett efter att kompilatorn har konstaterat att

1 == 3 är false?

 

Nu förstår jag hur ni vill man ställer frågor här. Jag får läsa på lite om postfix innan tentan.

Aerius 504 – Fd. Medlem
Postad: 3 jun 2019 22:23
Elias93 skrev:

Tack! Om *ptr++ blir 1 när operationerna sker i den ordningen, vad var ptr från början? I den ursprungliga arrayen så var ju elementet på plats 0 redan 1. Eller menar du att pekaren stegar till indexplats ett efter att kompilatorn har konstaterat att

1 == 3 är false?

 

Nu förstår jag hur ni vill man ställer frågor här. Jag får läsa på lite om postfix innan tentan.

Precis, jag menade att ptr1 stegar till indexplats 1 efter att kompilatorn konstaterat

1 == 3 är false.

Glädjande att du förstår hur frågor ska ställas :D Det är annars lätt gjort att frågan och svaret missar varandra. Dessutom är det en otroligt effektiv studieteknik att formulera vad man tror själv först.

Laguna Online 28470
Postad: 3 jun 2019 22:26
Aerius skrev:
Elias93 skrev:

Tack! Om *ptr++ blir 1 när operationerna sker i den ordningen, vad var ptr från början? I den ursprungliga arrayen så var ju elementet på plats 0 redan 1. Eller menar du att pekaren stegar till indexplats ett efter att kompilatorn har konstaterat att

1 == 3 är false?

 

Nu förstår jag hur ni vill man ställer frågor här. Jag får läsa på lite om postfix innan tentan.

Precis, jag menade att ptr1 stegar till indexplats 1 efter att kompilatorn konstaterat

1 == 3 är false.

Glädjande att du förstår hur frågor ska ställas :D Det är annars lätt gjort att frågan och svaret missar varandra. Dessutom är det en otroligt effektiv studieteknik att formulera vad man tror själv först.

Det är inte kompilatorn som konstaterar att if-satsen är falsk, det sker när koden körs.

Elias93 130
Postad: 4 jun 2019 15:21 Redigerad: 4 jun 2019 15:23
Laguna skrev:

Liksom i matte är det bra att rita när man ska begripa pekarhantering i C. 

Ja det står innan koden att vi ska rita detta men jag tänkte att jag behövde veta vad som pekar på vad först, annars får jag ju sudda. Tack för hjälpen båda två.

 

Gäller ert svar alla C versioner eller bara en särskild? Det finns C 099 och C 011 t.ex. som ni säkert vet.

Affe Jkpg 6630
Postad: 4 jun 2019 15:31

Som tur är gäller ditt kodexempel måååånga versioner av C samt även versioner av t.ex. C# och C++...:-) 

Elias93 130
Postad: 4 jun 2019 16:29

OK

Laguna Online 28470
Postad: 4 jun 2019 17:14

C förändras i ganska maklig takt. Det är ungefär bara om man har en tjugo år äldre bok än implementationen man kör som man kan få överraskningar, och då oftast genom att uråldriga konstruktioner inte accepteras längre. 

Elias93 130
Postad: 4 jun 2019 17:54

OK jag förstår. En vän i Österrike sa i helgen att han lärde sig en annan version av C än jag för 2 år sen.

Svara Avbryt
Close