Linus Torvalds: Java A Horrible Language



  • Ne, tu ich nich. Aber da mir das sowieso niemand glauben wird, könnt ihr den Thread zumachen.

    Cheers.



  • void printf(char const* format)
    {
        std::cout << format;
    }
    
    template <typename Head, typename... Tail>
    void printf(char const* format, Head const& head, Tail const&... tail)
    {
        while(*str && *str != '%')
            std::cout << *str++;
    
        if(!(*str))
            return;
    
        switch(*(++str))
        {
        case '%':
            std::cout << '%';
            printf(++str, head, tail...);
            break;
    
        case 'x':
            std::cout << std::hex << head << std::dec;
            printf(str, tail...);
            break;
    
        default:
            std::cout << head;
            printf(str, tail...);
        }
    }
    

    Das baut man so ein. Weitere Nachteile wenn sich jemand da lange genug rangesetzt und alles implementiert hat? Was ist dann noch schlechter?



  • Ethon schrieb:

    Was ist dann noch schlechter?

    Das es hier nicht um PIs Selbstdarstellungsdrang gehen sollte?



  • rüdiger schrieb:

    otze schrieb:

    Dann machen wir mal weiter, dass printf format strings kann, die die c++streams gar nicht abbilden können. Wie zum Beispiel "%5.2f"

    printf("%%%%\n", std::setw(5), std::fixed, std::setprecision(2), d);
    

    Das letztere sieht aus wie ein Aufsatz im Vgl zum ersteren...
    Warum sollte jemand eine ganze zeile mit :: und hurxmurx ausschreiben wollen wenn "%5.2f" auch passt..



  • 314159265358979 schrieb:

    Es ist besser als printf.

    ...

    314159265358979 schrieb:

    Bau es halt ein, das ist ja nur eine primitive, beispielhafte Implementierung. -.-

    🙄

    314159265358979 schrieb:

    printf("%%", std::setprecision(10), 3.14159265358979);
    

    🙄 🙄

    314159265358979 schrieb:

    Keine Ahnung wie die printf Formatstrings funktionieren, hab die noch nie gebraucht. Aber wie gesagt kann es nicht so schwer sein, die einzubauen.

    🙄 🙄 🙄



  • Ich erklär jetzt einfach nichts mehr. Offenbar hat Ethon ja verstanden, wie es gemeint war, was mich zu dem Schluss führt, dass ihr meine Aussagen absichtlich wortwörtlich so interpretiert, wie sie da stehen. (Sprich, mit Absicht nicht das lest, was zwischen den Zeilen steht.)

    Würde ich nun erklären, dann hätte das den Effekt, dass
    #1 - dasselbe bei meinen Erklärungen nochmal auftritt
    #2 - niemand mir glaub, wie ich es gemeint habe
    #3 - der Thread eskaliert und ich sinnloserweise gebannt werde, weil andere mich nicht mögen.

    Wobei ich eigentlich nach deinen letzten Posts gedacht habe, du würdest dir Mühe geben, genau das rauszulesen, was ich meine, hustbaer. Da hab ich mich wohl getäuscht.



  • 314159265358979 schrieb:

    Wobei ich eigentlich nach deinen letzten Posts gedacht habe, du würdest dir Mühe geben, genau das rauszulesen, was ich meine, hustbaer. Da hab ich mich wohl getäuscht.

    Ach das ist schon wieder deine typische Arroganz...

    Nein, ich gebe mir nicht Mühe irgendwas so verstehen zu können dass du eventuell keinen Mist geschrieben haben könntest.

    Schreib so dass man dich versteht.

    Und hör auf mit deinem ewigen "meins ist aber besser" Scheiss, die Leier kann keiner mehr hören.

    Wenn du meinst dass eine Template-basierte Lösung besser ist als klassisches printf, dann schreib das. Oder schreib Boost.Format ist besser, anstatt wieder irgendwelchen halbgaren Code zu posten, mit dem du uns unwürdigem Gewürm mal zeigen willst "wie mans macht". Aber nur als Beispiel.

    Sorry, muss grad kotzen gehen, melde mich dann später nochmal.

    EDIT: aus gegebenem Anlass: die "ICH HAB RECHT" Leier interessiert auch keinen mehr.



  • LOL ihr streitet euch um printf. Seit ihr 1978 stehen geblieben, es gibt mittlerweile wichtigere "Sprachfeatures".



  • tübisch schrieb:

    LOL ihr streitet euch um printf. Seit ihr 1978 stehen geblieben, es gibt mittlerweile wichtigere "Sprachfeatures".

    Ja, z.B. System.out.println();



  • printf ist tatsächlich eines der Dinge, die ich im C++ Standard vermisse. Ich bevorzuge zwar std::iostream aber für Formatierung ist das nicht gut geeignet. Da ist printf besser. Versucht mal eine Ausgabe wie:

    3.14
    4.67
    12.12
    334.34

    mit iostream-Mitteln hizubekommen. Klar kann man sich was bauen. Aber genau das ist das Problem: es ist nicht einfach nur da. Ich kann ja auch keinen Java-Anhänger von C++ überzeugen, indem ich ihm sage, er kann doch mit C++ Java bauen.



  • ich bins schrieb:

    printf ist tatsächlich eines der Dinge, die ich im C++ Standard vermisse.

    Ist es denn rausgeflogen?



  • Tim schrieb:

    Ist es denn rausgeflogen?

    Er meint vermutlich ein typsicheres Äquivalent zu printf.



  • ich bins schrieb:

    printf ist tatsächlich eines der Dinge, die ich im C++ Standard vermisse. Ich bevorzuge zwar std::iostream aber für Formatierung ist das nicht gut geeignet. Da ist printf besser. Versucht mal eine Ausgabe wie:

    3.14
    4.67
    12.12
    334.34

    mit iostream-Mitteln hizubekommen. Klar kann man sich was bauen. Aber genau das ist das Problem: es ist nicht einfach nur da. Ich kann ja auch keinen Java-Anhänger von C++ überzeugen, indem ich ihm sage, er kann doch mit C++ Java bauen.

    Genau, selbst Java hat printf. 🙂



  • Bei scanf verstehe ich es ja irgendwie noch, da hat man in bestimmten Situationen gewaltige Vorteile.
    Aber printf ist doch wirklich gut ersetzbar.



  • scanf: Also leichter kann man BufferOverflows nicht zustande bringen...



  • Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Doch, mit gets.



  • Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Mit einem kleinen bischen mitdenken passiert das aber nicht.



  • Ethon schrieb:

    Steffo schrieb:

    scanf: Also leichter kann man BufferOverflows nicht zustande bringen...

    Mit einem kleinen bischen mitdenken passiert das aber nicht.

    Das ist bei scanf sehr schwer.
    Prinzipiell tut man ja eher fgets machen und darauf dann sscanf. Da man sich sonst schwer tut buffer overflows zu verhinden...

    printf dagegen ist super.


  • Mod

    ich bins schrieb:

    Versucht mal eine Ausgabe wie:

    3.14
      4.67
     12.12
    334.34
    

    mit iostream-Mitteln hizubekommen. Klar kann man sich was bauen.

    Ich weiß nicht recht. Ist das so viel schlimmer, eine Zeile mit recht klar sprechenden Bezeichnern zusätzlich zu haben, anstatt einem Formatstring bei dem man die Bedeutung der einzelnen Felder auch erst einmal nachschlagen muss? Den C-testfall habe ich jedenfalls beim Programmieren spontan falsch gemacht, weil ich nicht sicher war, welche Bedeutung die erste Zahl genau hat und erst einmal nachschlagen musste. Ist daher wohl eher eine Sache davon, was man gewöhnt ist und was nicht:

    #include <iostream>
    #include <iomanip>
    #include <cstdio>
    
    using namespace std;
    
    int main()
    {
      double numbers[] = {1.2, 1.234, 12.34, 123.4, 123.456, 12.3, 1.};
    
      cout << "C++ Streams:\n";
      cout << fixed << right << setprecision(3);
      for (unsigned i = 0; i < sizeof(numbers)/sizeof(*numbers); ++i)
        cout << setw(7) << numbers[i] << '\n';
    
      puts("C I/O:");
      for (unsigned i = 0; i < sizeof(numbers)/sizeof(*numbers); ++i)
        printf("%7.3f\n", numbers[i]);   
    }
    


  • Ich finde printf schöner. (Und ich bin es bestimmt nicht mehr gewohnt. :p)


Anmelden zum Antworten