frage zu codeschnipsel



  • Hallo,

    ich verstehe folgenden code nicht

    int k = 0;
    	k=(++k<3?k:0);
    
    	cout <<k;
    

    die ausgabe ist immer 1, meiner meinung nach sollte es 0 sein.

    beim ersten durchlauf
    1<3 true k = 1
    2<3 true k = 2
    3<3 false k=0;

    was übersehe ich ?



  • Ich weiß nicht, was du übersiehst. Aber ich sehe z.B. keine Schleife, die mehr als einen Durchlauf überhaupt ermöglichen würde.

    Das ganze wird SO, wie es da steht, sequentiell abgearbeitet:

    k = 0 => k = 0
    ++k => k = 1
    k < 3 => 1 < 3 => true
    k = k => k = 1

    Ausgabe 1.



  • meeydoo schrieb:

    die ausgabe ist immer 1, meiner meinung nach sollte es 0 sein.

    Dein Irrtum.

    meeydoo schrieb:

    beim ersten durchlauf

    Wo siehst Du denn bei deinem Codefetzen mehr als einen Durchlauf?

    meeydoo schrieb:

    was übersehe ich ?

    int k = 0;
    k = ( ++k < 3 ? k : 0 );
         // |
        //  k == 1 nach Preinkrement und vor < 3
       //   1 < 3 == true
      //    => k = k | k = 1
    
    cout << k;  // 1
    

    // Edit: zu langsam...



  • ups das ist ja garkeine schleife 😶

    ja klar danke



  • meeydoo schrieb:

    ups das ist ja garkeine schleife 😶

    Und jetzt gehe hin und schreibe 100 mal "Ich werde meinen Code in Zukunft sorgfältig einzurücken!".



  • Swordfish schrieb:

    meeydoo schrieb:

    ups das ist ja garkeine schleife 😶

    Und jetzt gehe hin und schreibe 100 mal "Ich werde meinen Code in Zukunft sorgfältig einzurücken!".

    Hmm, das würde ich so lösen !

    for ( int i = 0;
    i < 100 ; i ++ ) {
    
    std::cout << Ich werde meinen Code in Zukunft sorgfältig einzurücken";
             std::cout << std::endl;
       std::cout << std::endl;
    
     ´                           }
    

    richtig so ? ;P



  • Och nö, das war nur 99 mal 😢 Ganze mühe umsonst.



  • blubii schrieb:

    Och nö, das war nur 99 mal 😢 Ganze mühe umsonst.

    Zähl's noch einmal, Sam.



  • ist wirklich garantiert, dass die Branches immer erst nach der Bedingung evaluiert werdne dürfen?
    normalerweise ist ja sowas wie "k++ - k" UB. Im ersten Moment hätte ich das auch hier erwartet, weil es ein einziger Ausdruck ist.

    ich kann mir nicht vorstellen, dass das hier UB ist:

    int myif(bool cond, int a, int b){
        return cond?a:b
    }
    
    k=myif(++k < 3, k, 0);
    

    und der Ausdruck vom Threadstarter nicht. Kann mich da jemand widerlegen? 🙂



  • otze schrieb:

    ist wirklich garantiert, dass die Branches immer erst nach der Bedingung evaluiert werdne dürfen?
    normalerweise ist ja sowas wie "k++ - k" UB. Im ersten Moment hätte ich das auch hier erwartet, weil es ein einziger Ausdruck ist.

    Es gibt im C- und C++-Standard definierte Sequenzpunkte, bei denen sichergestellt ist, welche Werte definitiv vorher berechnet wurden. Der ?:-Operator gehört dazu, die Kommas zwischen den einzelnen Funktionsparametern nicht.


Anmelden zum Antworten