Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Logische Operatoren

  1. #1
    Registrierter Benutzer
    Registriert seit
    22.10.2006
    Beiträge
    76

    Unhappy Logische Operatoren

    Variablen:

    A=2, B=4, C=5
    M=3.5489f, N=2.2122f

    Logische Operation:
    (B!=C)||(A==3)

    Mein "erdachtes" Ergebnis:
    (B!=C)=1 (da wahr)
    (A==3)=0 (da unwahr)
    --> 1||0=1 (da eins von beiden wahr)

    Der PC gibt allerdings hierfür "0" aus, wieso?

    Logische Operation:
    (A==(int)M==(int)--N)&&C


    Mein "erdachtes" Ergebnis:
    (int)M=3 (da alle weiteren Stellen einfach ignoriert werden)
    A==(int)M=0 (bzw. 2=3 --> unwahr)
    0==(int)--N=0 (bzw. 0=1 mit N=2-1 --> unwahr)
    also 0&&C=0 (unwahr, da nicht beide ungleich 0)

    Der PC gibt allerdings hierfür "1" aus, wieso?


    Mein Prg:
    Code:
    #include <stdio.h>
    
    int main (void)()
    {
    char A=2 ,B=4, C=5;
    float M=3.5489f ,N=2.2122f;
    char Erg=0;
    
    
    Erg=(B!=C)||(A==3); printf ("%i\n", Erg); Erg=(A==(int)M==(int)--N)&&C; printf ("%i\n", Erg);
    return 0; }

  2. #2
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Wenn ich das Programm laufen lassen wir erst eine 1 und dann eine 0 ausgegeben und so sollte es auch sein.
    Deine Begründung dafür ist auch richtig, abgesehen von einer Sache:
    Zitat Zitat von darxun Beitrag anzeigen
    N=2.2122f
    0==(int)--N=0 (bzw. 0=1 mit N=2-1 --> unwahr)
    Hier gilt nicht N=2-1, sondern während dem Dekrementieren ist das noch ein Float-Wert, also --N=1.2122f und das wird dann nach int gecastet, ergibt also 1.

  3. #3
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Ich verwende immer exzessiv Klammern, weil ich mir nicht immer wirklich sicher bin was nun Vorrang hat und was nicht.

    Aber ein paar Bemerkungen hätte ich:

    1. Gibt es bei Dir den Operator != für ungleich für rationale Zahlen?
    Ich hätte eher Erg = (B <> C) || (A == 3); geschrieben.

    2. Du weißt, dass Increments immer nur mit ganzzahligen, rationalen Zahlen und nicht mit gebrochenen funktionieren?
    Ich hätte eher Erg = (A == ((int)M) == --((int)N)) && C; geschrieben.
    Homepage: www.pingu.info

  4. #4
    Registrierter Benutzer
    Registriert seit
    22.10.2006
    Beiträge
    76
    Komisch in dem zitiertem Code geht es tatsächlich.

    Allerdings nicht im Gesamtprg (siehe 6. und 8. logische Operation):

    Code:
    #include <stdio.h>
    
    int main (void)
    {
    char A=2, B=4, C=5;
    float M=3.5489f, N=2.2122f;
    char Erg=0;
    
    	Erg=(A>3)&&(B<3);
    	printf("%i\n\n", Erg);
    
    	Erg=A&&B||C;
    	printf("%i\n\n", Erg);
    
    	Erg=((A&&B)||(M&&B))>N;
    	printf("%i\n\n", Erg);
    
    	Erg=(B++&&A)<=5;
    	printf("%i\n\n", Erg);
    
    	Erg=(C!=B)<A;
    	printf("%i\n\n", Erg);
    
    	Erg=(B!=C)||(A==3);
    	printf("%i\n\n", Erg);
    
    	Erg=(int)M==++A;
    	printf("%i\n\n", Erg);
    
    	Erg=(A==(int)M==(int)--N)&&C;
    	printf("%i\n\n", Erg);
    
    	Erg=(C!=M)||(int)N!=(float)A;
    	printf("%i\n\n", Erg);
    
    return 0;
    }

  5. #5
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von darxun Beitrag anzeigen
    Komisch in dem zitiertem Code geht es tatsächlich.

    Allerdings nicht im Gesamtprg (siehe 6. und 8. logische Operation)
    Kein Wunder: B++ verändert ja den Wert von B (bei der 4. Operation).

    Zwei Tipps an dich, falls du das Programm geschrieben hast: In C schreibt man normale Variablen klein und etwas mehr Leerzeichen wären gut für die Lesbarkeit, z.B.:
    Code:
    erg = ((a && b) || (m && b)) > n;
    Zitat Zitat von Pingu Beitrag anzeigen
    Ich verwende immer exzessiv Klammern, weil ich mir nicht immer wirklich sicher bin was nun Vorrang hat und was nicht.
    Das ist vermutlich eine Übungsaufgabe und absichtlich ohne Klammern.

    Zitat Zitat von Pingu Beitrag anzeigen
    1. Gibt es bei Dir den Operator != für ungleich für rationale Zahlen?
    Ich hätte eher Erg = (B <> C) || (A == 3); geschrieben.
    In C gibt es kein <> sondern nur !=.

    Zitat Zitat von Pingu Beitrag anzeigen
    2. Du weißt, dass Increments immer nur mit ganzzahligen, rationalen Zahlen und nicht mit gebrochenen funktionieren?
    Ich hätte eher Erg = (A == ((int)M) == --((int)N)) && C; geschrieben.
    Wie kommst du darauf? Natürlich geht das - es könnte zwar zu Abweichungen durch nicht darstellbare Ergebnisse kommen, aber der Operator ist anwendbar.

  6. #6
    Registrierter Benutzer
    Registriert seit
    22.10.2006
    Beiträge
    76
    Zitat Zitat von BLUESCREEN3D Beitrag anzeigen
    Hier gilt nicht N=2-1, sondern während dem Dekrementieren ist das noch ein Float-Wert, also --N=1.2122f und das wird dann nach int gecastet, ergibt also 1.
    Code:
    Erg=(A==(int)M==(int)--N)&&C
    A==(int)M --> 2==3.5489 --> unwahr --> 0

    0==(int)--N --> 0=1 --> unwahr -->0

    0 && C --> 0 und 5 --> unwahr, da 0 und 5 nicht nicht 0 --> 0

    Gesamt: 0

    Wieso gibt C also 1 und nicht 0 als vorletztes Ergebnis

  7. #7
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    A hat an der Stelle schon den Wert 3, weil weiter oben ++A steht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •