Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » default-value für bool

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.01.2012, 13:48 Uhr
banshee



Hallo,

ich sehe es doch richtig, dass ein nicht initialisierter bool sowohl true als auch false sein kann, wobei die Wahrscheinlichkeit für letzteres extrem klein ist, da dies nur dann eintrifft, wenn die Variable zufällig exakt 0 ist (da jeder Wert >0 als true interpretiert wird). Und da ein bool mindestens 1 Byte belegt, ist die WS <= 1/2^8, je nach tatsächlicher Größe des Datentyps.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.01.2012, 14:16 Uhr
0xdeadbeef
Gott
(Operator)


Ein nicht initialisierter bool kann sowohl true als auch false sein, oder ein anderer unspezifizierter Wert, d.h.

C++:
bool b;

if(b == true) {
} else if(b == false) {
} else {
  // das hier kann passieren.
}


Wie wahrscheinlich welche Option ist, ist vom Standard nicht vorgegeben und sowohl compiler- als auch programmabhängig. Wenn beispielsweise der bool an eine Stelle auf dem Stack gelegt wird, an die vorher eine andere Funktion eine Null gelegt hat, wird der bool reproduzierbar falsch sein, und es ist Compilern auch erlaubt, generell mit Null zu initialisieren - wobei das inzwischen aus der Mode gekommen ist. Das Verhalten kann hier aber auch von Compileroptionen abhängen.

Sich in diesem Zusammenhang auf irgendetwas verlassen zu wollen, wäre höchst töricht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.01.2012, 16:12 Uhr
banshee




Zitat von 0xdeadbeef:
Sich in diesem Zusammenhang auf irgendetwas verlassen zu wollen, wäre höchst töricht.


Hatte ich auch nicht vor, falls das so geklungen hat
Ich hab mich nur gefragt, warum uninitialisierte bools, die ich in einem Fremdprojekt bestaunen durfte, ständig true waren. Nur wie ein bool weder true noch false sein kann, verwirrt mich etwas. Null ist doch auch als 0 definiert, wenn ich mich nicht irre, müsste also auch wieder false sein?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.01.2012, 17:38 Uhr
~Caligulaminus
Gast


Null ist false, alles andere true. Dazwischen gibt es nichts.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.01.2012, 19:46 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hab obigen Codefetzen mal in ein Programm eingebaut, und das Ergebnis war sehr aufschlussreich:

Code:
E:\Watcom>wcl386 -d2 booltest.cpp
Open Watcom C/C++32 Compile and Link Utility Version 1.9
...
creating a Windows NT character-mode executable

E:\Watcom>booltest
b ist undefiniert weil true und false.
8

E:\Watcom>



Hier das Programm:

C++:
#include <iostream>

using namespace std;

int main()
{
  bool b;

  if(b == true)
    { cout << "b=true" << endl;}
  else if(b == false)
    { cout << "b=false" << endl; }
  else
    {
      // das hier kann passieren.
      cout << "b ist undefiniert weil true und false." << endl;
    }
  cout << b << endl;
  return 0;
} // main()



--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 26.01.2012 um 19:48 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
26.01.2012, 20:02 Uhr
Caligulaminus



ISO/IEC 14882 4.12:


Zitat:
A zero value, null pointer value, or null member pointer value is converted to false;
any other value is converted to true.


Wenn dein Compiler das wirklich so macht, dann ist er nicht Standardkonform.
--
Die Zither ist entzwei! an der ist nichts zu halten.

Dieser Post wurde am 26.01.2012 um 20:04 Uhr von Caligulaminus editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.01.2012, 21:39 Uhr
ao

(Operator)


Abschnitt 4.12 behandelt die Umwandlung anderer Datentypen in bool. Ich bin kein Experte für Standards, aber ich glaube, das ist etwas anderes als die Deklaration einer nicht initialisierten Variablen.

Es ist übrigens genauso möglich, dass eine Float-Variable zufällig auf INF oder NaN steht. Ich denke, das ist derselbe Effekt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
26.01.2012, 22:24 Uhr
Caligulaminus



Gerade gefunden:

Working Draft, Standard for Programming
Language C++ 3.9.1.6 Fußnote(!) 47:

