Sida 1 av 2

For loop?

Postat: 24 februari 2021, 21:21:23
av GeekJoan
Tänker jag helt fel.
for(int i=0; i<=3; i=i+1)
deklarera i, om i är mindre eller lika med tre kör på, i är lika med i plus ett
Fine, men eftersom i är 0 och det är mindre än 3 så borde i bli 1 direkt, och alltså skulle koden skriva ut 1, 2, 3. Men så är det inte, den skriver ut 0, 1, 2, 3.

Eller är det så här det faktiskt funkar:
1. i = 0
2. om i är mindre eller lika med 3, kör koden nedan.
Nästa runda på loopen.
3. om i är mindre eller lika med 3 gör nästa steg i koden i=i+1
4. kör koden nedan.
5. tillbaks till 3.

Jag har alltid tyckt att det är ologiskt att man deklarerar "i" det första man gör i en loop för i mitt huvud så sätter den ju då "i" till 0 varje gång loopen börjar. Men jag ser nog fel på det hela. ?
Men jag har aldrig sett eller fått höra att för for loopar så kör den första "statment" en gång,
andra "statment" första rundan och alla andra,
tredje "statment" körs först andra rundan på loopen så länge andra "statment" uppfylls.

Re: For loop?

Postat: 24 februari 2021, 21:25:21
av TomasL
Eller är det så här det faktiskt funkar:
1. i = 0
2. om i är mindre eller lika med 3, kör koden nedan.
Nästa runda på loopen.
3. om i är mindre eller lika med 3 gör nästa steg i koden i=i+1
4. kör koden nedan.
5. tillbaks till 3.
Det är så det funkar

Först körs första argumentet, därefter andra och sedan tredje.
En längre version är

Kod: Markera allt

i=0;
while (i<=3)
{
........;
i++;
}
edit: missade "=" tecknet
men man kan likaväl skriva

Kod: Markera allt

while (i<4)
Vilket blir tydligare
och det är identiskt med både

Kod: Markera allt

<for (i=0; i<=3; i++)
och

Kod: Markera allt

<for (i=0; i<4; i++)

Re: For loop?

Postat: 24 februari 2021, 21:26:30
av Klas-Kenny
1. i sätts till 0.
2. Jämförelse, är i mindre än eller lika med tre?
3. Om så, kör koden.
4. Öka i med 1
5. Åter till steg 2.

Re: For loop?

Postat: 24 februari 2021, 21:28:40
av persika
Jag använder aldrig for-loopar.
While-loopar är naturligare att förstå och mera läsbara. Ingen skillnad i prestanda och kodstorlek.

Re: For loop?

Postat: 24 februari 2021, 21:32:16
av GeekJoan
TomasL skrev: 24 februari 2021, 21:25:21

Kod: Markera allt

i=0;
while (i<3)
{
........;
i++;
}
Det där är fan mer logiskt :tumupp: . Speciellt eftersom i++ kommer sist och deklarationen av i görs utanför själva "loopen".

Re: For loop?

Postat: 24 februari 2021, 21:37:08
av Klas-Kenny
persika skrev: 24 februari 2021, 21:28:40 Jag använder aldrig for-loopar.
While-loopar är naturligare att förstå och mera läsbara. Ingen skillnad i prestanda och kodstorlek.
För mig är for-loopar det mest naturliga och lättförståeliga så länge man använder dem till att räkna ett specifikt antal gånger, såsom i exemplet här.

Men det är klart att man tex. Inte skriver

Kod: Markera allt

for(;true;) {
if(något villkor)
   break;
}
Som man kanske gör med en while-loop. :D

Re: For loop?

Postat: 24 februari 2021, 21:41:38
av TomasL
Tja, det är en smaksak, jag använder alltid "for"-loopar.
Sedan i while-loopen spelar det ingen roll var "i++" hamnar, den kan vara första raden eller sista eller mitt i, hela loopen körs oavsett.
Man kan ju naturligt vis skriva en "do while" också, och då blir det

Kod: Markera allt

do while (i<3)
istället, eftersom kontrollen görs efter loopen körts, i en while görs kontrollen innan loopen körts, vilket är samma för en for-loop

Re: For loop?

Postat: 24 februari 2021, 21:45:16
av Mickecarlsson

Kod: Markera allt

