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.