Allgemeine Frage, betreffs "printf" und "cout"
-
CStoll schrieb:
Kannst du das auch in Worten erklären oder sollen wir diesen Code-Fetzen erst durch den Compiler jagen, um es zu verstehen?
Die Erklärung hätte ich auch bitte (wenn vorhanden, sonst suche ich selbst), da mein Compiler (VC++8.0) den volatile char* zu bool "verkürzt" - was mir der Compiler auch explizit anmerkt.
-
LordJaxom schrieb:
da mein Compiler (VC++8.0) den volatile char* zu bool "verkürzt" ...
er macht sich's eben einfach

edit: und langsamer findet er's auch noch, oh mann...
warning C4800: 'volatile char *' : forcing value to bool 'true' or 'false' (performance warning)
-
Wenn dann so:
const char* volatile foo = "Hallo"; std::cout << foo << std::endl;Das Problem ist das std::ostream keine Spezialisierung für den Operator<< findet. Und die Standardkonvertierung eines Zeigers ist wohl in ein bool.
Also einfach ne eigene schreiben! ;-P Aber keine Garantie auf Sicherheit! *hust*
std::ostream& operator<<( std::ostream& out, const volatile char* str ) { return ( out << const_cast< const char* >( str ) ); }
-
David_pb schrieb:
Und die Standardkonvertierung eines Zeigers ist wohl in ein bool.
weil die ja so sehr miteinander verwandt sind

David_pb schrieb:
Also einfach ne eigene schreiben!
oder (on topic) gleich 'printf' nehmen

-
pale dog schrieb:
David_pb schrieb:
Und die Standardkonvertierung eines Zeigers ist wohl in ein bool.
weil die ja so sehr miteinander verwandt sind

Naklar!
0-Pointer wird false, sonst true.#include <iostream> void foo( bool x ) { std::cout << x; } int main() { const char* bar = "hallo"; foo( bar ); }
-
Das erklärt dann auch pale dogs hello 1 Ausgabe.
(Sichmalaufdieschulterklopf)
-
David_pb schrieb:
Naklar!
0-Pointer wird false, sonst true.#include <iostream> void foo( bool x ) { std::cout << x; } int main() { const char* bar = "hallo"; foo( bar ); }wahnsinn, man kann keine char* einem void* zuweisen, aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.

ich liebe C++, so ein kaputter mist!

