if und else



  • hab mal in einem programm gesehen wie eine if anweisung uebergeben wurde

    irgendwie mmit ? und :

    kann mir das mal jemand ereklaehren?

    irgendwie ist da noch ne if anweisung in meinem programm die jeweils die gleiche fkt mit verschiedenen variablen aufruft das wuerde ich gerne aendern

    mfg



  • ternärer operator



  • Ich persönlich halte davon wenig, da der Code dadurch meistens unübersichtlich wird. Höchstens bei returns wo ein bool'sches Flag abgefragt wird.

    Aber trotzdem:

    // Statt:
    if (Bedingung)
        foo(A);
    else
        foo(B);
    
    // Kann man auch schreiben:
    foo(Bedingung?A:B);
    
    // Einsetzen würde ich es aber aus Gründen der Übersichtlichkeit nur in solchen Fällen:
    Typ foo ()
    {
        bool flag = false;
    
        // hier könnte flag verändert werden
    
        return flag?A:B;
    }
    

    MfG SideWinder



  • Eine Option ist es auch in Fällen, wo ein Konstruktor in Abhängigkeit von einem Parameter ein anderes Objekt erhalten soll:

    Foo bar(flag ? obj1 : obj2);
    

    Das funktioniert die if/else-Geschichte nicht, weil das Objekt ja nicht lokal angelegt werden soll.

    Die einzige Möglichkeit wäre(wenn man die Objekte nicht kopieren möchte):

    Object * o;
    if(flag)
    {
      o = &obj1;
    }
    else
    {
      o = &obj2;
    }
    Foo foo(*o);
    

    Oder halt die Bestimmung des Parameters für den Konstruktor in ne Funktion auslagern.

    In diesem Falle finde ich die ?:-Variante aber am lesbarsten.
    Gibt's noch andere (bessere) Möglichkeit diesen Code ohne ?: zu schreiben?



  • SideWinder schrieb:

    Ich persönlich halte davon wenig, da der Code dadurch meistens unübersichtlich wird.

    Gab's dazu nicht ne ganz strikte Coding-Style Regel?
    Irgendwas mit "Common Sense" oder so...



  • also ich hab 3 zeilen code erspart

    finde das so uebersichtlicher

    FG



  • lookias schrieb:

    also ich hab 3 zeilen code erspart

    finde das so uebersichtlicher

    FG

    Was hat Zeileneinsparung mit Übersichtlichkeit zu tun? des Öfteren ist genau das Gegenteil der Fall.

    MfG SideWinder



  • if(blah==0)
    fkt(a)
    else
    fkt(b)
    /*ersetzt*/
    fkt(blah==0 ? a:b)
    

    finde ich uebrsichtlicher



  • Stilfrage, jeder hat seinen Geschamck und meiner ist richtig 😉

    MfG SideWinder



  • Ich finde

    fkt(blah ? a : b)
    

    noch übersichtlicher 😉 .



  • SideWinder schrieb:

    Was hat Zeileneinsparung mit Übersichtlichkeit zu tun? des Öfteren ist genau das Gegenteil der Fall.

    Zeilen einsparen hat sehr wohl was mit Übersichtlichkeit zu tun. Guter Code ist oft sehr kurz. Daß das Gegenteil der Fall sein soll halte ich für Quatsch. Der Code sollte zu kurz wie möglich sein. (aber so lang wie nötig!) So kann man sich gut auf eine Passage konzentrieren, weil sie schön kurz ist.
    Außerdem bringt kurzer Code die Intention meist besser auf den Punkt. Denn um die gleiche Information mit weniger Text zu übertragen benötigt man eine bessere Präzision.



  • Walli schrieb:

    Ich finde

    fkt(blah ? a : b)
    

    noch übersichtlicher 😉 .

    naja bei blah handelt es sich um einen zeiger 😉

    ausserdem sollte das bei dir dann

    !blah ? a : b
    

    heissen

    mfg



  • Zeilen einsparen hat sehr wohl was mit Übersichtlichkeit zu tun. Guter Code ist oft sehr kurz.

    guter code ist gut, weil er gut designt ist, nicht verkrüppelt durch komische sprachkonstrukte!



  • otze schrieb:

    Zeilen einsparen hat sehr wohl was mit Übersichtlichkeit zu tun. Guter Code ist oft sehr kurz.

    guter code ist gut, weil er gut designt ist, nicht verkrüppelt durch komische sprachkonstrukte!

    Ja, un dich sage: noch dazu ist er oft kurz.

    ich schrieb nicht: kurzer Code ist gut, sondern guter Code ist kurz!
    Zumindest wollte ich das ausdrücken. 😉

    Daher auch das so kurz wie möglich, aber so lang wie nötig. Auf keinen Fall kürzer!



  • lookias schrieb:

    Walli schrieb:

    Ich finde

    fkt(blah ? a : b)
    

    noch übersichtlicher 😉 .

    naja bei blah handelt es sich um einen zeiger 😉

    ausserdem sollte das bei dir dann

    !blah ? a : b
    

    heissen

    Eh, meine ich ja. Hatte vergessen das a und b zu tauschen.

    fkt(blah ? b : a)
    

    So ist richtig...



  • ich hab das mal bei nem dozenten in einem demonstrationsprogramm gesehen,
    irgendwie fand ichs komisch weil das ne anfaenger veranstaltung war.

    aber fuer jemanden der das kennt denke ich kann das gezielt eingesetzt ganz praktisch sein,
    obwohl ich natuerlich nich die kompetenz besitze hier mitzureden

    mfg



  • Daher auch das so kurz wie möglich, aber so lang wie nötig. Auf keinen Fall kürzer!

    Ich weiß, worauf die hinaus willst, ich möchte nur darauf hinweisen, dass das nicht toller Code ist nur weil man Zeilen gespart hat:

    for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
    

    MfG SideWinder



  • es kommt ja nicht nur drauf an was man selbst übersichtlicher findet, sondern was die Allgemeinheit derer, die sich den Code irgendwann antun müssen (weiterentwicklung, wartung etc.) übersichtlicher findet.

    Wenn das nur du selbst bist ists dir natürlich freigestellt, aber schon wenn du die Möglichkeit in Betracht ziehst, bei Problemen mal hier oder andernorts nachzufragen, solltest du die if-else-schreibweise bevorzugen.

    Apropos Übersichtlich:

    set(a);
    b = set_b();
    while (a!=b)
      {
      if (a>0) a--;
      else if (a<0)
        {
        b--;
        a++;
        foo(b);
        }
      else b = 0;
      foo2(b);
      }
    

    kann man auch "übersichtlicher" schreiben:

    for(set(a),b=set_b();a!=b;((a>0)?a--:(a<0)?(a++,foo(--b)):b=0),foo2(b)){}
    

    /edit: mist, zu spät ^^



  • Ich find beide varianten nicht sonderlich übersichtlich ;P

    Code sollte lesbar sein - das ist er manchmal eher mit einem if, manchmal mit einem ?:, und meistens überhaupt nicht.

    Wolln' wir uns mal über was richtiges streiten? Wieviele Zeichen pro Zeile maximal? 🕶



  • 80 Zeichen, damit man den Code evtl. noch vernünftig ausrucken kann. 😉

    Bedingte Zuweisungen sind fein, man sollte nur darauf achten, dass man sie nicht zu kompliziert macht, eine gute Mischung aus beidem ist, denke ich, angebracht, aber situationsbedingt.


Anmelden zum Antworten