15 svar
78 visningar
Elias93 är nöjd med hjälpen!
Elias93 120
Postad: 3 jun 2019

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 5682
Postad: 3 jun 2019

Har du provkört? 

Elias93 120
Postad: 3 jun 2019 Redigerad: 3 jun 2019

Ja, som sagt

Elias93 120
Postad: 3 jun 2019 Redigerad: 3 jun 2019

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

Aerius 191
Postad: 3 jun 2019

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 120
Postad: 3 jun 2019 Redigerad: 3 jun 2019

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 191
Postad: 3 jun 2019

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 5682
Postad: 3 jun 2019

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

Elias93 120
Postad: 3 jun 2019 Redigerad: 3 jun 2019

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 191
Postad: 3 jun 2019
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 5682
Postad: 3 jun 2019
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 120
Postad: 4 jun 2019 Redigerad: 4 jun 2019
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 4812
Postad: 4 jun 2019

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

Elias93 120
Postad: 4 jun 2019

OK

Laguna 5682
Postad: 4 jun 2019

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 120
Postad: 4 jun 2019

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