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.
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:
Code:
bool erg = false;
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.
Code:
int y = 5;
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.
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
Code:
int y = 5;
= 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?
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".
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:
Code:
erg = 7 | (y = 0)
Hier erfolgt die Zuweisung, auch wenn der erste Wert bereits true ist.
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?
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.
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.
Genau, wenn du diese Verarbeitung trotzdem haben möchtest, musst du den einfachen ODER-Operator verwenden. Dies schaut dann so aus:
Code:
erg = 7 | (y = 0)
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.
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.
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.
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 ;(
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: