Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 23:24

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Boolesche Werte - Unklarheit

Discussion on Boolesche Werte - Unklarheit within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #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 || (5);
cout << "Wert von (7 || (y = 0 )): " << erg << endl;
cout << "Wert von 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.
aeo is offline  
Old 06/16/2012, 01:27   #2
 
Dr. Coxxy's Avatar
 
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:

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.

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
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?
Dr. Coxxy is offline  
Old 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 View Post
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 View Post
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 View Post
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 View Post
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".
ms​ is offline  
Old 06/17/2012, 18:52   #4
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Quote:
Originally Posted by Metin2Spieler97 View Post
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.
Mikesch01 is offline  
Old 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 || (0); 
cout << "Wert von (7 || (y = 0 )): " << erg << endl
cout << "Wert von 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 eingabezaehler 1grenze 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?
aeo is offline  
Old 06/18/2012, 15:06   #6
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
!(zaehler == grenze - 1) ? ^^
2n0w is offline  
Old 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 View Post
!(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.
phreeak is offline  
Thanks
1 User
Old 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. :/
Nightblizard is offline  
Old 06/18/2012, 16:46   #9
 
2n0w's Avatar
 
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.
2n0w is offline  
Old 06/18/2012, 19:44   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by Mikesch01 View Post
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.
MrSm!th is offline  
Old 06/18/2012, 20:46   #11
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by 2n0w View Post
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.
Nightblizard is offline  
Old 06/18/2012, 21:06   #12
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Quote:
Originally Posted by MrSm!th View Post
Nein, das ist die binäre Oder-Verknüpfung
Die durchaus den gewünschten Effekt hat. ^^
2n0w is offline  
Old 06/18/2012, 21:38   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by 2n0w View Post
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.
MrSm!th is offline  
Old 06/18/2012, 21:54   #14
 
Mikesch01's Avatar
 
elite*gold: 203
Join Date: Sep 2007
Posts: 732
Received Thanks: 190
Quote:
Originally Posted by MrSm!th View Post
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 ;(
Mikesch01 is offline  
Old 06/18/2012, 22:45   #15


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.