if Anweisung



  • Hallo

    ich könnte einen Tipp bei den if-Anweisungen gebrauchen.

    In diesem Fall bezieht sich das else nur auf die letzte if

    if()
    {}
    if()
    {}
    else
    {}
    

    In diesem Fall wird nur eine if-Anweisung ausgeführt.

    if()
    {}
    else if()
    {}
    else
    {}
    

    Wie kann ich aber jetzt programmieren dass das else ausgeführt wird nur wenn beide if Bedingungen nicht zutreffen aber es sollen auch beide if Bedingungen ausführbar sein.

    MfG



  • Ein else bezieht sich immer auf genau ein if, aber eventuell könntest du dein Ziel erreichen, indem du stattdessen ein weiteres if mit der negierten Bedingung verwendest:

    if(a)
    {...}
    if(b)
    {...}
    if(!a && !b)
    {/* universal-else */}
    


  • Eigentlich ist es schade. Aber eine schöne Schreibweise (=ohne bool-Flag) für das scheint es wohl nicht zu geben:

    if(a)
    {... if (b) goto b_;}
    if(b)
    { b_: ... }
    else
    {}
    


  • gemeint war else if (b)



  • Naja, da ist

    int fallback = 1;
    
    if(bedingung1) {
      ...
      fallback = 0;
    }
    if(bedingung2) {
      ...
      fallback = 0;
    }
    if(fallback) {
      // "else-Zweig hier"
    }
    

    doch noch etwas sinnvoller - weniger Code, die Bedingungen nicht doppelt ausgetreten. Aber ich denke, man könnte sich hier mit Makros ganz gut behelfen:

    #define FALLBACK_IF(cond) if(fallback = fallback && (cond))
    #define FALLBACK          if(fallback)
    int fallback = 1;
    
    FALLBACK_IF(bedingung1) {
    }
    FALLBACK_IF(bedingung2) {
    }
    ...
    FALLBACK {
      // "else"-Zweig hier
    }
    

    Ggf. könnte es sinnvoll sein, die Statusvariable als Parameter an die Makros zu übergeben, um das Konstrukt schachteln zu können.



  • Mag sein, dass es nur an meinem leicht begrenzten Abstraktionsvermögen liegt, aber für mich mit relativ geringer Erfahrung in C ist seldon's Makro-Lösung (wenn auch 'sophisticated') auf den ersten Blick schwer zu lesen.

    Frei nach John Woods:

    Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Code for readability.<<

    Ich persönlich würde wohl auf die boolsche Lösung ausweichen 🤡 Nur, damit nicht irgendwann mein Nachfolger mit der Axt kommt 😉



  • Pretty schrieb:

    Mag sein, dass es nur an meinem leicht begrenzten Abstraktionsvermögen liegt, aber für mich mit relativ geringer Erfahrung in C ist seldon's Makro-Lösung (wenn auch 'sophisticated') auf den ersten Blick schwer zu lesen.

    Frei nach John Woods:

    Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. Code for readability.<<

    Ich persönlich würde wohl auf die boolsche Lösung ausweichen 🤡 Nur, damit nicht irgendwann mein Nachfolger mit der Axt kommt 😉

    Vor allem, da die boolsche Lösung viel kürzer, einfacher nachzuvollziehen und daher für Anfänger weniger fehleranfällig ist... 🙂



  • Nur muss man eben bei den "Lösungsvorschlägen" auch berücksichtigen, welche "Vorgaben" der Fragensteller macht oder entsprechend gemacht bekommt.

    Da unterscheidet sich die Vorstellung einer adäquaten Lösung für den Dozenten doch gelegentlich erheblich von einer praxisorientierten Realisierung 🙂



  • Berichtigung: Ich hab die Korrelation falsch herum modelliert. Gemeint ist eigentlich

    #define FALLBACK_IF(cond) if(fallback = fallback || (cond))
    #define FALLBACK          if(!fallback)
    int fallback = 0;
    

    Dann wird

    FALLBACK_IF(a == b)
    

    zu

    if(fallback = fallback || (a == b))
    

    D.h. Das boolsche Flag wird bei jedem FALLBACK_IF upgedatet. Man könnte auch

    #define FALLBACK_IF(cond) if((cond) && (fallback = 1))
    

    schreiben.


Anmelden zum Antworten