Aus 2 For eine machen?



  • Hi,
    ich möchte für alle Zahlen zwischen 0 und N, außer n etwas tun.

    Hier habe ich ganz oft die Abfrage ob i==n ist:

    for(int i=0; i<N ;i++){
       if(i!=n) tutetwas(i);
    }
    

    und hier schreibe ich es doppelt:

    for(int i=0; i<n ;i++){
       tutetwas(i);
    }
    for(int i=n+1; i<N ;i++){
       tutetwas(i);
    }
    

    gibt es da noch etwas anderes?



  • deine zweite Variante ist doch gut. Besser als immer diese Abfrage in der Schleife. Sicher gibt es noch mehr Möglichkeiten sowas zu basteln, aber die sind garantiert langsamer als Variante #2.


  • Mod

    int i = 0;
    goto start;
    for(;;) {
       tutetwas(i++);
    start:
       if ( i < n )
           continue;
       if ( n >= N )
           break;
       n = N; i++;
    }
    

    🤡



  • camper schrieb:

    int i = 0;
    goto start;
    for(;;) {
       tutetwas(i++); //muss glaub i++ sein
    start:
       if ( i < n )
           continue;
       if ( n >= N )
           break;
       n = N;
    }
    

    🤡

    genial!
    Aber ich glaube goto wird nicht so gern gesehen 😃
    Ganz so übersichtlich ist es auch nicht.
    Aber tolle Idee.



  • Hans-Wurst schrieb:

    camper schrieb:

    int i = 0;
    goto start;
    for(;;) {
       tutetwas(i++); //muss glaub i++ sein
    start:
       if ( i < n )
           continue;
       if ( n >= N )
           break;
       n = N;
    }
    

    🤡

    genial!
    Aber ich glaube goto wird nicht so gern gesehen 😃
    Ganz so übersichtlich ist es auch nicht.
    Aber tolle Idee.

    Nee, das ist nur ein Witz.



  • Das würde auch noch gehen:
    for(int i=n+1; i<N+n ;i++){
    tutetwas(i % N);
    }
    aber ich glaub da ist if schneller



  • Hans-Wurst schrieb:

    Das würde auch noch gehen:
    for(int i=n+1; i<N+n ;i++){
    tutetwas(i % N);
    }
    aber ich glaub da ist if schneller

    Und die Zweischleifenvariante ist noch schneller. Aber wenn du Obfuscated C willst, ist Ausführungsgeschwindigkeit ja egal. 🙂



  • Also ich bin mir da nicht so sicher ob die 2. Variante wirklich schneller ist...


  • Mod

    Meine Vermutung ist ja, dass es nicht so sehr darum geht, zwei Schleifen zu vermeiden, als vielmehr die abzuarbeitenden Bedingungungen zu minimieren als auch Codeduplikation bzgl. tutetwas(i) zu vermeiden.

    Dann geht z.B. auch

    int i = 0;
    for (;;) {
        for (; i<n; ++i)
           tutetwas(i);
        if (n>=N)
            break;
        n=N;
        ++i;
    }
    

    oder

    int i = 0;
    do {
        for (; i<n; ++i)
           tutetwas(i);
        if (n<N) {
            n=N;
            ++i;
            continue;
        }
    } while (0);
    


  • Hans-Wurst schrieb:

    camper schrieb:

    int i = 0;
    goto start;
    for(;;) {
       tutetwas(i++); //muss glaub i++ sein
    start:
       if ( i < n )
           continue;
       if ( n >= N )
           break;
       n = N;
    }
    

    🤡

    genial!

    Genial ist lediglich die Verarsche.



  • Der echte Tim schrieb:

    Also ich bin mir da nicht so sicher ob die 2. Variante wirklich schneller ist...

    Das hängt davon ab, wie oft die Schleife durchlaufen wird.


Log in to reply