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;
}
}
Har du provkört?
Ja, som sagt
Här är en bild på det mer utförliga svaret
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.
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
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].
Liksom i matte är det bra att rita när man ska begripa pekarhantering i C.
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.
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.
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.
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.
Som tur är gäller ditt kodexempel måååånga versioner av C samt även versioner av t.ex. C# och C++...:-)
OK
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.
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.