Ist es sinnvoll heute noch C++ anzufangen?



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



  • ~john schrieb:

    • Makros

    Da kann ich nur bedingt zustimmen. Makros sind aber manchmal verdammt praktisch.

    ~john schrieb:

    • Trigraphs

    ich programmiere schon seit Jahren in C und hab auch alten Code warten müssen, doch so etwas wie Trigraphs wusste ich nicht einmal, dass es gibt. Zum ersten Mal davon gehört. Krass dass C sowas (noch) unterstützt.

    ~john schrieb:

    • Zeigerarithmetik

    Also, C ohne Zeigerarithmetik ist kein C mehr. Wenn man sehr maschinennah arbeitet, ist das oft notwendig und es gibt sogar Architkturen, die das "von Hause aus" können, ARM zu Beispiel.

    ~john schrieb:

    • Operator "?", ist redumdant zu "if"

    ist nicht überflüssig, vor allem, wenn man mit Makros arbeitet. Aber da du ja Makros nicht magst ...

    ~john schrieb:

    • Bedeutung von "extern"

    verstehe ich nicht, was da so schrecklich daran ist.

    ~john schrieb:

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

    das stimmt, das kann viel schon Ärger machen, wenn man nicht aufpasst.



  • C ist lässig, leger, gut gelaunt und einfach genial.

    Wer damit nicht zurechtkommt weil die Phantasie fehlt soll Java oder so was nehmen.


Anmelden zum Antworten