Ist es sinnvoll heute noch C++ anzufangen?



  • Konkatenation von Strings ist assoziativ, aber nicht kommutativ.



  • +fricky schrieb:

    das mach' ich nur, weil in threads wie diesem sofort völlig unsachlich auf anderen sprachen rumgehackt wird.

    Du bist ein C-Fanboy und verträgst keinerlei Kritik an der Sprache und reagierst jedesmal total unsachlich darauf. So ziemlich jede Sprache hat Macken, daß Dir die schlimmsten C++ Macken (es gibt einige ganz häßliche Dinge) gar nicht bekannt sind, ist ein deutliches Zeichnen dafür, daß Du Dich nie richtig mit der Sprache auseinander gesetzt hast. Andernfalls würdest Du sie kennen.

    +fricky schrieb:

    bereits die erste(!) antwort ist das beste beispiel (~john: schlechter code des linux kernel, weil in C geschrieben).

    Das ist objektiv wahr, der Linux Kernel enthält schlechten Code. Auch in C hätte man es besser machen können, nur ist das so, daß C für viele Konstrukte nur Konvetionen bereithält und das bei vielen Entwicklern, die über die ganze Welt verteilt sind, zu Problemen führen kann und im konkreten Fall zu Problemen geführt hat und auch weiterhin wird. Eine andere Sprache wäre sinnvoller gewesen, da sie es nicht so einfach macht an Interfaces vorbei zu programmieren.

    Wenn man sich damit auseinandersetzt welche Alternativen es gibt, dann ist die Auswahl effektiv relativ gering. Unter der Maßgabe der freien Toolchain und der direkten Compilierbarkeit bleiben nicht viele Sprache als Alternative übrig.
    gcc unterstützt direkt: Ada, C, C++, Fortran, Objective-C (und Java)
    Objective-C unterstützt LowLevel Aufgaben kein Deut besser als C.
    Fortran, muß man noch was dazu schreiben
    C++ überfordert viele Personen
    Ada wäre mein Favorit für einen Kernel
    Java, das wird spaßig ohne GC und so
    D ist einfach zu neu



  • +fricky schrieb:

    C tut das, was ich von ihm will. cout<< mit 'nem volatile int* tut etwas, das ich nicht will
    🙂

    Aber du willst das, was C dir zu fressen vorgibt. Tu doch nicht so, als ließen sich deine subjektiven Ansichten irgendwie objektiv begründen.



  • ~john schrieb:

    Strings mit Stringkonkatenation ist eine Halbgruppe, so daß das Gruppenverknüpfungssysmbol "+" durchaus berechtigt ist.

    Komische Begründung. Wenn es eine abelsche Gruppe wäre, wäre + gerechtfertigt.



  • +fricky schrieb:

    klar, C im highlevel-bereich ist schon länger tot. C++ wird in absehbarer zeit, was den highlevel-bereich angeht, wohl ebenfalls beigesetzt werden.

    Das wird aber noch Jahre dauern (bestehende Software), zudem gibt es noch immer Firmen die aktiv auf C++ setzen und neue Projekte darin aufsetzen (Überwiegend habe ich so etwas im QT-Bereich bemerkt, des weiteren bezweifel ich das im Spielesektor C++ allzu schnell verschwindet).

    +fricky schrieb:

    im gegensatz zu C++ hat C aber den lowlevel-sektor fest in seiner hand.

    Wobei es im Automotive und Embedded-Systems bereich durchaus Firmen gibt die C++ verwenden. Daher: Rückgang ja, aber warten wir erstmal etwas ab, die nächsten 10 Jahre wird man sicherlich noch von Zeit zu Zeit Stellenausschreibungen für C++ Entwickler finden. Totgeglaubte leben länger (Sah man ja auch an der WinAPI die erst heute etwas Konkurrenz bekommt [WPF setzt nicht mehr auf die WinAPI, sondern auf DirectX]).

    +fricky schrieb:

    eben wegen seiner starken präsenz im embedded-bereich, taucht C in solchen statistiken auf den oberen plätzen auf.

    Wenn ich meinen Blick auf eine Nische begrenze kann ich jede Statistik in eine gewünschte Richtung bringen. Davon abgesehen: Was ist gegen einen starken 2ten Platz einzuwenden?



  • u_ser-l schrieb:

    Invarianz gegen Vertauschung wäre Kommutativität.
    Assoziativität heißt invariant gegen Klammerung:

    a o (b o c) = (a o b) o c
    

    danke, hab's verwechselt.

    ~john schrieb:

    ...daß Dir die schlimmsten C++ Macken (es gibt einige ganz häßliche Dinge) gar nicht bekannt sind, ist ein deutliches Zeichnen dafür, daß Du Dich nie richtig mit der Sprache auseinander gesetzt hast. Andernfalls würdest Du sie kennen.

    dann sollte ich wohl froh sein, mich nie intensiv mit C++ auseinandergesetzt zu haben. jedenfalls hat mich anfangs schon einiges genervt, so dass ich schnell umgestiegen bin.
    🙂



  • +fricky schrieb:

    und was geht noch? destruktoren haben keinen rückgabewert, exceptions in destruktoren gelten als fehlerquelle. auf gewisse fehler kann man also garnicht angemessen reagieren.

    Ach Herrje,
    es gibt so etwas wie Softwaredesign bei dem man sich im großen Maßstab überlegen muß, wie man mit Fehlern im Programm umgeht. Dabei muß man sich mit dem Problem befassen. Rückgabewerte für Destruktoren fordern deutet darauf hin, daß jemand in seiner Denkweise verhaftet ist und sich Alternativen noch nicht einmal vorstellen kann. Die Fehler von errno müssen nach jeder Funktion ja auch gesichert werden, weil sie sonst überschrieben werden.

    +fricky schrieb:

    ~john schrieb:

    Strings mit Stringkonkatenation ist eine Halbgruppe, so daß das Gruppenverknüpfungssysmbol "+" durchaus berechtigt ist.

    nö, stringverkettung ist nicht assoziativ.

    Noch mehr Unwissen
    (H;) ist Halbgruppe <=> für alle a,b,c aus H gilt: a(b*c)=(a*b)*c

    Für die Kontaktenation gibt es auch noch ein Einselement "". Das Nullelement existiert nicht, und die Halbgruppe ist natürlich nicht abelsch. Daher liegt es nahe nicht den üblichen Namen "Produkt" für die Verknüpfung zu verwenden, sondern das "+", da es kein Nullelement gibt wie man es bei einem "*" erwarten dürfte.



  • Bashar schrieb:

    +fricky schrieb:

    C tut das, was ich von ihm will. cout<< mit 'nem volatile int* tut etwas, das ich nicht will

    Aber du willst das, was C dir zu fressen vorgibt. Tu doch nicht so, als ließen sich deine subjektiven Ansichten irgendwie objektiv begründen.

    sagen wir's mal so: ich hab' mich an die kleinen macken von C so sehr gewöhnt, dass sie mir garnicht mehr auffallen. von daher ist meine C-sichtweise sicherlich subjektiv. wohl kaum jemand, der selbst programmiert, wird eine subjektive sicht auf seine programmiersprache haben (entweder er findet sie besser oder schlechter, als sie wirklich ist). kann sein, dass C an einigen stellen verbesserungswürdig ist, echte defekte sind mir aber nicht bekannt. oder kennst du (oder jemand anders hier) irgendeine echte abscheulichkeit in C, mit der man sich nicht arrangieren kann?
    🙂



  • Bashar schrieb:

    Komische Begründung. Wenn es eine abelsche Gruppe wäre, wäre + gerechtfertigt.

    Die Matrizenmuliplikation ist auch nicht kommunikativ und es wird Produkt genannt und man schreibt meist A*B. In einer Halbgruppe oder Gruppe muß das Kommutativgesetz nicht erfüllt sein, sonst wäre es eine abelsche (Halb-)Gruppe. Ein Nullelement (das Einselement existiert: "") gibt es bei der Konkatenation nicht, so daß "+" besser paßt als "*".



  • +fricky schrieb:

    oder kennst du (oder jemand anders hier) irgendeine echte abscheulichkeit in C, mit der man sich nicht arrangieren kann?
    🙂

    gets() wäre da sofort zu nennen. Ich denke, daran denkst Du noch nicht einmal, weil die Konvention es niemals zu benutzen, so tief verankert ist.

    scanf, printf etc. sind auch nicht viel besser. Immer wieder gibt es Exploits wegen dieser Klassiker.



  • ~john, lass es einfach, das ist kein Algebra-Nachhilfethread 🙂



  • die Konkatenation wäre auch mit einem Zeichen wie o oder . nicht schlecht beschrieben.

    schließlich bilden die Strings nicht nur eine Halbgruppe, sondern ein Monoid - sogar ein freies.



  • ~john schrieb:

    +fricky schrieb:

    oder kennst du (oder jemand anders hier) irgendeine echte abscheulichkeit in C, mit der man sich nicht arrangieren kann?
    🙂

    gets() wäre da sofort zu nennen. Ich denke, daran denkst Du noch nicht einmal, weil die Konvention es niemals zu benutzen, so tief verankert ist.
    scanf, printf etc. sind auch nicht viel besser. Immer wieder gibt es Exploits wegen dieser Klassiker.

    aber das sind nur funktionen. du kannst dir selbst welche schreiben, die sich weniger eigensinnig verhalten. ich meinte eigentlich die sprache selbst. gibt's da irgendwas, was schlecht ist? also mir fällt nix ein.
    🙂



  • Der fehlende operator<<(const volatile void*) ist auch nur eine Funktion.

    Hier, templatisieren mag das jemand anders:

    std::ostream& operator<<(std::ostream& os, const volatile void* p) {
      return os << const_cast<void*>(p);
    }
    

    (Hoffentlich ist die Diskussion damit beendet. Das ist ja nun nicht gerade eine Funktion, auf die 99,999% der C++-Programmierer sehnsüchtig gewartet haben.)



  • Der fehlende operator<<(const volatile void*) ist auch nur eine Funktion.

    Ich dachte impliziter Cast in void* geht nicht mehr? müsste also schon volatile int const* sein, oder?
    aber dennoch ist es auch nur eine fehlende Funktion, richtig.



  • Doch, NACH void* umwandeln geht immer implizit, nur von void* benötigt einen static_cast.



  • +fricky schrieb:

    ich meinte eigentlich die sprache selbst.

    Die Standard Library ist Teil der Sprache. Weiteres zu diesem Punkt ist schon angemerkt worden.

    +fricky schrieb:

    gibt's da irgendwas, was schlecht ist? also mir fällt nix ein.

    Ein paar Probleme die mir sofort einfallen.

    • Makros
    • Trigraphs
    • Zeigerarithmetik
    • Operator "?", ist redumdant zu "if"
    • Bedeutung von "extern"
    • Der konkrete Typ von char ist "implementation defined", er kann entweder "unsigned char" oder "signed char" sein.


  • Im Grunde ist C++ nur eine Verschlimmbesserung von C. Beim Versuch C objektorientiert zu machen wurde eine Menge Overhead erzeut der für größere und somit langsamere Programme sorgt. Und zusätzlich wurden noch viel mehr Möglichkeiten undefiniertes Verhalten hervorzurufen eingebaut.



  • ~john schrieb:

    [*]Makros

    sind doch gut und brauchbar in C. natürlich kann man mit makros auch mist fabrizieren, aber womit kann man das nicht?

    ~john schrieb:

    [*]Trigraphs

    hab' ich noch nie verwendet. ich muss jedesmal bei wikipedia o.ä. nachschauen, was das überhaupt ist. ist also nichts lebenswichtiges und daher auch kein wirkliches problem für C programmierer.

    ~john schrieb:

    [*]Zeigerarithmetik

    ist in C, weil C ziemlich maschinennah ist, sehr sinnvoll. was würdest du als ersatz vorschlagen?

    ~john schrieb:

    [*]Operator "?", ist redumdant zu "if"

    der ist z.b. gut, wenn du makros bauen willst, die einen wert 'zurückgeben' können. aber sonst braucht man's so gut wie nie.

    ~john schrieb:

    [*]Bedeutung von "extern"

    was findest du doof an 'extern'? oder meintest du vielleicht 'static'?

    ~john schrieb:

    [*]Der konkrete Typ von char ist "implementation defined", er kann entweder "unsigned char" oder "signed char" sein.

    dann nimm 'int'. wenn's unbedingt 'char' sein muss und vorzeichenbehaftung eine rolle spielt, dann schreib einfach ein 'signed' oder 'unsigned dazu.

    einiges von dem ^^ könnte einsteigern anfangs vielleicht kopfzerbrechen bereiten, aber echte unzulänglichkeiten hast du nicht eine einzige genannt. vielleicht weil es keine gibt?
    btw, ich verstehe jetzt nicht mehr, warum du dich manchmal abfällig über Java geäussert hast. das meiste was du da aufgezählt hast, ist in Java (trotz C-syntax) nicht vorhanden.
    🙂



  • +fricky schrieb:

    ~john schrieb:

    [*]Operator "?", ist redumdant zu "if"

    der ist z.b. gut, wenn du makros bauen willst, die einen wert 'zurückgeben' können. aber sonst braucht man's so gut wie nie.

    Und manche Sachen schreiben sich einfach schneller, hier eine statt fünf Zeilen:

    int degree =  is_dirty?  60  : 30;
    

    Redundanz als Begründung für "schlecht" finde ich merkwürdig oder hast du auch was gegen die while-Schleife?


Anmelden zum Antworten