-
wahnsinn, man kann keine char* einem void* zuweisen, aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.
Sonst würde ja ein einfacher Test auf einen Nullzeiger nicht funktionieren:
void f(char *p) { if(p) // <- Konvertierung in bool { } }
-
pale dog schrieb:
wahnsinn, man kann keine char* einem void* zuweisen,
Natürlich kann man. Was erzählst du da wieder?
aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.

Und wo siehst du da ein Problem, dass du diesen Smily benutzen musst?
ich liebe C++, so ein kaputter mist!

Ja ja, wir wissen, dass du ein kleiner Troll bist. Mich hat allerdings erschreckt, dass du noch so jung bist. Deine Verbohrtheit hat mich dich älter schätzen lassen

-
Th schrieb:
wahnsinn, man kann keine char* einem void* zuweisen, aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.
Sonst würde ja ein einfacher Test auf einen Nullzeiger nicht funktionieren:
void f(char *p) { if(p) // <- Konvertierung in bool { } }wieso wird da was konvertiert? das ist doch die kurzschreibweise für 'if (p != 0)'
das resultat des (stillschweigenden) vergleichs mit 0 ist 'bool', aber der pointer bleibt doch, was er ist.MFK schrieb:
pale dog schrieb:
wahnsinn, man kann keine char* einem void* zuweisen,
Natürlich kann man. Was erzählst du da wieder?
mit type cast, aber ohne nicht.
void *v; char *c = v; // geht nicht ohne cast bool b1 = v; // geht bool b2 = c; // geht auch
-
pale dog schrieb:
mit type cast, aber ohne nicht.
Lies nochmal, was du behauptet hast, und gleiche das mit deinem Code ab.
Dass man ein void* keinem typisierten Zeiger zuweisen kann, ist richtig. UDIAGS.

-
pale dog schrieb:
Th schrieb:
wahnsinn, man kann keine char* einem void* zuweisen, aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.
Sonst würde ja ein einfacher Test auf einen Nullzeiger nicht funktionieren:
void f(char *p) { if(p) // <- Konvertierung in bool { } }wieso wird da was konvertiert? das ist doch die kurzschreibweise für 'if (p != 0)'
das resultat des (stillschweigenden) vergleichs mit 0 ist 'bool', aber der pointer bleibt doch, was er ist.Und bei der Zuweisung an einen bool passiert genau das selbe wie bei dieser if()-Abfrage

MFK schrieb:
pale dog schrieb:
wahnsinn, man kann keine char* einem void* zuweisen,
Natürlich kann man. Was erzählst du da wieder?
mit type cast, aber ohne nicht.
void *v; char *c = v; // geht nicht ohne cast bool b1 = v; // geht bool b2 = c; // geht auch
Wenn du schon über die Sprache lästern willst, dann achte mal darauf, was du schreibst:
char* c; void* v=c;//geht bool b=c;//geht auch c=v;//geht nur mit cast c=b;//geht genausowenig
-
pale dog schrieb:
Th schrieb:
wahnsinn, man kann keine char* einem void* zuweisen, aber in einen 'bool' werden sie einfach so, ohne casts, umgewandelt.
Sonst würde ja ein einfacher Test auf einen Nullzeiger nicht funktionieren:
void f(char *p) { if(p) // <- Konvertierung in bool { } }wieso wird da was konvertiert? das ist doch die kurzschreibweise für 'if (p != 0)'
Ja, und rate mal, wie die technisch realisiert wird? Durch eine implizite Konvertierung nach 'bool'. Das Konzept ist gut. Andere Sprachen haben andere, teilweise sehr viel aufwendigere Konzepte, um Ausdrücke auf Gültigkeit prüfen zu lassen aber diese Konzepte sind nicht zwangsläufig besser (Seitenblick in Richtung .NET mit dem verkorksten 'IsTrue'-Operator).
-
bedeutet das, dass in C++ ein
bool b = irgendwas;eigentlich immer ein
bool b = (irgendwas != 0);ist?
(wobei 'irgendwas' nicht 0 oder false sein darf)
wenn ja, dann findet doch keine typumwandlung statt.
das würde mich wieder besänftigen, auch wenn 'cout' darunter zu leiden hat
-
pale dog schrieb:
bedeutet das, dass in C++ ein
bool b = irgendwas;eigentlich immer ein
bool b = (irgendwas != 0);ist?
(wobei 'irgendwas' nicht 0 oder false sein darf)
wenn ja, dann findet doch keine typumwandlung statt.Wenn Du meinst … wie dem auch sei, das Resultat ist dasselbe; nämlich die Umwandlung eines Werts in ein Boolean.
-
back to Topic.
Ich finde cout wesentlich übersichtlicher und sauberer, als printf, weil es alles in eine Klassenhirachie gepackt hat. Man hat auch die Möglichket durch die übergabe von Manipulatoren, die Ausgabe zu formatieren. Un man kann für seine klassen den << Operator der klasse ostream überschreiben, was später zu einem übersichtlicherem code führt, als würde man sich eine toC_String Methode schreiben, und die dann bei jedem printf aufruf manuell aufrufen. Ja und printf ist C, kann also nicht mit Strings umgehen. Ich finde, wer C++ programmiert, und nicht C, der ist mit cout besser bedient. Ich finde es gibt kaum gründe, weshalb man printf verteidigen sollte, ausser vieleicht die geschwindigkeit, aber die ist ja bei der geringen menge, die auf die Konsole passt ja doch eher unwichtig, man sollte besser schauen, an welchen anderen stellen man sein programm dann optimieren kann.
-
ich finde cout wesentlich lahmerer als printf
-
Der eigentliche Witz ist, dass cout schneller sein sollte als printf, weil printf jedesmal den Formatstring interpretiert, während bei IOStreams alles statisch ist.
-
btt schrieb:
ich finde cout wesentlich lahmerer als printf
Wenn man wegen diesen paar millisekunden auf die Typsicherheit und flexibilität verzichten will....
-
Also ist cout mal abgesehen von der Geschwindigkeit besser als printf?