Frage zum &-Operator

  • Themenstarter Themenstarter C152778
  • Beginndatum Beginndatum
C

C152778

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.

C++:
#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).

Werden boolsche Variablen korrekt mit & und | Operator verknüpft, so als würde man den Vergleichsoperator && und || verwenden?

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.
 
Zuletzt bearbeitet:
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:
C++:
bool t = true;
bool f = false;

cout << hex << (int)*reinterpret_cast<char*>(&t) << endl;
cout << hex << (int)*reinterpret_cast<char*>(&f) << endl;
Gruß
 
Zuletzt bearbeitet:
@deepthroat: Danke für die ausführliche Antwort.

Folgendes Beispiel:
Code:
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:
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
 
Folgendes Beispiel:
Code:
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.
Ja.
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.
Ja. C++ soll ja kompatibel sein zu C90 und C89.
Wo kann man nachlesen, was genau der implizite cast macht?
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.
Demnach würde das obige Beispiel äquivalent sein zur Schreibweise:
Code:
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 ?
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ß
 
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.

Wir haben damals auch gelernt dass man nicht mehr als einen Effekt pro Zeile haben soll. In Anbetracht der Situation dass da diverse Casts noch stattfinden wäre das sicher auch gegen diesen Merksatz, wenn man den &-Operator auf bool-Werte anwendet.
 
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
 
Zurück