Hallo,
gibt es einen Standard, der definiert, wie sich eine boolesche Variable
verhält, wenn sie "überladen" ist?
Ist sie wirklich immer true, wenn sie nicht exakt "0" enthält, oder gibt
es auch Compiler/Sprachen die wirklich nur auf das niederwertigste Bit
gucken und ein False zurückgeben, wenn dort =2 bzw. ein gerader Wert
drin steht?
Stefan U. schrieb:> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich> 0 sind> true" nicht gilt.
C++, Java? Da kannst du gar nichts anderes als true/false in eine bool
Variable schreiben. Wenn du eine Zahl zuweist, wird die nach true bzw.
false umgewandelt. Wenn man bool wieder in einen Integer umwandelt,
kommt immer 1/0 heraus. Wie aber true/false jetzt tatsächlich im
Speicher dargestellt werden, ist plattformspezifisch. Die meisten werden
aber 1/0 verwenden, und andere Zahlen werden niemals in bool-Variablen
abgelegt.
> gibt es einen Standard, der definiert, wie sich eine boolesche Variable> verhält, wenn sie "überladen" ist?
Jede Programmiersprache definiert sich boolsche Variablen und damit auch
deren Verhalten selbst. Mit "überladen" hat das nichts zu tun.
Es gibt Sprachen, in denen ein Boolean genau true oder false ist, z.B.
C++ oder Java. Da gibt es keine Diskussion.
Es gibt Sprachen, in denen ein Boolean effektiv ein Integer ist, z.B.
klassisches C. Da gilt üblicherweise "0 = false; alles andere = true".
Dazu kommen lokale Konventionen (z.B. "TRUE als 1 definiert"), die das
weiter einschränken können.
Es gibt Sprachen, in denen es keinen Boolean gibt, z.B. die
Scriptsprache deiner Wahl. Da wird pro Operator oder pro Operation
definiert, was jetzt ein "true" und was ein "false" ist, wenn das
sinnvoll ist. Ein leerer String kann z.B. je nach Zusammenhang mal
"true" (existiert) oder "false" (ist leer) sein.
Stefan U. schrieb:> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind> true" nicht gilt.
Ich schon:
PL/M -> manche Compiler (PLM51) nehmen alle ungeraden Zahlen als "TRUE"
BASIC -> manche Interpreter verwenden "-1" als TRUE
Gruß Anja
Stefan U. schrieb:> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind> true" nicht gilt.
Einfach jede Programmiersprache, die eine weniger implizite
Typbehandlung als C hat.
VHDL hat z.B. eine extrem strenge Typisierung. Da ist 0 und false und
'0' und "0" jeweils etwas komplett anderes und muss erst mal umgewandelt
werden.
Achim S. schrieb:> ich hoffe Du meinst nicht sowas wie> if(myBool == true)> Das schlägt für ALLE bis auf einen Wert fehl.
In C ist das so, wenn myBool nicht vom Typ _Bool ist.
Und ja, eine Codebase, mit der ich zu tun habe, beginnt mit "#define
FALSE (0)" und "#define TRUE (1)" - verwendet das aber auch durchgehend.
Anja schrieb:> BASIC -> manche Interpreter verwenden "-1" als TRUE
Das sind diejenigen Sprachen, die keinen Bool-Typ kennen und bei denen
die AND, OR, NOT usw. bitweise auf Integerzahlen in Zweierkomplement-
darstellung arbeiten. Wahrer als -1 (alle Bits sind 1) geht es nicht.
Neben vielen Basic-Dialekten gehört auch der Pascal-Dialekt von MikroE
dazu.
Die meisten anderen Pascals und viele weitere Sprachen konvertieren gar
nicht implizit zwischen Bool nach Integer, weil das dort zwei völlig
unterschiedliche und nicht kompatible Datentypen sind.
Konvertiert man in Pascal mit der Ord-Funktion ein Bool (dort Boolean
genannt) nach Integer, erhält man 0 oder 1. In einigen Pascal-Dialekten
kann mit der Boolean-Funktion auch von Integer nach Bool konvertiert
werden, wobei dann jede von 0 verschiedene Zahl als True gewertet wird.
Haskell verhält sich diesbezüglich ähnlich wie Pascal, allerdings sind
bei der Konvertierung von Integer nach Bool mit der Funktion toEnum nur
die Zahlenwerte 0 und 1 erlaubt. Will man eine beliebige von 0
verschiedene Zahl x nach True konvertieren, benutzt man einfach die
Relation x /= 0, was dann für alle numerischen Datentypen, (nicht nur
Integer) funktioniert.
In Python lassen sich alle Datentypen implizit und explizit nach bool
konvertieren. Zahlen mit dem Wert 0, leere Container sowie None ergeben
dabei False, alles andere True, sofern für den jeweilige Datentyp keine
davon abweichende Konvertierung durch den Benutzer definiert wurde.
@Boole:
Wie du an diesen und den vorangegangenen Beispielen erkennen kannst,
variieren die einzelnen Programmiersprachen bei der Realisierung von
Booleschen Datentypen und der Behandlung von Booleschen Ausdrücken sehr
stark.
S. R. schrieb:> "#define TRUE (1)" - verwendet das aber auch durchgehend.
In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen
damit es Implementierungsunabhängig immer funktioniert.
Gruß Anja
...danke für die vielen Antworten, aber anhand Der Reaktionen sehe ich,
dass die Frage garnicht so 100% klar zu beantworten war und es sich
lohnt darüber ein paar Gedanken zu verlieren.
...aber:
Sprachen, die nur ein True oder False für eine boolesche Variable
zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit,
oder nicht?
Anja schrieb:> S. R. schrieb:>> "#define TRUE (1)" - verwendet das aber auch durchgehend.>> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen> damit es Implementierungsunabhängig immer funktioniert.
Das sieht man recht häufig, ist aber Unsinn. Ich weiß nicht, warum es
sich so hartnäckig hält.
Auf jeder Implementierung ist das Ergebnis von (!0) nichts anderes als
1. Es macht also genau gar keinen Unterschied.
Boole schrieb:> Sprachen, die nur ein True oder False für eine boolesche Variable> zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit,> oder nicht?
Ja, typischerweise schon. Was dann allerdings passiert, wenn man da
"hinterrücks" was eigentlich ungültiges reinschreibt, dürfte kaum in
einer Sprache wirklich offiziell definiert sein.
Na schrieb:> Warum sollte ein boolean 8 Bit brauchen?
Weil es kaum Plattformen gibt, auf denen sich was kleineres einzeln
adressieren lässt.
Anja schrieb:> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen> damit es Implementierungsunabhängig immer funktioniert.
Warum sollte das so sein? Der exakte Wert ist doch ziemlich egal,
solange TRUE und FALSE verschieden sind.
Boole schrieb:> Sprachen, die nur ein True oder False für eine boolesche Variable> zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit,> oder nicht?
Das hängt davon ab, was die Architektur anbietet.
Der AVR kennt z.B. das T-Flag, welches mit bestimmten Befehlen gesetzt
und gelöscht werden kann. Ein guter Compiler könnte dieses Flag als 1
Bit-Register für boolsche Variablen betrachten.
Der SDCC zielt auf Architekturen mit extrem wenigen Allzweckregistern ab
(Akku-Architekturen) und nutzt tatsächlich für manche Targets die Flags
als Register. Seit C99 kennt C schließlich einen echten boolschen
Datentyp (_Bool).
Und dann gibt es noch Architekturen mit bitadressierbarem Speicher.
Rolf H. schrieb:> Rolf M. schrieb:>> Weil es kaum Plattformen gibt, auf denen sich was kleineres einzeln>> adressieren lässt.>> Lässt sich auf manchen CPUs schon (BTST) adressieren, dauert aber> entweder länger oder ist zumindest nicht schneller. Gibt es in C> übrigens auch, mit den Bitfeldern:> http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_013.htm
Elemente von Bitfeldern lassen sich nicht einzeln adressieren - sprich:
Man kann keine Zeiger darauf definieren.
Und in C gibt es keine Datentypen, die kleiner sind als char. Einzelne
Elemente eines Bitfeldes können kleiner sein, aber das ganze Bitfeld hat
dann wieder eine Größe, die ein Vielfaches der Größe von char ist. Man
kann also nicht z.B. eine einzelne Variable definieren, die 1 Bit breit
ist. Man könnte nur eine Variable definieren, die ein Byte breit ist und
dann nur ein Bit davon nutzen, und das ist dann genau das, was bei bool
oft gemacht wird.
Rolf M. schrieb:>> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen>> damit es Implementierungsunabhängig immer funktioniert.>> Das sieht man recht häufig, ist aber Unsinn. Ich weiß nicht, warum es> sich so hartnäckig hält.> Auf jeder Implementierung ist das Ergebnis von (!0) nichts anderes als> 1. Es macht also genau gar keinen Unterschied.
Nur zur Untermauerung der c-faq-Eintrag
:http://c-faq.com/bool/bool2.html