For loop?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

For loop?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: For loop?

Inlägg 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++)
Senast redigerad av TomasL 24 februari 2021, 21:34:12, redigerad totalt 1 gång.
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: For loop?

Inlägg 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.
persika
EF Sponsor
Inlägg: 1336
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: For loop?

Inlägg 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.
Användarvisningsbild
GeekJoan
Admin
Inlägg: 10642
Blev medlem: 26 maj 2003, 15:59:27
Ort: Solna

Re: For loop?

Inlägg 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".
Användarvisningsbild
Klas-Kenny
Inlägg: 11292
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: For loop?

Inlägg 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
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45175
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: For loop?

Inlägg 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
Användarvisningsbild
Mickecarlsson
EF Sponsor
Inlägg: 3745
Blev medlem: 15 april 2017, 18:06:15
Ort: Malmö
Kontakt:

Re: For loop?

Inlägg av Mickecarlsson »

Kod: Markera allt

for(i=1;i<=3;i++)
Då blir det som du vill GeekJoan 8)
persika
EF Sponsor
Inlägg: 1336
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: For loop?

Inlägg av persika »

Här är en test med loopar bl.a.:
viewtopic.php?f=43&t=85521&p=1293091#p1293091
WhyNotOnMars
Inlägg: 120
Blev medlem: 24 december 2015, 11:35:17

Re: For loop?

Inlägg 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.
Användarvisningsbild
AndLi
Inlägg: 17049
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: For loop?

Inlägg 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...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: For loop?

Inlägg 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...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: For loop?

Inlägg 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.
agehall
Inlägg: 418
Blev medlem: 12 augusti 2020, 19:27:54

Re: For loop?

Inlägg av agehall »

Ja, absolut. Hela uttrycket i mitten evalueras och så länge det är sant så körs loopen ett varv till.
persika
EF Sponsor
Inlägg: 1336
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: For loop?

Inlägg 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.
Skriv svar