for-schleife



  • hallo.

    wir alles wissen ja, dass die schleife for(int i=0; i<5; i++) nach ihrem durchlauf die variable 'i' auf 4 bringt. dabei müsste 'i' doch logischerweise auf 5 stehen!

    man könnte die schleife auch so interpretieren:

    i=0;
      if(i<5) i++;
    //i==1
     if(i<5) i++;
    //i==2
     if(i<5) i++;
    //i==3
     if(i<5) i++;
    //i==4
     if(i<5) i++;
    //i==5
    

    also: warum erreicht die variable 'i' nie den wert fünf? "wenn i(==4) kleiner als 5, dann i++" 😡



  • also: wenn du "i" IN der Schleife deklarierst, sollte "i" NACH der Schleife eh undefiniert sein (bei MSVC ist das wohl nicht so, aber das ist nicht Standard).
    Ansonsten hat "i" nach der Schleife doch den Wert 5 ?!?!?



  • Ich denke das kommt auf die Reihenfolge an in der es interpretiert wird... Ich würde mal sagen i wird hier nach jedem Durchlauf inkrementiert und vor jedem neuen Durchlauf abgeprüft ob es < 5 ist.

    EDIT: Sonst hätte i ja auch nie den Wert 0, was ja wohl zweifelsohne so ist...

    [ Dieser Beitrag wurde am 01.04.2003 um 13:13 Uhr von MaSTaH editiert. ]



  • wir alles wissen ja, dass die schleife for(int i=0; i<5; i++) nach ihrem durchlauf die variable 'i' auf 4 bringt.

    ich alles weiß das ja nicht. und bisher gab es auch immer 5 bei mir.



  • Original erstellt von CodeWalker:
    also: wenn du "i" IN der Schleife deklarierst, sollte "i" NACH der Schleife eh undefiniert sein (bei MSVC ist das wohl nicht so, aber das ist nicht Standard).
    Ansonsten hat "i" nach der Schleife doch den Wert 5 ?!?!?

    Das stimmt, der Standard besagt:

    int i = 10;
    for(int i = 0; i <  100; ++i) {
      array[i] = 0;
    }
    int j = i; // j ist 10
    

    Der MSVC hält sich aber nicht daran



  • [ Dieser Beitrag wurde am 01.04.2003 um 13:26 Uhr von MaSTaH editiert. ]



  • Habs gefunden:
    Des Rätsels Lösung ist:

    1 The for statement
              for ( for-init-statement conditionopt ; expressionopt ) statement
      is equivalent to
    
              {
                      for-init-statement
                      while ( condition ) {
                              statement
                              expression ;
                      }
              }
    

    EDIT: Also gibt es 5 wie Volkard sagt

    [ Dieser Beitrag wurde am 01.04.2003 um 13:25 Uhr von MaSTaH editiert. ]



  • Original erstellt von MaSTaH:
    **Das stimmt, der Standard besagt:

    int i = 10;
    for(int i = 0; i <  100; ++i) {
      array[i] = 0;
    }
    int j = i; // j ist 10
    

    Der MSVC hält sich aber nicht daran**

    ups.

    bool iAmBuggy()
    {
     int i = 10;
     {
      for(int i = 0; i <  100; ++i) 
       ;
      return i!=10;
     }
    }
    int j = i; // j ist 10
    

    ps: wie würdest du hier deine { setzen?

    so?

    bool iAmBuggy() {
     int i = 10; {
      for(int i = 0; i <  100; ++i) 
       ;
      return i!=10;
     }
    }
    int j = i; // j ist 10
    

    das nach dem int i = 10; stört mich. und es runterzunehmen wäre inkonsequent. macht ihr keine blöcke, nur um variablen lokaler zu machen?

    [ Dieser Beitrag wurde am 01.04.2003 um 13:34 Uhr von volkard editiert. ]



  • Der MSVC meldet aber beim kompilieren AFAIK eine redefinition



  • ist i global, so hat sie den wert 5 nach endgültigem abarbeiten der schleife.
    ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife.

    ????

    muss ich bei bedarf mal ausprobieren.



  • Original erstellt von <i==5>:
    **ist i global, so hat sie den wert 5 nach endgültigem abarbeiten der schleife.
    ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife.

    ????

    muss ich bei bedarf mal ausprobieren.**

    Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5

    Aus:

    for(int i = 0; i < 5; ++i)
      //...
    

    Macht der MSVC intern (anscheinend):

    int i = 0;
    for(; i < 5; ++i)
      //...
    

    Deshalb ist i nachher noch vorhanden, da es nicht innerhalb der Schleife erstellt wurde...



  • ist i lokal (in der schleife), so hat sie den wert 4 nach endgültigem abarbeiten der schleife

    Nein! Ist "i" lokal, existiert es nach der Schleife nicht mehr, ist also undefiniert!
    Bei MSVC ist es anders (nicht Standard-konform), aber auch hier hat "i" nach der Schleife den Wert 5 !



  • Original erstellt von CodeWalker:
    Nein! Ist "i" lokal, existiert es nach der Schleife nicht mehr, ist also undefiniert!
    Bei MSVC ist es anders (nicht Standard-konform), aber auch hier hat "i" nach der Schleife den Wert 5 !

    GEnau das habe ich gerade geschrieben



  • Original erstellt von MaSTaH:
    **Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5

    Aus:

    for(int i = 0; i < 5; ++i)
      //...
    

    Macht der MSVC intern (anscheinend):

    int i = 0;
    for(; i < 5; ++i)
      //...
    

    Deshalb ist i nachher noch vorhanden, da es nicht innerhalb der Schleife erstellt wurde...**

    kommt auf den compiler an. ist nicht gerade berauschend, dass dein compiler dir andere ergebnisse liefert als meiner.

    hab devc++.

    Ne, wenn i = 0 die Ausgangssituation war dann hat sie in beiden Fällen nachher den Wert 5

    ich denke nicht. lokal i muss bei der bedingung i=0; i<5 nachher auf 4 stehen.

    beispiel:

    int array[5];
    for(int i=0; i<5; i=i+1)
      array[i]=i;
    


  • Original erstellt von MaSTaH:
    Der MSVC meldet aber beim kompilieren AFAIK eine redefinition

    doch.

    int i;
    for(int i;...
    

    ist fehler bei dem. deshalb dachte ich, es sei nicht möglich, zweideutige sachen zu machen. aber es geht, wie meine funktion oben zeigt, mit nem block mehr.



  • ich denke nicht. lokal i muss bei der bedingung i=0; i<5 nachher auf 4 stehen.

    beispiel:

    int array[5];
    for(int i=0; i<5; i=i+1)
    array[i]=i;

    Nochmal zum Mitschreiben: i ist nach der Schleife nicht defininert, kann also JEDEN BELIEBIGEN Wert haben !!!



  • Original erstellt von volkard:
    ist fehler bei dem. deshalb dachte ich, es sei nicht möglich, zweideutige sachen zu machen. aber es geht, wie meine funktion oben zeigt, mit nem block mehr.

    Jo, mit nem Block mehr geht es...



  • Original erstellt von CodeWalker:
    Nochmal zum Mitschreiben: i ist nach der Schleife nicht defininert, kann also JEDEN BELIEBIGEN Wert haben !!!

    Auf welche Beiträge antwortest du??? 20 Mal auf den selben??? Wenn i nicht definiert ist kann es auch keinen Wert haben...
    Außerdem geht es gerade um den MSVC... Laut Standard hast du ja recht. Wurde aber auch schon vor ner halben STunde so gepostet...



  • @Mastah: wenn du den Thread mal durchliest, siehst du, daß "i==5" es immer noch nicht verstanden hat....



  • Original erstellt von CodeWalker:
    @Mastah: wenn du den Thread mal durchliest, siehst du, daß "i==5" es immer noch nicht verstanden hat....

    Das war aber vor ner halben STunde. In der Zwischenzeit wurde es schon erklärt...


Anmelden zum Antworten