Frage zu logischen Operatoren.



  • Hallo zusammen,

    als neuer hier im Forum hab ich auch schon gleich eine Frage.
    Momentan arbeite ich das "C how to" durch und hatte bis jetzt eigentlich bei keinem Kapitel große Probleme.

    Allerdings wollen mir die logischen Operatoren nicht so recht in den Kopf. Das größte Problem macht mir der ! Operator.
    Hier der Link zu dem Kapitel:
    http://www.c-howto.de/tutorial-verzweigungen-logische-operatoren.html

    Was genau macht der jetzt? Die Funktion ist hier etwas seltsam beschrieben. Zeigt dieser Operator an, was nicht das Ergebnis sein darf und alles andere ist dann automatisch richtig?
    Hier mal ein Programmbeispiel von mir. So verstehe ich das noch momentan. Kommt das hin?

    #include<stdio.h>
    
    int main()
    { int explosion = 0;
    printf("Gebe auf keinen Fall und ich meine auf keinen Fall die 3 ein.");
    scanf("%d", &explosion);
    if(explosion != 3) {
    printf("Puuh! Zum Glück bist du vernünftig.");
    } else {
    printf("Krach Bumm!!!"); }
    return 0;
    }
    

    Das nächste, was mich etwas irritiert ist die Schreibweise. Er schreibt auf der Seite auf einmal einfach
    if (!0) {...

    Wäre das hier nicht richtig:
    if (variablename != 0) {...

    Auf der vorrigen Seite hat er das nämlich so gemacht. Auch fehlen hier zwei mal ein"else".
    Wäre für ein paar Tipps sehr dankbar.

    Viele Grüße

    Maik



  • BIOSzillator schrieb:

    Allerdings wollen mir die logischen Operatoren nicht so recht in den Kopf. Das größte Problem macht mir der ! Operator.
    Hier der Link zu dem Kapitel:
    http://www.c-howto.de/tutorial-verzweigungen-logische-operatoren.html

    Was genau macht der jetzt? Die Funktion ist hier etwas seltsam beschrieben. Zeigt dieser Operator an, was nicht das Ergebnis sein darf und alles andere ist dann automatisch richtig?

    Nein, mit "dürfen" hat das nichts zu tun. Es geht um die symbolische Darstellung von Wahrheitswerten, also "wahr" und "falsch". Wahrheitswerte kommen in Programmen ganz natürlich überall da vor, wo man z.B. Vergleichsoperationen hat. Der Ausdruck x >= 0 hat einen Wahrheitswert als Ergebnis, entweder "wahr" oder "falsch", je nachdem, was gerade der Fall ist.

    In C werden Wahrheitswerte numerisch abgebildet. "falsch" ist 0, "wahr" ist 1. Alles was sonst noch ungleich 0 ist wird ebenfalls als "wahr" interpretiert. Mach mal folgendes:

    int x = 10, y = -10;
    int wx = x >= 0;
    int wy = y >= 0;
    

    Du wirst sehen, dass wx den Wert 1 hat ("wahr", denn x ist ja größer/gleich 0) und wy den Wert 0 ("falsch").

    Man kann nun mit Wahrheitswerten "rechnen". Die drei Operatoren dafür sind:
    ! ("nicht") -- kehrt den Wahrheitswert um, "wahr" wird zu "falsch" und "falsch" zu "wahr"
    && ("und") -- ist "wahr", wenn beide Teilausdrücke "wahr" sind
    || ("oder") -- ist "wahr", wenn mindestens einer der Teilausdrücke "wahr" ist

    Beispielsweise hätte im Programm oben !wx den Wert 0 und !wy den Wert 1.

    #include<stdio.h>
    
    int main()
    { int explosion = 0;
    printf("Gebe auf keinen Fall und ich meine auf keinen Fall die 3 ein.");
    scanf("%d", &explosion);
    if(explosion != 3) {
    printf("Puuh! Zum Glück bist du vernünftig.");
    } else {
    printf("Krach Bumm!!!"); }
    return 0;
    }
    

    In diesem Programm kommt der ! Operator nicht vor.

    Das nächste, was mich etwas irritiert ist die Schreibweise. Er schreibt auf der Seite auf einmal einfach
    if (!0) {...

    0 ist wie gesagt "falsch", ! kehrt das um und macht daraus "wahr" bzw. 1. Die Bedingung ist also wahr, der if-Zweig wird ausgeführt. Das ist u.U. ein bisschen sinnlos, weil die Bedingung konstant wahr ist und die if-Abfrage daher eigentlich auch weggelassen werden kann.

    Wäre das hier nicht richtig:
    if (variablename != 0) {...

    Als Ersatz für !0 ? Nein, wozu soll die Variable an der Stelle gut sein?

    Auf der vorrigen Seite hat er das nämlich so gemacht.

    Da war wahrscheinlich vom != Operator ("ungleich") die Rede. Hier geht es um ! ("nicht"). Andere Baustelle. Das ähnliche Aussehen hat auch einen Grund, nämlich damit != wie "nicht gleich" aussieht.

    Auch fehlen hier zwei mal ein"else".

    Der else-Zweig muss nicht hingeschrieben werden, wenn er leer ist.



  • Erstmal sollte dir bewusst sein, dass in C alles 'Zahlen' sind. Strings sind eine Anreihung von Zahlen, die mit ihrem Wert Buchstaben angeben, Zeiger enthalten Adressen als Positionswert im Speicher, usw.
    Bei Wahrheitsauswertungen wird einzigst die 0 als Falschaussage angesehen, alle anderen Zahlen sind eine Wahrheitsaussage.

    ! negiert die Wahrhaftigkeit des Wertes, also wird aus 0 eine andere Zahl (die meisten Compiler verwenden 1), aus einer Zahl ungleich 0 wird 0.



  • Du bringst da 2 verschiedene Operatoren durcheinander. Es gibt den !=-Operator (das Gegenstück zum ==-Operator), und den !-Operator.

    a != b vergleicht a und b. Wenn beide ungleich sind, ist der Wert des Ausdrucks 1, ansonsten 0.

    !a negiert a. Wenn a 0 ist, ist !a 1, ansonsten ist !a 0.

    edit: Hmm... hab doch extra vorher refreshed...



  • Vielen Dank euch drei für die sehr ausführlichen Antworten.
    Nachdem ich heute eure Tipps durchgegangen bin und herumprobiert habe, glaube ich, dass ich den Operato jetzt in der Theorie verstanden habe.
    Allerdings ist das Beispiel auf der Seite etwas irreführend bzw. nicht ausführlich genug erklärt.

    Hier mal mein Erklärungsversuch.
    Sein Code lautet ja:

    int a = 5;
    if(!0) printf("aus falsch wird wahr, 0 -> 1\n");
    if(!a) printf("aus wahr wird falsch, 5 -> 0\n");
    

    Wenn ich eure Erklärungen richtig verstanden habe, bedeutet die Abfrage
    if (0) einfach
    if (false), richtig?

    if (!0) würde demnach dann einfach
    if (true) bedeuten. Und da 5 wahr ist, wird dieser Text dann ausgegeben.

    Mit (!a) kehrt er dann sogesehen die 5 in eine 0 um.
    Ich hoffe, dass ich das jetzt richtig verstanden habe.

    Hab hier nochmal ein kleines Programm geschrieben.
    Interessanterweise werden hier beide Fälle als richti gangegeben.

    #include<stdio.h>
    
    int main() {
    int zahl = 0;
    if(!0) 
    printf("Fall 1 ist richtig.\n");
    if(!zahl)
    printf("Fall 2 ist richtig.\n");
    return 0;
    }
    

    Eigentlich dachte ich, dass er jetzt nur "Fall 2 ist richtig" anzeigen würde.
    Wenn ich den Code in {} mit else setze, wird sogar nur Fall 1 als richtig angegeben.
    Ich frage mich gerade, wo man sowas eigentlich in der Praxis brauchen könnte.

    Vielen Dank nochmal für eure Geduld und Hilfe. 😉



  • BIOSzillator schrieb:

    if (!0) würde demnach dann einfach
    if (true) bedeuten. Und da 5 wahr ist, wird dieser Text dann ausgegeben.

    Dein zweiter Satz gefällt mir nicht. 0 wird negiert nicht zu 5, sondern 1. Da 1 nicht 0 ist, ist es eine wahre Aussage.

    BIOSzillator schrieb:

    Interessanterweise werden hier beide Fälle als richti gangegeben.

    #include<stdio.h>
    
    int main() {
    int zahl = 0;
    if(!0) 
    printf("Fall 1 ist richtig.\n");
    if(!zahl)
    printf("Fall 2 ist richtig.\n");
    return 0;
    }
    

    Eigentlich dachte ich, dass er jetzt nur "Fall 2 ist richtig" anzeigen würde.
    Wenn ich den Code in {} mit else setze, wird sogar nur Fall 1 als richtig angegeben.

    Natürlich werden beide Fälle als richtig angegeben, weil bei beiden die Zahl 0 negiert wurde (Variable zahl ist schließlich auch 0).
    Und wenn du das zweite if durch else ersetzt, kannst du die englische Übersetzung wörtlich nehmen, dass der 2te Fall nur eintritt, wenn der erste fehlschlägt.



  • Hall Youka,

    auch dir danke.
    Bei der Negation hatte ich mich wohl missverständlich ausgedrückt.
    Die 5 bezog sich auf die Variable und nicht auf 0 zwischen den Klammern.
    Ich meinte, da ja jetzt 0 zu 1 negiert wurde und auch 5 wahr ist, printf ausgegeben wird.

    Wegen if und else:
    Alles klar. Jetzt weiß ich auch, warum bei mir vorher nur Fall 1 angezeigt wurde.
    Zwischen dem ersten und zweiten "if", stand nämlich auch ein else.


Anmelden zum Antworten