Allgemeine Frage, betreffs "printf" und "cout"



  • Hi,

    wo liegt eigentlich der unterschied zwischen printf() und cout? Das würde mich mal interessieren!



  • bin mir nicht sicher, aber printf kommt aus dem C Standart, und cout aus dem C++ Standart.



  • Der Typ mit der Frage schrieb:

    wo liegt eigentlich der unterschied zwischen printf() und cout? Das würde mich mal interessieren!

    Die wesentlichen Unterschiede sind:
    a) printf ist eine sogenannte Ellipse (Variable Parameterübergabe) was als eine potentielle Fehlerquelle gilt (Thema Bufferüberlauf...).
    b) printf ist nicht typsicher, eine falsche Angabe kann zum Absturz zur Laufzeit führen, cout ist typsicher.
    c) printf gilt als schneller, was bislang von mir auch in Teilen bestätigt werden kann, dies ist aber nicht zwingend so, da cout durch typsicherheit prinzipiell das Potential hätte schneller zu sein (kenne aber bislang keine schnellere Implementiereung).

    Ich ziehe prinzipiell die Streamschreibweise vor, es sei den es würde sich herausstellen das dies der Flaschenhals in der Anwendung ist.

    cu André



  • - printf ist einfacher zu benutzen bei speziellen formatierungen.
    - cout macht falsche ausgaben, wenn variablen als 'volatile' deklariert sind.
    - bei cout muss man manchmal 'endl' o.ä. dranhängen, sonst wird nix ausgegeben.
    🙂
    aber im grunde genommen ist es egal, welches man benutzt.



  • pale dog schrieb:

    - cout macht falsche ausgaben, wenn variablen als 'volatile' deklariert sind.

    Hä? 😉

    - bei cout muss man manchmal 'endl' o.ä. dranhängen, sonst wird nix ausgegeben.

    stdout (printf) ist auch gepuffert, und analog zum impliziten std::flush in std::endl gibt es für die C-Streams auch ein fflush 😉



  • LordJaxom schrieb:

    pale dog schrieb:

    - cout macht falsche ausgaben, wenn variablen als 'volatile' deklariert sind.

    Hä? 😉

    char *a = "hello ";
        volatile char *b = "world";
        cout << a << b << endl;
    

    😉



  • Kannst du das auch in Worten erklären oder sollen wir diesen Code-Fetzen erst durch den Compiler jagen, um es zu verstehen?

    LordJaxom schrieb:

    - bei cout muss man manchmal 'endl' o.ä. dranhängen, sonst wird nix ausgegeben.

    stdout (printf) ist auch gepuffert, und analog zum impliziten std::flush in std::endl gibt es für die C-Streams auch ein fflush 😉

    Und solange du nicht explizit etwas anderes einstellst, wird cout automatisch geflusht, bevor etwas über cin eingelesen werden soll.



  • 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 ausgabe ist: 'hello 1'
    erklären kann ich's nicht. ist wohl ein bug.



  • 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).


Anmelden zum Antworten