C++ falsche Abzweigung bei if/else



  • theta schrieb:

    if(input == "ja" || "Ja" || "JA")
    

    ➡

    if(input == "ja" || input == "Ja" || input == "JA")
    

    Ich liefer mal das "warum" nach:

    "Ja" und "JA" sind char* - Literale. Die ||-Operatoren erwarten boolsche Werte. Pointer (also auch char*) können implizit in bool konvertiert werden, wobei alles was nicht NULL ist true ergibt. Deine Abfrage ist also "if (input == "ja" || true || true) -> also immer true.



  • Alles klar, vielen Dank, jetzt klappt's. Und danke für den Tipp von theta.



  • if(input == "ja" || input == "Ja" || input == "JA")
    {
      cout << "JA" << endl;
      system("PAUSE");
      return 0;
    }
    else
    {
      cout << "NEIN" << endl;
      system("PAUSE");
      return 0;
    }
    return 0;
    

    schickerer Code:

    transform(input, input+2, input, toupper);
    std::cout << input == "JA" ? "JA" : "NEIN";
    system("PAUSE");
    return 0;
    

    BTW:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html schrieb:

    Achtung: Der Aufruf von system("pause") ist kein adäquater Ersatz! Warum system() grundsätzlich gemieden werden sollte (nicht nur weil es verdammt langsam ist), findet ihr in diesem FAQ-Beitrag: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html



  • Weil ich es grad sehe: Vielleicht solltest Du Dir auch klar darüber werden, wann man lokale und wann globale Variablen verwendet. In diesem Spielzeug-Code hier ist es zwar ziemlich egal für die Funktion des Programms, aber es würde sich schon vom Stil her anbieten 'input' lokal zu halten. Das 'system("PAUSE");' ist auch nicht so schön und kann mit den standardisierten Stream-Operationen nachgebildet werden. Wie gesagt, hier ist es nicht so wahnsinnig schlimm, aber für die Zukunft kann man sich das mal merken, bevor man sich Murks angewöhnt 😉 . Am besten wäre natürlich noch das kompilierte Programm in einer Konsole so zu starten, dass man nicht erst überflüssigerweise pausieren muss um das Ergebnis zu sehen. Beim Visual Studio und anderen IDEs gibt es da IIRC eine Option und zur Not kann man es selber direkt aus einer offenen Konsole starten.



  • Das mit der globalen Variable liegt daran, dass ich in dem eigentlichen Programm mehrere Funktionen habe, die auf die Variable Input zugreifen müssen. system("PAUSE"); habe ich deshalb verwendet, weil ich andere Möglichkeiten noch nicht kannte. Lasse mich aber gern belehren.



  • videotuner schrieb:

    Lasse mich aber gern belehren.

    Dann kannste dir ja mal dies hier durchlesen 🙂

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html


  • Mod

    videotuner schrieb:

    Das mit der globalen Variable liegt daran, dass ich in dem eigentlichen Programm mehrere Funktionen habe, die auf die Variable Input zugreifen müssen.

    Umso schlimmer. Da gibt es viel bessere, viel weniger fehleranfällige Methoden für.



  • videotuner schrieb:

    if(input == "ja" || "Ja" || "JA")
    

    Jaah, manchmal wünsche ich mir echt sowas machen zu können. Fein und klein halt 🙂



  • Ein

    if(collection("Ja", "ja", "JA").contains(input))
    

    liegt durchaus im Bereich des Machbaren.



  • Michael E. schrieb:

    Ein

    if(collection("Ja", "ja", "JA").contains(input))
    

    liegt durchaus im Bereich des Machbaren.

    Leider viel zu umständlich. Natürlich kann ich mir viel Funktionalität selber nachbilden, aber solche "menschlich gesehenen" einfachen Konstrukte sollten lieber build-In sein.

    Sowas wäre echt viel schöner:

    if(0 < zahl < 15)
    if(zahl == 5 || 3)
    if(str != "Y" || "N")
    

    Statt:

    if(variable(zahl).isBetween(0,5))
    
    if(variable(zahl).contains(3,5))
    if(variable(zahl).contains(3,5,6,23))
    
    if(variable(str).containsNot("Y","N"))
    if(variable(str).containsNot("Y","N","y","n"))
    

    Naja, auch geschmacksache 😉 Wobei, wenn ich die variable().func() Konstrukte sehe, mir das leserlich mehr gefällt, als die kryptischen Zeichen oben.



  • KasF schrieb:

    Sowas wäre echt viel schöner:

    if(zahl == 5 || 3)
    

    Aber geht halt nicht, weil

    bool b,c,d;
    ...
    if(b == c || d)
    

    Dagegen könnte man aber ein neues Sprachmittel einführen:

    if(b == c || b==d || b==e)
    

    bekommt die abkürzende Schreibweise

    if( (b ==) c || d || e)
    

    Natürlich auch alle anderen Operatoren zulassen. Wie schön das wird!
    Statt dem häßlichen

    if( (pow(a,2) + pow(b,2) <= pow(c,2) )
    

    Kann man jetzt gleichen Code zusammenziehen, der irgendwie mit allen im Bedinungsausdruck beteiligten Variablen zu tun hat.

    if( ( pow( ) a+b==c ( ,2) ) )
    

    Natürlich auch mit der sqrt-Variante des Satzes des Pythagoras.

    if( sqrt( ( pow( ) a+b ( ,2) ) )<=c )
    


  • KasF schrieb:

    Statt:

    [..]
    if(variable(zahl).isBetween(0,5))
    [..]
    if(variable(str).containsNot("Y","N","y","n"))
    [..]
    

    Du kannst ja auch
    if(inRange(0, zahl, 5))
    und
    if(str == multiCompare("Y","N","y","n"))
    machen.

    wobei multiCompare halt kein schöner name ist...
    das inRange verwende ich zB sehr oft.


Anmelden zum Antworten