Verständnisproblem if-Abfragen-Bedingungen



  • Hi,

    ich hab wiedermal ein Verständnisproblem: Für zwei Übungsbeispielen welche if-Abfrageb behandeln liegen für mich vollkommen unverständliche Ergebnisse vor.

    int a = 1, b = 2, c = 0;
    
    if (a == b == c)
    if (a == b)
    cout << "A" << a;
    else
    cout << "B" << b;
    
    else
    if (b == c)
    cout << "C" << c;
    else
    cout << "HOPPLA";
    
    cout << a << b << c;
    

    Hier ist das Ergebnis: B2120
    Für mich wäre allerdings: HOPPLA120 logisch da a, b, und c ja eben nicht a==b==c sind 😕

    int a = 0, b = 0, c = 0;
    if (a == b == c)
    if (a == b)
    cout << "A" << a;
    else
    cout << "B" << b;
    else
    if (b == c)
    cout << "C" << c;
    else
    cout << "HOPPLA";
    
    cout << a << b << c;
    

    Hier ist die Lösung C0000, für mich wäre aber A0000 richtig... wo hab ich meinen Denkfehler? 😞

    Cheers,
    Flügelnuss





  • Tipp: Was genau bedeutet a==b? Das heißt, welchen Datentyp hat das Ergebnis und welchen Wert unter welchen Bedingungen? Was genau bedeutet a==b==c?



  • int a = 0, b = 0, c = 0;
    
    if (a == b == c)
    {
      if (a == b)
      {
       cout << "A" << a;
      }else
      {
      cout << "B" << b;
      }else
      {
      if (b == c)
      cout << "C" << c;
      }else
      {
      cout << "HOPPLA";
      }
      cout << a << b << c;
    

    eig müsste "AC000" rauskommen wenn ich das richtig sehe... aber ich kann das nicht einschätzen mir fehlen da die klammern...!!

    aber egal... wenn "C" da ist und "A" da sein sollte dann schau was das verursacht und wo dein fehler sein könnte...
    ich kann deinen code nicht wirklich nachvollziehen ... habe gerade keine ide zurhand... sind die klammern bei mir so richtig gesetzt? wie du es meintest?

    falls ja dann kannst du die 2. "if" abfrage wegmachen , entweder machst du 3 ifs ... ist am besten leserlich oder du nutzt else if... 2mal...
    -> dann kann man den code besser lesen und du hast nicht solche komischen fehler...
    die ifabfragen sind auch sehr verschachtelt...

    vll in etwa so:

    int a=0;
    int b=0;
    int c=0;
    
    if(a==b==c)
    {
    
     if(a==b)
     {
      cout << "A" << a;
     }
    
     if(b==c)
     {
      ....
     }
    
    }
    


  • ps. was ich damit meine ist wenn du deinen code leserlicher anordnest siesht du den fehler alleine 😉 , außer du kennst die funktion von if-abfragen nicht richtig 🙄 ....


  • Mod

    a == b == c
    ist
    ( a == b ) == c
    und macht wahrscheinlich nicht das, was beabsichtigt ist.

    Da c int ist, wird das Ergebnis von a == b für den Vergleich mit c in ein int konvertiert (false=>0, true=>1).



  • @NAJA den Code hab nicht ich geschrieben, ich sollte lediglich den output herausfinden.

    @bashar & @camper: Nunja hier ist mein Problem, ich weiß nicht was a==b==c macht. Ich hatte angenommen das ist ein Vergleich aber ich schätze mal das stimmt nicht?



  • flügelnuss schrieb:

    @bashar & @camper: Nunja hier ist mein Problem, ich weiß nicht was a==b==c macht.

    Wie könnte man das herausfinden?

    (Eigentlich hat camper die Frage schon beantwortet.)



  • (Eigentlich hat camper die Frage schon beantwortet.)

    Nicht nur eigentlich^^

    1tes Beispiel:
    a = 1, b = 2, c = 0
    Für:
    a == b == c
    -> (a == b) == c

    Also: 1 == 2 -> False -> 0
    0 == c
    -> 0 == 0 -> True -> 1

    D.h. die erste if-Bedingung trifft zu.

    Da a == b -> 1 == 2 -> falsch ist, trifft das else zu, die Lösung fängt also mit "B" an.

    Nach genau dem gleichen Schema wird auch das zweite Beispiel (korrekt) gelöst.



  • Ohne Klammern könntest du eigentlich ganz happy sein, daß dir dein Compiler nicht sagt "Gehe zurück auf Los und steck dir unterwegs keine 2000 DM ein".

    int a = 1, b = 2, c = 0;
    
    if (a == b == c)
    {
    	if (a == b)
    	{
    		cout << "A" << a;
    	}
    	else
    	{
    		cout << "B" << b;
    	}
    } 
    else
    {
    	if (b == c)
    	{
    		cout << "C" << c;
    	}
    	else
    	{
    		cout << "HOPPLA";
    	}
    }
    cout << a << b << c;
    

    Macht zwar genausowenig Sinn, sieht aber schon viel übersichtlicher aus.


Anmelden zum Antworten