1Danke
ERLEDIGT
JA
JA
ANTWORTEN
7
7
ZUGRIFFE
304
304
EMPFEHLEN
-
Hallo zusammen,
eine Frage zum &-Operator beschäftigt mich:
Der Operator & ist ja die Bitweise And-Verknüpfung. Verknüpfe ich zwei Integer Variablen mit &, so werden die internen Bits der beiden Variablen jeweils And-verknüpft.
Wie sieht es mit boolschen Variablen aus? Werden boolsche Variablen korrekt mit & und | Operator verknüpft, so als würde man den Vergleichsoperator && und || verwenden?
Allgemein: Ist eine boolsche Variable in C++ als 1-Bit intern gespeichert oder durch mehrere Bit, da evtl. eine Mindestgröße an Bit für Variablen o.ä. besteht?
Schöne Grüße, Cyraid
-
Ich hab mit c/c++ nichts am Hut, aber mit dem g++ compiler bekomme ich folgende Ergebnisse, welche deine Annahme bestätigen zu scheinen.
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <stdio.h> int main() { printf("%i\n", true*5);//5 printf("%i\n", true+5);//6 printf("%i\n", true*false);//0 printf("%i\n", false*5);//0 printf("%i\n", false+5);//5 printf("%i\n", true & 11);//1 printf("%i\n", true & 10);//0 printf("%i\n", true | 6);//7 return 0; }
Man kann also mit booleschen Variablen rechnen, wie mit Integern. Ob es jetzt 1 Bit hat oder nicht, kann ich nicht sicher sagen, aber was sollte man mit den verbleibenden 7 Bit anfangen? Die Grundeinheit sind nunmal Byte und ich glaube nicht, dass man auf ein einzelnes Bit im Speicher zeigen kann (hat keine Eigene Adresse, nur Bytes).
Hm, also um die Bitoperation zu machen, wird es in eine Zahl konvertiert und ist damit kein bool mehr. Aber da alles, was ungleich 0 ist true ist, stimmt es doch wieder mit den Ergebnissen von && und || überein.Geändert von CPoly (14.06.10 um 18:38 Uhr)
-
14.06.10 22:21 #3
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Ein Byte ist laut Definition die kleinste adressierbare Einheit eines Computers. Jeder Datentyp belegt mindestens 1 Byte.
Ein Byte sind aber nicht unbedingt 8 Bit!
Es gibt eine implizite Konvertierung / Cast von bool zu int. Egal wie ein bool intern gespeichert wird, wenn man einen Integeroperator auf ihn anwendet, wird true zu 1 und false zu 0 gewandelt.
Um das nochmal klar zu stellen: es gibt keinen bool operator& (bool, bool). Es wird int operator& (int, int) aufgerufen.
Wie dein Compiler die boolschen Werte true und false intern speichert, kannst du z.B. so herausfinden:
GrußCode cpp:1 2 3 4 5
bool t = true; bool f = false; cout << hex << (int)*reinterpret_cast<char*>(&t) << endl; cout << hex << (int)*reinterpret_cast<char*>(&f) << endl;
Geändert von deepthroat (15.06.10 um 10:10 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
@deepthroat: Danke für die ausführliche Antwort.
Folgendes Beispiel:
Code :1
bool_var1 &= bool_var2;
Wenn ich dich richtig verstanden habe, werden hier zunächst bool_var1 und bool_var2 in integer Werte umgewandelt, dann mit dem (integer) Operator & verknüpft und danach findet wieder ein implizieter cast des Ergebnisses statt, um in bool_var1 das Ergebnis zu speichern.
Bei einem cast von integer in bool (für die Zuweisung an bool_var1) wird (so nehme ich an), alles != 0 in true und 0 in false gewandelt. Wo kann man nachlesen, was genau der implizite cast macht?
Unter http://www.cplusplus.com/ konnte ich dazu leider nichts finden. Auch nicht über den & Operator an sich.
Wahrscheinlich habe ich aber einfach nur falsch gesucht ?
Demnach würde das obige Beispiel äquivalent sein zur Schreibweise:
Code :1
bool_var1 = bool_var1 && boolvar_2;
ABER: Ist die 1.Variante auch ein guter Programmierstil oder sollte man hier die 2. Variante vorziehen, um mögliche falsche casts zu vermeiden ?
Schöne Grüße, Cyraid
-
15.06.10 18:02 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Ja.
Ja. C++ soll ja kompatibel sein zu C90 und C89.
Also der implizite Cast macht erstmal nichts anderes als ein expliziter Cast auch. Ganz genau kann man soetwas im C++ Standard ISO 14882 nachlesen. Es kursiert irgendwo auch ein kostenloser Entwurf.
Ich denke die 2. Variante ist vorzuziehen. Man sollte es vermeiden obskure und/oder mehrdeutige Sprachmerkmale zu benutzen wo nicht jeder auf den ersten Blick sieht was dort eigentlich gemacht wird bzw. wo man erst schauen muss ob das auf diese Weise überhaupt vom Sprachstandard abgedeckt wird.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
@deepthroat: Super, vielen Dank !
-
-
Leider gibt es in C++ jedoch nicht die verkürzte Zuweisung &&= für Vergleichsoperatoren wie &&. Daher kam ich überhaupt auf die Idee es mit &= zu versuchen. Aufgrund der vielen casts ist diese Variante für mich jedoch nun keine Alternative mehr. Der Code wird unnötig unlesbarer.
Schöne Grüße, Cyraid
Ähnliche Themen
-
Frage zum bitweisen Vergleich ('&'-Operator)
Von vfl_freak im Forum C/C++Antworten: 20Letzter Beitrag: 19.10.10, 14:55 -
Frage zu: Operator: [++][ --] Postfix und Präfix Schreibweise?
Von HORNSWOGGLE im Forum C/C++Antworten: 3Letzter Beitrag: 21.11.09, 15:36 -
VB 08 / Operator Mid
Von Xebino im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 14.10.09, 09:23 -
Frage zum new Operator
Von OnlyFoo im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 03.09.07, 23:20 -
[c++] << und >> Operator
Von FireFlow im Forum C/C++Antworten: 2Letzter Beitrag: 26.12.04, 11:44





Zitieren

Login






