Allgemeine Frage, betreffs "printf" und "cout"



  • 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?



  • Der Typ mit der Frage schrieb:

    Also ist cout mal abgesehen von der Geschwindigkeit besser als printf?

    Nein. So einfach ist das nicht.

    Wenn du den Thread liest, sollte doch klar werden, dass viel vom Bewertungsmaßstab und von persönlichen Vorlieben abhängt. Was "besser" ist, kannst du nur für dich selbst definieren. Je nachdem, was dir wichtig ist, könnte auch boost::format "besser" sein.



  • Der Typ mit der Frage schrieb:

    Also ist cout mal abgesehen von der Geschwindigkeit besser als printf?

    Hat da eigentlich mal jemand auf unterschiedlichen Systemen Performance-Tests gemacht? Ich kann mir einfach nicht vorstellen, dass 'cout' langsamer als 'printf' sein sollte.



  • Konrad Rudolph schrieb:

    Hat da eigentlich mal jemand auf unterschiedlichen Systemen Performance-Tests gemacht? Ich kann mir einfach nicht vorstellen, dass 'cout' langsamer als 'printf' sein sollte.

    Ja, haben einige gemacht (einfach mal googlen). Ich habe bislang kein ergebnis gesehen wo cout schneller als printf war, aber je nach System/Compiler waren die mehr oder weniger dicht beieinander (zwischen fast gleich und Faktor 10).

    Falls man nach Gründen hierfür sucht sollte man bedenken das printf schon deutlich länger existiert, und demzufolge deutlich optimierter sein kann. Wenn die Streambehandlung auf den gleichen Stand wäre, hätte cout vermutlich die Nase vorn.

    Die Frage ist hierbei aber was ist einem wichtiger, und wie relevant ist in diesem Fall der zeitliche Unterschied.

    printf vs. cout
    1:0 Geschwindigkeit
    2:0 Lesbarkeit
    2:1 Erweiterbarkeit
    2:2 Sicherheit

    Vor allem das allerletzte Argument ist mir sehr wichtig, ich habe schon mehr als ein Programm dank printf (und vergleichbaren) Abrauchen gesehen weil ein Argument zu wenig oder falsch übergeben wurde. Ich ziehe manchmal sogar boost::format in Betracht obwohl es noch langsamer ist...

    cu André



  • //edit 2 ha, doch noch was zum schreiben gefunden, da kriegt der post doch noch nen Sinn.

    @asc ich finde aber die streamschreibweise für ausgabenw esentlich schöner und einfacher zu lesen als die komischen formatstrings mit nachfolgenden argumenten. kommt wohl echt drauf an, was man gewohnt ist.



  • asc schrieb:

    printf vs. cout
    1:0 Geschwindigkeit

    Das ist alles eine Frage der Umsetzung - beide haben das gleiche Potential zur Geschwindigkeit (und IOStream-Operatoren den potentiellen Vorteil, daß sie sich besser spezialisieren können).

    2:0 Lesbarkeit

    Bestimmt nicht - der Aufbau des Formatstrings ist wesentlich undurchsichtiger als die Formatierungsmöglichkeiten von cout

    2:1 Erweiterbarkeit
    2:2 Sicherheit

    Die beiden Punkte sind dagegen klar verdient (besonders letzterer) - obwohl das Anlegen eines guten IO-Operators auch nicht gerade trivial ist 😉



  • CStoll schrieb:

    ...Das ist alles eine Frage der Umsetzung...

    Von dem Potential habe ich ja auch schon geredet, nur derzeit mangelt es an der entsprechenden Umsetzung (unter VC++ scheint dies noch mehr zuzutreffen als unter vielen anderen Compilern). Und die Lesbarkeit ist relativ, wenn man nicht ständig irgendwelche Flags setzen muss sind beide etwa gleich, nur spätestens bei komplexen Formatierungen ist cout imho etwas im Nachteil.

    Mich brauchst du zum Glück auch nicht von Streams überzeugen, ich ziehe sie den c-Funktionen eh vor.

    cu André



  • asc schrieb:

    Und die Lesbarkeit ist relativ, wenn man nicht ständig irgendwelche Flags setzen muss sind beide etwa gleich, nur spätestens bei komplexen Formatierungen ist cout imho etwas im Nachteil.

    Also ich finde Angaben wie cout<<setw(5)<<setprecision(3)<<value; wesentlich lesbarer als printf("%5.3f",value); (auch wenn ersteres die Tendenz hat, sich in die Länge zu ziehen) - aber das ist wohl Geschmackssache. Vor allem muß man viele Formate beim Stream nur einmal setzen und sie gelten anschließend bis auf Widerruf für ALLE Ausgaben.


Anmelden zum Antworten