Fehler im Tutorial?



  • Hey,

    Heute bin ich bei den if-Verzweigungen angekommen, genauer bei der Negation. Es wurde mir alles ordentlich erklärt aber folgendes Codebeispiel macht mich stutzig:

    int a=0, b=3;
    
    if(!a && b > 1) {
    	printf("a ist nicht wahr und b ist groesser 1\n");
    }
    

    Ist ja eigentlich super simpel aber müsste nicht bei der Ausgabe stehen (wenn printf auch ausgeführt werden soll: "a ist wahr und b ist groesser 1"? Weil a=0 also unwahr, doch wird dies bei if zu wahr invertiert. Also müsste da stehen dass a wahr ist , oder? Ist da ein Fehler im Tutorial bzw. Codebeispiel oder liegt bei mir ein Denkfehler vor?

    MfG



  • Beachte das ! vor a. Das ist der Negierungsoperator. Der macht aus wahr unwahr und umgekehrt.



  • Ja, aber erst ist ja a unwahr weil a = 0 (0 ist ja unwahr). Aber nun steht in der if-Anweisung !a. Also wird aus dem unwahr, wahr. Deshalb müsste in der printf-Anweisung stehen: "A ist wahr und b ist groesser 1.".

    Edit: Oder ist es vielleicht so zu verstehen dass der If-Block nicht ausgeführt wird wenn eine Variable in den If-Bedingungen den Wert 0 hat und wenn der Wert einen anderen Wert hat dass er ausgeführt wird. So würde "!" zum Beispiel die Variable a=0 (die ja eigentlich unwahr ist) in der If-Bedingung als wahr zählen lassen und umgekehrt. So müsste es richtig sein und nur ein kleiner Denkfehler von mir, richtig? Der Satz: ""a ist nicht wahr..." würde sich dann nicht auf die If-Bedingung beziehen sondern sondern nur auf die Variable die vorder If-Abfrage initialisiert wurde.



  • thewolf16 schrieb:

    Aber nun steht in der if-Anweisung !a. Also wird aus dem unwahr, wahr.

    Da liegt dein Denkfehler. !a liefert lediglich den negierten Wert von a zurück, a selbst wird dabei nicht verändert...



  • Also ist mein Edit über deinen Beitrag richtig?



  • Der if-Block wird nicht ausgeführt wenn die Bedingung unwahr ist. !a ist aber wahr (weil a unwahr ist), b > 1 ist auch wahr, also ist die Bedingung:
    !a und b > 1
    auch wahr.



  • Ok, Danke euch. Damit ich nicht extra einen neuen Thread eröffnen muss würde ich euch gerne Fragen was an meinem Code falsch ist:

    #include<stdio.h>
    
    int main()
    {
    int getraenk = 0;
    int einwurf = 0;
    int einwurf1 = 0;
    
    printf("Getraenke Automat v0.2 by Dominik Wolf\n");
    printf("\nWaehlen Sie Ihr Getraenk aus:");
    printf("\n1) Wasser (0,50 Euro)");
    printf("\n2) Limonade (1,00 Euro)");
    printf("\n3) Bier (2,00 Euro)\n");
    scanf("%d", &getraenk);
    
    switch(getraenk)
        {
        	case 1: printf("\nSie haben sich für ein Wasser entschieden."); 
    		        einwurf = 50;
    				break;
        	case 2: printf("\nSie haben sich für eine Limonade entschieden.");
    		        einwurf = 1;
    			    break;
        	case 3: printf("\nSie haben sich für ein Bier entschieden."); 
    		        einwurf = 2;
    				break;
        	default: printf("\nKeine gültige Eingabe!");
        }
    
    if(getraenk == 50)
       {
       	printf("\nBitte werfen Sie 0,50 Euro ein (50)\n" );
       	scanf("%d", einwurf1);
       }
       else if(getraenk == 1)
       {
       	printf("\nBitte werfen Sie 1 Euro ein (1)\n" );
       	scanf("%d", einwurf1);
       }
       else if(getraenk == 2)
       {
        printf("\nBitte werfen Sie 2 Euro ein (2)\n" );
        scanf("%d", einwurf1);
       }
       else
          {
          	printf("\nKeine gültige Eingabe!");
          }
    
    switch(einwurf1)
          {
         case 50: printf("\nVielen Dank, bitte entnehmen Sie Ihr Wasser.");
         case 1: printf("\nVielen Dank, bitte entnehmen Sie Ihre Limonade.");
         case 2: printf("\nVielen Dank, bitte entnehmen Sie Ihr Bier.");
         default: printf("\nKein gültiger Einwurf.");
          }  
    
    	  return 0;    
    
    }
    

    Das Programm hängt sich nämlich immer nach dem Geldeinwurf auf.



  • Dann vergleiche doch mal die Zeilen wo die Eingabe erfolgt:

    scanf("%d", &getraenk); // Geht
     scanf("%d", einwurf1); // geht nicht
    

    gibt es da einen Unterschied?

    Du kannst auch die Compilerwarnungen beachten und wie Fehler behandeln.

    Das ist ein neues Thema, also auch ein neuer Thread.



  • Ah, ok. & vergessen. Dazu noch ein paar fehlende breaks und ein paar unlogische if-Bediengungen. Hab nun alles gefixt und ist nun alles bugfrei. Das nächste Mal werde ich einen neuen Thread eröffnen. Danke euch. 🙂


Log in to reply