Zitat:
Using a bool value in ways described by this International Standard as “undefined,” such as by examining the value of an
uninitialized automatic object, might cause it to behave as if it is neither true nor false.


Nie hätte ich das gedacht! Nie!
Ich bin echt platt.

Ist das nur gut, um "Nicht-Juristen" wie mich in die Irre zu führen oder gibt es einen realen Nutzen das so zu tun, anstatt zu sagen: bool hat nur zwei Zustände, und welcher initial drinsteht weiß man halt vorher nicht? So wie bei int z.B..

@0xdeadbeef, Hans:
In dem Zusammenhang würde mich interessieren, ob Ihr im debug-Modus unterwegs wart, und wenn ja, was die release-Version sagt.

Und noch eine Edith: @ao Danke für den Fingerzeig.
--
Die Zither ist entzwei! an der ist nichts zu halten.

Dieser Post wurde am 26.01.2012 um 22:40 Uhr von Caligulaminus editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
26.01.2012, 23:25 Uhr
ao

(Operator)


Prozessoren speichern einen bool in der Regel nicht in einem Bit, sondern in einer größeren Einheit. Wie groß, ob ein Byte oder ein natives Wort (heutzutage meist 32 Bit), das ist dem Compiler überlassen, der C++-Standard hält sich da raus. Der Grund dafür ist, dass man lieber Speicher verschwendet als Geschwindigkeit verliert.

So, wenn der Programmierer eine lokale bool-Variable deklariert, reserviert der Compiler hierfür ein Stück Speicher, in dem zuvor irgendwas anderes gestanden hat, z.B. der Zahlenwert 42. Das Bitmuster dafür ist 0b00101010, was weder mit dem Muster für true (0b00000001) noch mit dem für false (0b00000000) übereinstimmt. Würde man verlangen, dass eine bool-Variable zu jeder Zeit nur true oder false sein darf, dann würde das heißen, dass der Compiler bool-Variablen initialisieren muss, um sicher zu gehen. Das würde dem Prinzip widersprechen, dass lokale Objekte nicht vom Compiler initialisiert werden.

Gründe hierfür: 1. Performance. Jede unnötige Initialisierung (unnötig deshalb, weil sie irgendwann später durch eine Zuweisung vom Programmierer überschrieben wird) kostet a) Laufzeit und vergrößert b) den Code um die Anweisungen zur Speicherung des Initial-Wertes.

2. Der Optimizer hat unter anderem die Aufgabe, Variablen, die nicht gleichzeitig, sondern nacheinander gebraucht werden, zusammenzulegen und damit Speicher zu sparen. Möglicherweise wird das durch Initialisierungszwang schwerer.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
26.01.2012, 23:41 Uhr
Caligulaminus



Das beantwortet meine Frage leider nicht.
Es gibt ja z.B. die (elegant einfache) Regel 0==false alles andere==true. Undefiniert hieße dann eben, man kann nicht wissen, was vor Initialisierung drinsteht, aber sicher wissen, daß es eben entweder true oder false ist, wenn man es ließt(voll Schrödinger ey!).

Da das offensichtlich aber nicht der Fall ist, wird es wohl (das hoffe ich inständig) einen guten Grund geben.

Ich denke, ich gehe wohl von zu speziellen Voraussetzungen aus. Die standardisierungs Komitteeisten(Kommitessen?) wollen sich bei ihrer Arbeit ja so weit von der Hardware fernhalten wie möglich.

Wenn aber jemand was genaueres weiß bzw. eine gute Idee hat...

Ich habe heute wieder etwas interessantes gelernt.


Edith sagt: Das führt mich eigentlich zu der Frage, warum der Compiler/Standard den Lesezugriff auf uninitialisierte Variablen nicht einfach pauschal verbietet. Dann erübrigte sich eine ganze Klasse von Problemen.
Aber wahrscheinlich reitet mich auch hier nur wieder mein jugendlicher Leichtsinn.
--
Die Zither ist entzwei! an der ist nichts zu halten.

Dieser Post wurde am 27.01.2012 um 00:13 Uhr von Caligulaminus editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: