|
You last visited: Today at 23:24
Advertisement
Boolesche Werte - Unklarheit
Discussion on Boolesche Werte - Unklarheit within the C/C++ forum part of the Coders Den category.
06/16/2012, 00:28
|
#1
|
elite*gold: 80
Join Date: Oct 2007
Posts: 190
Received Thanks: 23
|
Boolesche Werte - Unklarheit
Ich bins wieder und mal wieder belästige ich euch mit meinen Fragen & Unklarheiten.
Momentan bin ich an dem Kapitel "Operatoren und ihre elementaren Datentypen" gelangt und am Ende des Kapitels verstehe ich den Quellcode nicht.
Ein kleiner Ausschnitt vom Quellcode
PHP Code:
bool erg = false;
int y = 5;
erg = 7 || (y = 5);
cout << "Wert von (7 || (y = 0 )): " << erg << endl;
cout << "Wert von y: " << y << endl;
Warum setzt der Autor das Objekt erg auf false und dann weißt später dem Objekt den Wert 7 zu?
Der Ausdruck "7 || y = 0" beinhaltet kein Vergleichsoperator, warum ist aber dann der gesamte Ausdruck true?
Wenn das an der "7" liegt, ich dachte Vergleichsoperatoren, wie &&, || haben eine höhere Priorität als Zuweisungsoperatoren.
Warum hat y am Schluss den Wert 5? Wenn es im Ausdruck den Wert 0 zugewiesen bekommen hat?
Bei der Ausgabe sieht es wie folgt aus:
Quote:
Wert von (7 || ( y = 0 )): true
Wert von y = 5;
|
Der Autor hat auch keine Bemerkung zu dem Quellcode gegeben.
Ich habe mir gründlich die Seiten angeschaut und sorgfältig durchgelesen.
Wahrscheinlich liegt es hier an der mangelnden Erklärungsweise.
PS: Falls jemand mir seine Hilfe im Bereich C++ anbietet, kann er mir gerne seinen Skype-Namen hinterlassen.
So kann ich mich an jemanden wenden und fragen.
|
|
|
06/16/2012, 01:27
|
#2
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
sicher, dass du alles richtig abgeschrieben hast?
das da ist nämlich mehr als erbärmlich.
ok, ich erklärs mal zeile für zeile:
hier wird ein bool 'erg' erstellt und mit false initialisiert, die initialisierung ist eigtl unnötig, da nachher sowieso darauf geschrieben wird, ohne dass vorher davon gelesen wird.
ein int 'y' wird mit 5 initialisiert.
Code:
erg = 7 || (y = 5);
erste zeile die wenig sinn macht.
dort wird nun folgendes getan:
zuerst wird "7" auf wahrheit überprüft, da es != 0 ist, ist es true.
das ODER wird nun garnicht mehr ausgeführt, da das erste bereits wahr war, d.h. in erg ist nun true.
wenn es weitergegangen wäre, würde nun 5 auf y zugewiesen werden und dies dann ebenfalls auf wahrheit überprüft werden.
Da 5 != 0 ist, wäre dies ebenfalls wahr, spielt aber wie gesagt keine rolle, da der code nie ausgeführt wird.
Code:
cout << "Wert von (7 || (y = 0 )): " << erg << endl;
hier wird auf der console "Wert von (7 || (y = 0 )): " ausgegeben, man beachte, dass es nur eine ausgabe ist, hier wird kein code ausgeführt!
dann wird erg hinterher ausgegeben was wie gesagt true ist.
und noch ein zeilenumbruch hinterher.
Code:
cout << "Wert von y: " << y << endl;
der string "Wert von y: " wird ausgegeben, dann der wert von y, der durch die initialisierung
= 5 ist und wieder ein zeilenumbruch.
ka, was dieser merkwürdige code soll, vielleicht demonstrieren wie leicht fehler passieren können wenn man zuweisung und vergleich vertauscht?
|
|
|
06/16/2012, 01:33
|
#3
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
|
Zunächst einmal ist in deiner dritten Zeile wahrscheinlich eigentlich "7 || (y = 0)" gemeint.
Quote:
Originally Posted by dunkis
Warum setzt der Autor das Objekt erg auf false und dann weißt später dem Objekt den Wert 7 zu?
|
Er weißt erg später nicht 7 zu, sondern das Ergebnis von "7 || (y = 5)".
Quote:
Originally Posted by dunkis
Der Ausdruck "7 || y = 0" beinhaltet kein Vergleichsoperator, warum ist aber dann der gesamte Ausdruck true?
|
Du meinst "7 || (y = 0 )".
Der ||-Operator ist ein logisches OR. Das heißt, wenn entweder der linke oder der rechte Operand ("7" ist der linke Operand; "y = 0" ist der rechte Operand) oder alle beide true sind, ist der gesamte Ausdruck true. Bei beiden Operanden handelt es sich um Integer-Werte, d.h. 0 wird als false gewertet, alles andere ist true. Zuweisungen wie "y = 0" haben als Resultat den Wert, der dem Objekt zugewiesen wird (in diesem Fall die 0). Vereinfacht ist also der Ausdruck "7 || 0", bzw. "true || false". Deswegen wird erg true zugeordnet.
Quote:
Originally Posted by dunkis
Wenn das an der "7" liegt, ich dachte Vergleichsoperatoren, wie &&, || haben eine höhere Priorität als Zuweisungsoperatoren.
|
Da hast du Recht. Durch die Klammern bekommt "y = 0" allerdings - wie in mathematischen Formeln - eine höhere Priorität.
Quote:
Originally Posted by dunkis
Warum hat y am Schluss den Wert 5? Wenn es im Ausdruck den Wert 0 zugewiesen bekommen hat?
|
Das liegt daran, dass sowohl "||", als auch "&&" in C/C++ sogenannte "Short-Circuit-Operatoren" sind. Das heißt, wenn aus dem linken Operanden schon das Ergebnis hervorgeht, wird der rechte Operand gar nicht erst evaluiert.
In unserem Beispiel ist der linke Operand "7" und der rechte Operand "y = 0". Schwammig formuliert heißt das, das Programm schaut sich zunächst nur den linken Operanden an, sieht dass er "true" ist und überspringt den rechten Operanden einfach. Wenn der linke Operand beim logischen OR "true" ist, ist nämlich der gesamte Ausdruck auch immer "true".
|
|
|
06/17/2012, 18:52
|
#4
|
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
|
Quote:
Originally Posted by Metin2Spieler97
Das liegt daran, dass sowohl "||", als auch "&&" in C/C++ sogenannte "Short-Circuit-Operatoren" sind. Das heißt, wenn aus dem linken Operanden schon das Ergebnis hervorgeht, wird der rechte Operand gar nicht erst evaluiert.
In unserem Beispiel ist der linke Operand "7" und der rechte Operand "y = 0". Schwammig formuliert heißt das, das Programm schaut sich zunächst nur den linken Operanden an, sieht dass er "true" ist und überspringt den rechten Operanden einfach. Wenn der linke Operand beim logischen OR "true" ist, ist nämlich der gesamte Ausdruck auch immer "true".
|
Genau, wenn du diese Verarbeitung trotzdem haben möchtest, musst du den einfachen ODER-Operator verwenden. Dies schaut dann so aus:
Hier erfolgt die Zuweisung, auch wenn der erste Wert bereits true ist.
|
|
|
06/18/2012, 13:41
|
#5
|
elite*gold: 80
Join Date: Oct 2007
Posts: 190
Received Thanks: 23
|
PHP Code:
bool erg = false; int y = 5; erg = 7 || (y = 0); cout << "Wert von (7 || (y = 0 )): " << erg << endl; cout << "Wert von y: " << y << endl;
Der Code ist nun definitiv richtig. Es handelte sich hierbei um einen kleinen Fehler beim Abschreiben.
Anstatt erg = 7 || (y=5); waren das: erg = 7 || (y=0);
Der Autor meint das anscheinend ernst aber manchmal kann ich seinen Gedanken nicht ganz folgen und haare dort einige Stunden an einer Lektion.
Ich habe das Problem nun ignoriert auch wenn es mich im Unterbewusstsein weiterhin nervt.
Edit:// Hab es nun verstanden - Bedanke mich an allen die mir das im Detail erklärt haben.
Off-Topic:
PHP Code:
int main() { cout << "Dieses Programm entaehlt \"for\"-Schleifen" << endl; int eingabe, zaehler = 1, grenze = 5; for(; cin >> eingabe && !(zaehler == grenze); ++zaehler); { cout << "Das war eine erfolgreiche Eingabe " << zaehler << endl;
} cout << "Hallo" << endl; return 0; }
Wenn ich keine eingabe mache z.B. einen anderen Datentyp eingebe.
Da es den Return-Wert int erwartet, gebe ich a ein.
Der Zaehler ist dann auf 1, dass liegt dann daran das die Zuweisung auf 1 ist.
Aber wenn ich sie auf "0" stelle erwartet er 6 Angaben.
Kann ich den Wert von Zaehler nicht auf "0" stellen so dass er 5 Angaben erwartet?
|
|
|
06/18/2012, 15:06
|
#6
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|
!(zaehler == grenze - 1) ? ^^
|
|
|
06/18/2012, 15:47
|
#7
|
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
|
Quote:
Originally Posted by 2n0w
!(zaehler == grenze - 1) ? ^^
|
this.
wenn du von 0 anfängst, zählt er 0,1,2,3,4,5. Somit wären es 6 Angaben. Ist der Anfang auf 1 wären es 5 Angaben, da er 1,2,3,4,5 zählt.
Also Entweder grenze einen Runter oder so wie es im Quote steht, was wohl eleganter ist, meiner Meinung nach. So kann man später an der Variable direkt noch nachvollziehen, was es macht.
|
|
|
06/18/2012, 16:12
|
#8
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Darf ich fragen welches Buch du nutzt und aus welchem Kapitel du das Beispiel entnommen hast?
erg = 7 || (y=0); ist nämlich absoluter Schwachsinn. :/
|
|
|
06/18/2012, 16:46
|
#9
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|
Also für mich sieht es so aus als sollte das Beispiel Short-Circuit-Operatoren demonstrieren, also könnte das ja schon Sinn haben, meiner Meinung nach.
Wäre halt nicht schlecht vom Autor gewesen das auch im Buch zu erklären.
|
|
|
06/18/2012, 19:44
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by Mikesch01
Genau, wenn du diese Verarbeitung trotzdem haben möchtest, musst du den einfachen ODER-Operator verwenden. Dies schaut dann so aus:
Hier erfolgt die Zuweisung, auch wenn der erste Wert bereits true ist.
|
Nein, das ist die binäre Oder-Verknüpfung
Quote:
Also für mich sieht es so aus als sollte das Beispiel Short-Circuit-Operatoren demonstrieren, also könnte das ja schon Sinn haben, meiner Meinung nach.
Wäre halt nicht schlecht vom Autor gewesen das auch im Buch zu erklären.
|
Dennoch sieht es ziemlich schlecht aus, denn so ein geniales Beispiel könnte Anfänger auch direkt mal in Sachen Zuweisung <-> Vergleich verwirren, da dort ja y 0 zugewiesen wird und man in booleschen Ausdrücken normalerweise vergleicht.
|
|
|
06/18/2012, 20:46
|
#11
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Quote:
Originally Posted by 2n0w
Also für mich sieht es so aus als sollte das Beispiel Short-Circuit-Operatoren demonstrieren, also könnte das ja schon Sinn haben, meiner Meinung nach.
Wäre halt nicht schlecht vom Autor gewesen das auch im Buch zu erklären.
|
Jup, ich wollte das oben noch erwähnen, aber dann bekam ich dieses "juckt ja eh keinen"-feeling und habe es einfach sein gelassen. Daher auch die Frage nach dem Kapitel.
Naja, mal schauen ob dunkis nochmal antwortet, das würde mich jetzt wirklich interessieren.
|
|
|
06/18/2012, 21:06
|
#12
|
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
|
Quote:
Originally Posted by MrSm!th
Nein, das ist die binäre Oder-Verknüpfung 
|
Die durchaus den gewünschten Effekt hat. ^^
|
|
|
06/18/2012, 21:38
|
#13
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by 2n0w
Die durchaus den gewünschten Effekt hat. ^^
|
Aber nicht, weil da Ausrücke ausgewertet werden und im Gegenteil zu || der zweite auch noch, wenn der erste schon true ist, sondern einfach weil nunmal die Werte binär verknüpft werden und da braucht er logischerweise beide Operanden.
|
|
|
06/18/2012, 21:54
|
#14
|
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
|
Quote:
Originally Posted by MrSm!th
Aber nicht, weil da Ausrücke ausgewertet werden und im Gegenteil zu || der zweite auch noch, wenn der erste schon true ist, sondern einfach weil nunmal die Werte binär verknüpft werden und da braucht er logischerweise beide Operanden.
|
Da muss ich mich entschuldigen. Ich habe nicht vermutet, das die Syntax von c++ in dieser Hinsicht zu Java so abweicht. In Java wäre meine Aussage vollkommen richtig. Sorry ;(
|
|
|
06/18/2012, 22:45
|
#15
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Kein Problem, im Grunde hat es, wie 2n0w schon sagte, trotzdem letztendlich dieselbe Wirkung. Habe da nicht sofort dran gedacht.
|
|
|
 |
|
Similar Threads
|
Unklarheit bei Hacks
09/05/2010 - WarRock - 8 Replies
Hi,
ich muss euch nochmal mit einer Frage belästigen.
Ich wollte mal Fragen ob man bei einem Hack mit dem "GM Mode" auch eine "Ghostcam" hat.
Wenn da also steht "Spectate" ob man dan spielen muss, oder eine "Ghostcam" hat also nicht spielen, sondern einfach nur zukuken kann.
|
[HILFE] Neue Waffen unklarheit..
06/28/2010 - Metin2 Private Server - 5 Replies
Hallo Community und Schönen guten Morgen ;)
Ich habe ein Problem und zwar mit den neuen Waffen.
Ich habe alle neuen in die Query eingefügt..
Hier ein ausschnitt:
INSERT INTO `item_proto` VALUES ('7460', 'Zyklonschwert+0', 'Zyklonschwert+0', '1', '3', '0', '2', '32', '1', '16', '', '500000', '0', '7461', '19', '0', '15', '1', '75', '0', '0', '7', '25', '0', '0', '0', '0', '0', '356', '394', '336', '384', '0', '-1', '-1', '-1', '-1', '-1', '-1', '0', '3', '0');
INSERT INTO...
|
za werte?
06/15/2010 - Metin2 - 7 Replies
kann mir wer die werte von za einmal auf m1 und auf g1 sageb? danke
|
85-95 Werte
01/23/2010 - Metin2 Private Server - 2 Replies
hi kann mir vieleicht einer ne liste erstellen mit den werten der 85 bis 95 waffen?
oder kennt einer nen link wo ich das finden kann?
|
WERTE???
08/21/2009 - S4 League - 1 Replies
werte sammeln für KIKI und co.!!!!:handsdown:
|
All times are GMT +1. The time now is 23:24.
|
|