for(i=1;i<=3;i++)
Då blir det som du vill GeekJoan 8)

Re: For loop?

Postat: 24 februari 2021, 21:49:16
av persika
Här är en test med loopar bl.a.:
viewtopic.php?f=43&t=85521&p=1293091#p1293091

Re: For loop?

Postat: 24 februari 2021, 21:59:42
av WhyNotOnMars
Har aldrig tänkt på det, men nu när ni säger det är ju while-loopar mer logiska. Fördelen med for-loopar i standard-format (t ex for(int i = 0; i<3; i++)) är att man när man har sett dem tusen gånger vet man direkt vad loopen gör när man ser en ny (såvida ingen pillar på loop-variabeln inuti loopen, eller kör en break, men det senare ser man ofta snabbt). Och är det lite ostandard, typ en loop som räknar neråt eller eller använder <= som jämförelse eller ökar med två i varje iteration, ser man också det rätt fort. while-loopar åas kan lite vad som helst hända i och man får titta en stund längre. Vana programmerare använder också while-loopen för att på sätt och vis tala om för läsaren att här är det inte nödvändigtvis en enkel iteration över någonting som görs, utan något mer komplicerat.

Det är iaf mina åsikter/erfarenheter.

Re: For loop?

Postat: 24 februari 2021, 22:24:16
av AndLi
persika skrev: 24 februari 2021, 21:28:40 Jag använder aldrig for-loopar.
While-loopar är naturligare att förstå och mera läsbara. Ingen skillnad i prestanda och kodstorlek.
Och det menar du gäller för alla kompilatorer/processorarkitektorer?
Man kan ju vinna tid bara genom att vända riktningen på vissa platformar...

Re: For loop?

Postat: 24 februari 2021, 23:47:01
av sodjan
Jag tycker att denna loop är lätt att läsa och att förstå (loop-counter är en "int"):

Kod: Markera allt

        Perform varying loop-counter from zero by 1 until loop-counter is greater than 3
            display "Loop counter = ", loop-counter
        End-Perform
        
$ run loop
Loop counter = 000
Loop counter = 001
Loop counter = 002
Loop counter = 003
$
Om man inte behöver något index utan bara vill göra något ett visst antal gånger:

Kod: Markera allt

        Perform 3 times
            display "In the loop"
        End-Perform

$ run loop2
In the loop
In the loop
In the loop
$
Som att läsa en bok...

Re: For loop?

Postat: 25 februari 2021, 00:15:21
av sodjan
Hur är det, kan mitten parametern i en C-for loop ha flera villkor?
Alltså något i stil med:

Kod: Markera allt

for(int i=0; (i<=3 or x<>5); i=i+1)
Loopa så länge som i är mindre än 3 och x inte är 5.

Re: For loop?

Postat: 25 februari 2021, 03:33:46
av agehall
Ja, absolut. Hela uttrycket i mitten evalueras och så länge det är sant så körs loopen ett varv till.

Re: For loop?

Postat: 25 februari 2021, 07:21:54
av persika
>Och det menar du gäller för alla kompilatorer/processorarkitektorer?

Så klart... jag som hobbyprogrammerare kan svara för all världens kompilatorer...


Ett programspråk är ju även till för att göra det enkelt för människan, därför tycker jag man ska sträva i den riktningen och göra program läsbara. Göra programkoden så enkel och förståelig som möjlig. Man kan kommentera programmet, och det behövs, men om programkoden är tydlig så hjälper det också förståelsen. Om programmet ändras är det lätt hänt att man glömmer ändra kommentarerna.

Redan i denna tråd har det uppstått flera frågor om hur for-loopen funkar, som i första inlägget, men även:
>Hur är det, kan mitten parametern i en C-for loop ha flera villkor?
Så blir det inte med while-loopen.
Befria hjärnan från sånt och använd den till själva programmet.

Vad jag förstått så är den allmänna meningen att for-loopar används vid bestämt antal iterationer och while-loopar vid variabelt, men rent tekniskt har det ingen betydelse för varken for eller while.

Dock, en fördel med for-loop är att man får en påminnelse om att öka räknevariabeln.
Glömmer man ändra räknevariabeln, får man en oändlig loop och programmet låser sig.
Därför har jag som vana att skriva den direkt när jag skriver "stommen" till while-loopen, och sen fyller med innehåll om vad som ska hända.