PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Logische Operatoren



darxun
06-12-2007, 11:33
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:

#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;
}

BLUESCREEN3D
06-12-2007, 13:49
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:


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.

Pingu
06-12-2007, 13:57
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.

darxun
06-12-2007, 14:13
Komisch in dem zitiertem Code geht es tatsächlich.

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


#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;
}

BLUESCREEN3D
06-12-2007, 15:17
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.:

erg = ((a && b) || (m && b)) > n;


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.


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 !=.


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.

darxun
06-12-2007, 16:06
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.


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

BLUESCREEN3D
06-12-2007, 17:19
A hat an der Stelle schon den Wert 3, weil weiter oben ++A steht.