Welche Vorteile hat C, was kann man an C loben?



  • net schrieb:

    assemblerfans würden aber jetz aber ungläubig gucken, wenn denen einer erzählt man hätte mit einer hochsprache (c) alles unter kontrolle...

    Echte Assembler-Fans denken erst, sie haben alles unter Kontrolle, wenn sie Hammer und Lötkolben in den Händen halten.

    Greetz, Swordfish





  • c absteiger schrieb:

    C ist doch nur was für Masochisten. 👎

    Oder etwas für Leute, die sich intensiv mit einer Sprache befassen wollen, anstatt stupiden Syntaxzucker runterzuleiern, fernab von jeglichem Codedesign. 🙂

    Obwohl ich selbst noch einiges mit C zu tun habe, kann ich keine wirklichen Vorteile sehen. Zumindest wenn man C++ in den Vergleich mit einbezieht. Der einzige Vorteil von C liegt in der starken Verbreitung, und dass praktisch so gut wie für jedes relevante System Compiler existieren. Wurde ja auch schon erwähnt. Hat aber eben direkt mit der Sprache, also der reinen Spezifikation, nicht viel zu tun.



  • Swordfish schrieb:

    Echte Assembler-Fans denken erst, sie haben alles unter Kontrolle, wenn sie Hammer und Lötkolben in den Händen halten.

    Wofür denn den Hammer? Entsorgung gehört doch normalerweise nicht zu Planung. 😉

    Bezüglich man kann mit jeder Sprache alles machen. Das wäre warscheinlich richtig, wenn sich alle Sprachen compilieren ließen und alle Compiler eine gemeinsame ABI benutzten würden. Dann wäre es nämlich wirklich egal.



  • groovemaster schrieb:

    Obwohl ich selbst noch einiges mit C zu tun habe, kann ich keine wirklichen Vorteile sehen. Zumindest wenn man C++ in den Vergleich mit einbezieht.

    c++ ist aufgemotztes c. das ist zwar auf den ersten blick ein segen aber durch solche faxen wie virtuelle funktionen, operator/function overloading, default parameter, selbstdefinierte operatoren wie z.b. >> usw. kann man sehr schnell völlig unverständlichen code produzieren. ausserdem kann es passieren, dass c++ programme einen enormen speicherhunger entwickeln und riesige executables erzeugen wenn man nicht genau aufpasst. der vorteil einer objektorientierten sprache (den benutzer von maschinenspezifischen dingen abzuschirmen) verwandelt sich schnell in einen nachteil. deshalb wird auf kleinstcomputern vorzugsweise c ohne ++ eingesetzt...



  • net schrieb:

    aber durch solche faxen wie virtuelle funktionen,...der vorteil einer objektorientierten sprache...

    😮 Wenn virtuelle Funktionen (die es im übrigen genaugenommen
    gar nicht gibt) für dich Faxen sind, dann würde ich gerne mal
    wissen, wie bei dir OO-Sprachen funktionieren sollen! 😕



  • Javaner schrieb:

    ...dann würde ich gerne mal
    wissen, wie bei dir OO-Sprachen funktionieren sollen!

    so wie java. java finde ich toll 👍



  • Danke für das ironische Antwort! 😃

    Aber ich find' nur Smalltalk geil...

    Java ist das kleiner Übel. 🙂



  • Javaner schrieb:

    Danke für das ironische Antwort! 😃

    das war nicht ironisch. ich mag java wirklich. java ist nicht so'ne wollmilchsau wie c++. aber smalltalk ist bestimmt auch nett, ich hab' nur leider noch nie was damit gemacht...



  • net schrieb:

    c++ ist aufgemotztes c.

    Nope. C und C++ sind strikt voneinander zu trennen. Gemeinsamkeiten rühren lediglich daher, dass C als Basis diente. Nicht mehr und nicht weniger. Genauso könnte man sagen, dass Java ein aufgemotztes (oder abgespecktes?) C++ ist. Genauso so ein Unsinn.

    net schrieb:

    das ist zwar auf den ersten blick ein segen aber durch solche faxen wie virtuelle funktionen, operator/function overloading, default parameter, selbstdefinierte operatoren wie z.b. >> usw. kann man sehr schnell völlig unverständlichen code produzieren.

    Gerade durch Sachen wie Operatorüberladung kann man sehr intuitiven Code schreiben, der leichter verständlich ist. Mir geht C++ da ehrlich gesagt noch nicht weit genug. Ich würde mir zB noch Properties wünschen. Aber das ist ein anderes Thema. Und was soll denn an virtuellen Funktionen oder Funktionsüberladung schlecht sein? Es gibt sogar Leute, die sich wundern, dass man in C keine Funktionen überladen kann. Vllt. kannst du ja mal ein paar konkrete Beispiele nennen, ansonsten kann man mit deiner Aussage nix anfangen.

    net schrieb:

    ausserdem kann es passieren, dass c++ programme einen enormen speicherhunger entwickeln und riesige executables erzeugen wenn man nicht genau aufpasst.

    Das liegt aber nicht an C++, sondern in erster Linie an der STL bzw. deren Implementation. Dass die alles andere als optimal ist, sehe wohl nicht nur ich so. Aber schliesslich zwingt dich niemand dazu, sie zu benutzen. Zumindest ich nicht. 🙂
    C hat dafür genauso Nachteile, ich denke da zB nur an den ganzen ...printf/...scanf Hickhack. Typsicherheit ade, und willkommen ihr Bufferoverruns!

    net schrieb:

    der vorteil einer objektorientierten sprache (den benutzer von maschinenspezifischen dingen abzuschirmen) verwandelt sich schnell in einen nachteil. deshalb wird auf kleinstcomputern vorzugsweise c ohne ++ eingesetzt...

    Nope. Das ist deshalb schon Unsinn, weil C++ keine rein objektorientierte Sprache ist. Und dass auf exotischen Systemen vorzugsweise C eingesetzt wird, liegt vielmehr daran, dass dort eher Compiler und andere Entwicklungstools verfügabr sind. Das wurde ja bereits gesagt.



  • groovemaster schrieb:

    Es gibt sogar Leute, die sich wundern, dass man in C keine Funktionen überladen kann.

    Das würde ich mir wirklich auch für C wünschen.



  • groovemaster schrieb:

    net schrieb:

    das ist zwar auf den ersten blick ein segen aber durch solche faxen wie virtuelle funktionen, operator/function overloading, default parameter, selbstdefinierte operatoren wie z.b. >> usw. kann man sehr schnell völlig unverständlichen code produzieren.

    Das liegt aber nicht an C++, sondern in erster Linie an der STL bzw. deren Implementation. Dass die alles andere als optimal ist, sehe wohl nicht nur ich so. Aber schliesslich zwingt dich niemand dazu, sie zu benutzen. Zumindest ich nicht. 🙂

    Zudem werden die C++ Compiler auch stetig verbessert und die binaries werden kleiner. C Compiler sind deutlich älter und ausgereifter als C++ Compiler, war klar, dass bei C++ Compilern Aufholbedarf besteht.

    Der Unterschied zw. "Hello World" in C++ und "Hello World" in C ist zwar noch deutlich, aber er wird kleiner. Wenn sich jetzt noch die STL etwas schlanker machen würde...

    net schrieb:

    Javaner schrieb:

    Danke für das ironische Antwort! 😃

    das war nicht ironisch. ich mag java wirklich. java ist nicht so'ne wollmilchsau wie c++. aber smalltalk ist bestimmt auch nett, ich hab' nur leider noch nie was damit gemacht...

    Von der Aussage mach ich mir n Screenshot 😉

    MfG

    GPC



  • net schrieb:

    [...] java finde ich toll 👍

    net, mir graust vor dir! 😉

    Greetz, Swordfish



  • groovemaster schrieb:

    net schrieb:

    c++ ist aufgemotztes c.

    Nope. C und C++ sind strikt voneinander zu trennen. Gemeinsamkeiten rühren lediglich daher, dass C als Basis diente. Nicht mehr und nicht weniger. Genauso könnte man sagen, dass Java ein aufgemotztes (oder abgespecktes?) C++ ist. Genauso so ein Unsinn.

    natürlich ist c++ eine eigene sprache. das will auch keiner anzweifeln. aber bei der geburt von c++ wurde c genommen, oop und andere features dazugepackt, die typüberprüfung ver(schlimm)bessert usw. heraus kam nix halbes und nix ganzes - erhöhte komplexität und trotzdem blieben fast alle macken von c erhalten. java dagegen ist weder abgespecktes noch aufgemotztes c++. für java hat c++ (neben anderen sprachen, ich glaub' lisp und smalltalk waren dabei) eigentlich nur als anschauungsobjekt gedient (was macht man anders/besser bzw. was ist ok).

    groovemaster schrieb:

    net schrieb:

    das ist zwar auf den ersten blick ein segen aber durch solche faxen wie virtuelle funktionen, operator/function overloading, default parameter, selbstdefinierte operatoren wie z.b. >> usw. kann man sehr schnell völlig unverständlichen code produzieren.

    Gerade durch Sachen wie Operatorüberladung kann man sehr intuitiven Code schreiben, der leichter verständlich ist.

    ...oder genau das gegenteil. du siehst in einem qulltext 'a<<4'. ist es nun ein shift oder wird da was 'gestreamt'? man sieht irgendwo 'a=a+b' ist es wirklich eine addition oder etwas gänzliches anderes? du hast zwei funktionen 'mach_was(int x)' und 'mach_was(char x)'. in einem sourcefragment siehste irgendwo 'mach_was(a)'. welche von beiden wird aufgerufen?

    groovemaster schrieb:

    C hat dafür genauso Nachteile, ich denke da zB nur an den ganzen ...printf/...scanf Hickhack. Typsicherheit ade, und willkommen ihr Bufferoverruns!

    klar hat c nachteile, aber c++ hat fast alle davon übernommen und um eigene nachteile ergänzt...

    groovemaster schrieb:

    net schrieb:

    der vorteil einer objektorientierten sprache (den benutzer von maschinenspezifischen dingen abzuschirmen) verwandelt sich schnell in einen nachteil. deshalb wird auf kleinstcomputern vorzugsweise c ohne ++ eingesetzt...

    Nope. Das ist deshalb schon Unsinn, weil C++ keine rein objektorientierte Sprache ist.

    und warum sollte einer c++ nutzen, wenn er nicht oop macht? wegen der schönen dynamic_cast<>'s? oder weil er irgenwo mitten im quelltext variablen definieren kann? oder etwa weil er 'malloc' hasst und lieber 'new' schreiben möchte (um hinterher die [] beim delete zu vergessen)?

    Swordfish schrieb:

    net schrieb:

    [...] java finde ich toll 👍

    net, mir graust vor dir! 😉

    dafür finde ich c# doof 😉



  • groovemaster schrieb:

    Es gibt sogar Leute, die sich wundern, dass man in C keine Funktionen überladen kann.

    Ich bin einer von den die sich wundern.
    Ich sehe wirklich keinen technischen Grund warum es in C nicht geben sollte. Falls einen solchen gibt, bitte mir den zu nennen.
    Überladene Funktionen ist das einzige was mir in C fehlt.



  • net schrieb:

    natürlich ist c++ eine eigene sprache. das will auch keiner anzweifeln. aber bei der geburt von c++ wurde c genommen, oop und andere features dazugepackt, die typüberprüfung ver(schlimm)bessert usw. heraus kam nix halbes und nix ganzes - erhöhte komplexität und trotzdem blieben fast alle macken von c erhalten.

    Naja, du kannst dir sicherlich denken, dass das nicht viele Leute so sehen. Zumindest die, die sich intensiv mit C++ beschäftigen. Das Typsystem arbeitet in C++ jedenfalls deutlich strikter, das ist definitiv eine Verbesserung. ZB kann man in C Folgendes machen:

    foo* a = ...;
    //...
    void* b = a;
    //...
    bar* c = b;
    

    Kein Problem. Allerdings kann man sich damit auch schnell ein Bein stellen. In C++ ist das nicht möglich.
    Und Komplexität? Das ist doch deine rein subjektive Ansicht. Wenn man will, ist C++ auch nicht komplexer als C. Niemand zwingt dich, Templates oder virtuelle Vererbung zu nutzen. Insofern frage ich mich, wieso du Java magst. Ist doch auch viiieeeeel komplexer als C. 🙄
    Dass C++ bei weitem nicht optimal ist, bestreite ich ja gar nicht. Ich hätte mir zB auch gewünscht, dass man sich mit dem Standard aus dem Jahre 1998 mehr von C "Altlasten" lossagt, und zB keine Sachen wie C-Casts oder variable Argument Listen mehr unterstützt. Naja, man kann halt nicht alles haben. Deswegen zu behaupten, dass C++ "nix halbes und nix ganzes" ist, ist jedenfalls Blödsinn. Wenn ich keine Lust habe, in den Urlaub zu fliegen, nur weil ich Flugangst habe, würde ich wohl auch behaupten, dass am Strand zu liegen und halbnackten Tussies auf den Knackarsch zu glotzen, langweilig ist. Auch wenn ich's eigentlich mag. Alles eine Frage der Einstellung. 😉

    net schrieb:

    ...oder genau das gegenteil. du siehst in einem qulltext 'a<<4'. ist es nun ein shift oder wird da was 'gestreamt'? man sieht irgendwo 'a=a+b' ist es wirklich eine addition oder etwas gänzliches anderes?

    Du denkst schon wieder zu sehr STL bzw. implementationsbezogen. Wenn da irgendwo "a=a+b" steht, dann erwarte ich auch, dass im mathematischen Sinne addiert wird. So wie es ja auch im Standard steht. Leider wird sowas manchmal missbraucht, zB bei std::basic_string. Dort wird operator + überladen, was eigentlich Unsinn ist. Ein Konkatenationsoperator wäre weitaus sinnvoller. Ansonsten ergibt sich das meiste sowieso aus dem unmittelbaren Kontext.
    Operatorüberladung solltest du jedenfalls erstmal von einer abstrakteren Ebene betrachten. Und für mich ist

    a + b + c + d + e
    

    intuitiver, einfacher und übersichtlicher als

    add(a, add(b, add(c, add(d, e))))
    

    net schrieb:

    du hast zwei funktionen 'mach_was(int x)' und 'mach_was(char x)'. in einem sourcefragment siehste irgendwo 'mach_was(a)'. welche von beiden wird aufgerufen?

    Ist doch vollkommen uninteressant. Du hast ein Objekt, a, und mit dem wird "etwas" gemacht. Das Ergebnis ist dabei das gleiche. Wenn diese Funktionen natürlich vollkommen anders arbeiten, dann hat der Client sich ein Eigentor geschossen. _Dafür_ ist Überladung nicht da. Dann sollten die Funktionen mach_dieses(int x) und mach_jenes(char x) heissen.

    net schrieb:

    klar hat c nachteile, aber c++ hat fast alle davon übernommen und um eigene nachteile ergänzt...

    Nope. C++ hat Nachteile von C übernommen, und verbesserte Möglichkeiten zusätzlich im Angebot. Wenn du dich strikt weigerst, diese zu benutzen, oder keine Ahnung hast, diese sinnvoll zu verwenden, mach nicht C++ dafür verantwortlich. In Fachkreisen bezeichnet man solche Leute wohl auch als Whiner. 🙂

    net schrieb:

    und warum sollte einer c++ nutzen, wenn er nicht oop macht?

    Weil er zB Templates möchte? Oder Funktionsüberladung? Oder echte Konstanten? Oder was auch immer...
    Natürlich macht C++ nicht sonderlich viel Sinn ohne Klassen. Man muss damit aber nicht bis zum Äussersten gehen. Und es verbietet dir auch niemand, nur bestimmte Teile mit OO zu realisieren.

    net schrieb:

    wegen der schönen dynamic_cast<>'s?

    Für mich gehört dynamic_cast nicht gerade zu den Sternstunden von C++. IdR reicht static_cast vollkommen aus. Das geht dann aber mehr in Richtung Design und gehört damit nicht wirklich zum Thema.

    net schrieb:

    oder weil er irgenwo mitten im quelltext variablen definieren kann?

    Kannst du mit C auch.

    net schrieb:

    oder etwa weil er 'malloc' hasst und lieber 'new' schreiben möchte (um hinterher die [] beim delete zu vergessen)?

    Verstehe ich nicht. Wenn du C programmierst, dann nimmst du halt malloc, in C++ new. Was gibt's daran auszusetzen? Und wenn jemand die Verwendung allein an diesem Punkt festmacht, bitteschön, dann ist das doch sein Bier.



  • groovemaster schrieb:

    Das Typsystem arbeitet in C++ jedenfalls deutlich strikter, das ist definitiv eine Verbesserung.

    stimmt. trotzdem lässt c++ die alten c-casts zu, mit denen man das wieder aushebeln kann 😃

    groovemaster schrieb:

    foo* a = ...;
    //...
    void* b = a;
    //...
    bar* c = b;
    

    Kein Problem. Allerdings kann man sich damit auch schnell ein Bein stellen. In C++ ist das nicht möglich.

    das nicht, viel schlimmer: mit c++ kann man sich fehler basteln die durch einen scharfen blick auf den code nicht zu erkennen sind. beispiel:

    ...
      int *a = (int*)0x1234;
      volatile int *b = (int*)0x1234;
    
      cout << a << endl;  // ok
      cout << b << endl;  // huch?
    ...
    

    groovemaster schrieb:

    Insofern frage ich mich, wieso du Java magst. Ist doch auch viiieeeeel komplexer als C.

    ist es nicht. mag sein dass das nur mein subjektiver eindruck, ist aber bei java passt alles zusammen. es ist ähnlich wie mit c. beide sprachen unterstützen eine begrenzte anzahl von konzepten. der coder wird nicht von einer fülle von möglichkeiten erschlagen wie bei c++ und kann sich mehr auf das eigentliche problem konzentrieren. er und muss sich weniger mit fallstricken und unzulänglichkeiten auseinandersetzen als das bei c++ der fall ist. aber wie schon geschrieben: das ist mein eindruck. ich bin ein einfach gestrickter mensch und einfach gestrickte menschen brauchen einfach gestrickte programmiersprachen...

    groovemaster schrieb:

    Operatorüberladung solltest du jedenfalls erstmal von einer abstrakteren Ebene betrachten. Und für mich ist

    a + b + c + d + e
    

    intuitiver, einfacher und übersichtlicher als

    add(a, add(b, add(c, add(d, e))))
    

    aber das...

    add (a,b,c,d,e);
    

    oder das...

    add (&a, number_of_terms);
    

    ist noch ein stückchen intuitiver. man erkennt schon allein am funktionsaufruf, dass es sich um eine art addition nicht-primitiver datentypen handeln muss, sonst könnte man's ja mit '+' machen. und dieser effekt geht bei der verwendung von überladenen operatoren verloren.

    groovemaster schrieb:

    net schrieb:

    und warum sollte einer c++ nutzen, wenn er nicht oop macht?

    Weil er zB Templates möchte? Oder Funktionsüberladung? Oder echte Konstanten? Oder was auch immer...

    ja, templates sind an sich eine feine sache. allerdings muss man auch dabei höllisch aufpassen, dass man sich nicht mörderisch grossen code generiert (womit wir wieder beim problem sind sich mehr mit den tücken der sprache auseinanderzusetzen als...). ...und was die konstanten angeht: die einzigen 'echten' konstanten kriegt man nur mit #define hin.

    äää, aber eigentlich sollten wir doch über die vorteile von c schreiben und nicht über die macken von c++ ... 😉



  • groovemaster schrieb:

    Das Typsystem arbeitet in C++ jedenfalls deutlich strikter, das ist definitiv eine Verbesserung. ZB kann man in C Folgendes machen:

    foo* a = ...;
    //...
    void* b = a;
    //...
    bar* c = b;
    

    Kein Problem. Allerdings kann man sich damit auch schnell ein Bein stellen. In C++ ist das nicht möglich.

    Na herzllichen Glückwunsch, Du hast den *einzigen* Unterschied im Typsystem zwischen C und C++ entdeckt: void-Zeiger werden in C automatisch gewandelt. Daß C++ über diesen (in der Praxis absolut irrelevaten[1]) Punkt hinaus "deutlich strikter" sei, ist ein oft kolportierter Mythos. Bitte abstellen.

    [1]: void kommt in C++-Quelltext de facto nicht vor.



  • Nunja, ich hoffe, ich störe eure Privatdiskussion jetzt nicht... 😉

    Ich habe selber erst vor kurzem angefangen, mich näher mit der ganzen Materie zu befassen und muss sagen, dass es doch viel einfacher ist, C++ zu erlernen, wenn man mit C anfängt.

    Man ist ja nicht dazu gezwungen, an C hängenzubleiben und nicht später in C++ überzugehen.

    Zweifelsohne hat C++ mehr Funktionen und es ist ausgereifter.

    Jedoch ist C wie gesagt eine Sprache, mit der man einen super Einstieg in weitere Sprachen finden kann, wie zum Beispiel auch C++.

    Aber diese Meinung habe ich ja nicht erfunden, das kann man ja eigentlich in jedem Anfängerbuch über C/C++ nachlesen... deswegen finde ich diese Diskussion im Allgemeinen auch etwas sinnlos.

    RS



  • Marcin schrieb:

    groovemaster schrieb:

    Es gibt sogar Leute, die sich wundern, dass man in C keine Funktionen überladen kann.

    Ich bin einer von den die sich wundern.
    Ich sehe wirklich keinen technischen Grund warum es in C nicht geben sollte. Falls einen solchen gibt, bitte mir den zu nennen.
    Überladene Funktionen ist das einzige was mir in C fehlt.

    Es kann keinen Technischen Grund geben, weil es in C++ ja auch geht. Den einzigen Grund, den es geben würde wäre, dass die Binaries plötzlich inkompatibel zu früheren C Versionen werden, was kaum jemand möchte. Wenn du überladen möchtest, nimm C++. C ist halt nicht C++.


Anmelden zum Antworten