Avatar billede winston-smith Nybegynder
08. marts 2002 - 11:17 Der er 9 kommentarer

For-lykke uden tuborgere

Jeg har altid troet at nedestående eksempel skulle give et j på 20, eftersom indmaden (if sætningen) i for-lykken kun vil tælle med hvis det evaluere til sand. Og den så vil eksekvere j++ som en del af for-lykken. Men nu har jeg pludselig noget kode hvor det ikke er sådan (hvor det isteden give et j på 1). Hvad er nu det? Er det mig der husker forkert?

int j;

j = 0;

for (i = 0; i < 20; i++)
  if (1 == 2)
      j = -1;
  j++;

printf("J: %i", j);


Rune
Avatar billede chries Nybegynder
08. marts 2002 - 11:19 #1
int j;
j = 0;
/* for start */
for (i = 0; i < 20; i++)
  if (1 == 2)
      j = -1;
/* for slut */

// her er j==0
j++;
// her er j==1
Avatar billede henrik_ffc Nybegynder
08. marts 2002 - 11:20 #2
For løkken (uden {}) udfører KUN linien umiddelbart efter. Hvis dette er en if-sætning er det altså denne der udføres og ikke mere.
Selvom if-sætningen er falsk er linien udført og løkken fortsætter til næste iteration. j++ bliver derfor kun udført een gang, nemlig når løkken er helt færdig...

Sådan er det...
Avatar billede chries Nybegynder
08. marts 2002 - 11:20 #3
for'en tager kun første statement, som er if'en
Avatar billede laffe Nybegynder
08. marts 2002 - 11:39 #4
Det skal se sådan ud:
int j;

j = 0;

for (i = 0; i < 20; i++)
{
  if (1 == 2)
      j = -1;
  j++;
}
printf("J: %i", j);

Nu bliver j 20
Avatar billede killer_bee Nybegynder
08. marts 2002 - 12:03 #5
Eller sådan her :

int j;

j = 0;

for (i = 0; i < 20; i++)
  if (1 == 2)
      j = -1;
  else
      j++;

printf("J: %i", j);

bare for at give flere muligheder...
PS hva har du imod {} ? hehe ;)
Avatar billede soepro Nybegynder
08. marts 2002 - 12:52 #6
En for løkke kører kun de statements som står i selve for-definitionen og frem til første ';'. Undtaget er - ja som du gætter - ';' som står inden i en eller flere turborg-klammer.

Den konstruktion du husker har nok set sådan her ud:

for (i = 0; i < 20; i++,
  if (1 == 2)
    j = -1,
  j++
)

Men det er rigtig "gris" at gøre sådan.
Avatar billede winston-smith Nybegynder
08. marts 2002 - 16:23 #7
Jeg har ikke noget mod {}, men jeg kigger lige nu i noget rigtigt slam-kode, som udviser en gennemført afsky for overflødige {} og andet der kan hjælpe koden blive mere letlæselig. Og så er der altså denne for-lykke som jeg stadig er lidt i tvivl om?

"En for løkke kører kun de statements som står i selve for-definitionen og frem til første ';'." Jamen det er netop sagen. Første ';' er det efter 'j++' eftersom det efter 'j = -1' ikke nåes.

Rune
Avatar billede chries Nybegynder
08. marts 2002 - 16:33 #8
for

for( init_vars; expression1; expression2 )
    expression3;

for( init_vars; expression1; expression2 )
{
    expression3;
    expression;
    expression;
    expression;
    expression;
}
Avatar billede chries Nybegynder
08. marts 2002 - 16:36 #9
arrgg, kom til at klikke forkert

expression1 bruges til loop terminerning. expression2 tæller variable op, og kan bestå af flere ved at komma separerer dem (gris som han siger).
Hvis der ikke anvendes {}, bindes den følgende expression (3) til for loop'en, hvilket svarer til en tildeling, if, while osv...

for( init_vars; expression1; expression2 )
    expression3;

for( init_vars; expression1; expression2 )
{
    expression3;
    expression;
    expression;
    expression;
    expression;
}

for (i = 0; i < 20; i++(expression2))
  if (1 == 2) (expression3)
      j = -1;  (expression x, tilhører if)
  j++; (expression4, og kommer ikke med i for)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester