Ist es sinnvoll heute noch C++ anzufangen?



  • was ja wohl das verkehrteste überhaupt ist.

    Richtig, aber das hat mit Operatorenüberladung grad mal gar nix zu tun, wie du behaupted hast, sondern ist ein Nachteil der starken Typisierung, die 1. auch in deinem geliebtem Java existert und 2. mehr Vor- als Nachteile bringt.

    wenn man c++-fanboys zeigt, welch komische faxen mit ihrer sprache möglich sind, wird oft die sinnhaftigkeit der gesamten aktion in frage gestellt. woran liegts? selbstverständlich ist es manchmal sinnvoll, den wert eines zeigers auszugeben.

    wenn man einem java-fanboy zeigt, welche Dinge mit Java alles nicht möglich ist, wird oft die Sinnhaftigkeit der ganzen Aktion in Frage gestellt, woran liegts? Selbstverständlich ist es manchmal sinnvoll Operatoren zu überladen.



  • Allgemeiner Quark ...



  • JustAnotherNoob schrieb:

    Richtig, aber das hat mit Operatorenüberladung grad mal gar nix zu tun, wie du behaupted hast...

    indirekt schon. schliesslich versagt hier cout.operator<<() völlig und der benutzer wundert sich.

    JustAnotherNoob schrieb:

    sondern ist ein Nachteil der starken Typisierung, die 1. auch in deinem geliebtem Java existert und ...

    in einer stark typisierten sprache wäre ein cast von 'volatine int*' nach bool überhaupt nicht möglich. aber kannst gern mal selbst ausprobieren, was du in Java alles in einen boolean casten kannst.
    🙂



  • indirekt schon. schliesslich versagt hier cout.operator<<() völlig und der benutzer wundert sich.

    Das wäre bei einer anderen Funktion nicht anders, deswegen hats mit Operatorenüberladung nichts zu tun.

    in einer stark typisierten sprache wäre ein cast von 'volatine int*' nach bool überhaupt nicht möglich. aber kannst gern mal selbst ausprobieren, was du in Java alles in einen boolean casten kannst.

    Ja, sorry, mein Fehler. Es liegt jedenfalls an der stärkeren Typisierung als in C.
    Wie auch immer, es ist jedenfalls eine Schwäche von C++, aber keine, die man besonders oft zu spüren bekommt. Dass C++ perfekt ist hat wohl niemand behauptet.



  • JustAnotherNoob schrieb:

    indirekt schon. schliesslich versagt hier cout.operator<<() völlig und der benutzer wundert sich.

    Das wäre bei einer anderen Funktion nicht anders, deswegen hats mit Operatorenüberladung nichts zu tun.

    natürlich hat es damit zu tun. bei 'ner funktion: printThatFuckingPointerValue(void *p) siehste allein schon am namen, was sie machen soll. ein operator<< mit 1000 überladungen, der eigenmächtig (und fälschlicherweise) pointer in 'bools' castet, ist einfach nur mist.
    zu op-überladungen schau auch mal hier: http://cafe.elharo.com/blogroll/operator-overloading-considered-harmful/

    JustAnotherNoob schrieb:

    Dass C++ perfekt ist hat wohl niemand behauptet.

    das würd wohl auch keiner wagen, so weit wie C++ von perfektion entfernt ist.
    🙂



  • +fricky schrieb:

    natürlich hat es damit zu tun. bei 'ner funktion: printThatFuckingPointerValue(void *p) siehste allein schon am namen, was sie machen soll.

    Die würde aber nicht anwendbar sein für deinen volatile-Pointer. Außerdem müsstest du die Funktion print nennen und für genau dieselben Typen anwenden, für die du auch den operator<< anwendest. Du bist ja schließlich nur gegen Operatorüberladung, und nicht auch gegen Funktionsüberladung.
    Und dann würdest du feststellen, dass print(myvolatilepointer) auch den bool-Overload greift. IOW, das Problem hat mit Operatorüberladung überhaupt nichts zu tun.
    Es hat was mit der Semantik von volatile zu tun und wurde offenbar in der IOStreams-Library vergessen. Man bräuchte halt eine Überladung für const volatile void*, nicht nur const void*. 99% aller C++-Entwickler merken das aber nicht, weil man volatile nicht gerade jeden Tag braucht.

    ein operator<< mit 1000 überladungen, der eigenmächtig (und fälschlicherweise) pointer in 'bools' castet, ist einfach nur mist.
    zu op-überladungen schau auch mal hier: http://cafe.elharo.com/blogroll/operator-overloading-considered-harmful/

    Das ist ein Effekt der Überladung an sich, nicht der Operatorüberladung. Und in Java kann dir sowas natürlich nicht passieren, weils da weder const noch volatile noch Pointer überhaupt gibt, die man ausgeben wollen könnte.



  • Operatorüberladung ist ein Spezialfall von Polymorphie, und Polymorphie ist ein Prinzip der OOP.

    Das ist in C++ nur nicht so leicht zu erkennen, aber in der "reinen Lehre" der OO gibt es nur objects und messages, und ein Operatorsymbol ist nichts Anderes als eine message an ein object.

    Da gleichlautende Nachrichten an Objekte verschiedener Klassen nicht nur erlaubt, sondern sogar erwünscht (Polymorphie) sind, ist an der Operatorüberladung doch grundsätzlich nichts auszusetzen, solange die Symbole vernünftig gewählt werden (und nicht etwa "+" benutzt wird, um Elemente aus einer Liste zu entfernen ...)



  • +fricky schrieb:

    .... bla bla bla...
    so weit wie C++ von perfektion entfernt ist.
    🙂

    Leg mal ne andere Platte auf! Scheint nen Sprung drin zu sein.
    Wir wissen das so langsam, das du zwar C++ hasst obwohl du es nicht kennst, aber jede Woche hier abhängst, um deine Minderwertigkeitskomplexe zu kompensieren. So langsam wird es langweilig.

    C++ ist schlecht und keiner braucht es... kann dir nur zustimmen.



  • Artchi schrieb:

    C++ ist schlecht und keiner braucht es...

    ...und niemand verdient damit sein Lebensunterhalt, und es gibt auch keine Firmen wo eine Abkehr von C++ nicht direkt ansteht. 🙂

    Wenn ich selbst nicht die Firma irgendwann wechsel, werde ich wohl noch in 10 Jahren mit C++ mein Brot verdienen (egal wie +fricky die Sprache hasst).

    cu André



  • Bashar schrieb:

    +fricky schrieb:

    natürlich hat es damit zu tun. bei 'ner funktion: printThatFuckingPointerValue(void *p) siehste allein schon am namen, was sie machen soll.

    Die würde aber nicht anwendbar sein für deinen volatile-Pointer. Außerdem müsstest du die Funktion print nennen und für genau dieselben Typen anwenden, für die du auch den operator<< anwendest. Du bist ja schließlich nur gegen Operatorüberladung, und nicht auch gegen Funktionsüberladung.
    Und dann würdest du feststellen, dass print(myvolatilepointer) auch den bool-Overload greift. IOW, das Problem hat mit Operatorüberladung überhaupt nichts zu tun.

    so gesehen hast du schon recht, aber es wäre ganz nett, wenn der compiler mit 'nem fehler abbrechen würde, falls keine passende überladung definiert wurde. stattdessen wird's zu bool (ein datentyp, wie er weiter entfernt von einem volatile int* nicht sein kann). das ist total doof.

    asc schrieb:

    Wenn ich selbst nicht die Firma irgendwann wechsel, werde ich wohl noch in 10 Jahren mit C++ mein Brot verdienen

    kann sein, aber die wahrscheinlichkeit ist ziemlich gering.

    Artchi schrieb:

    Wir wissen das so langsam, das du zwar C++ hasst obwohl du es nicht kennst, aber jede Woche hier abhängst, um deine Minderwertigkeitskomplexe zu kompensieren.

    das mach' ich nur, weil in threads wie diesem sofort völlig unsachlich auf anderen sprachen rumgehackt wird. bereits die erste(!) antwort ist das beste beispiel (~john: schlechter code des linux kernel, weil in C geschrieben). sowas kann man doch nicht unkommentiert stehen lassen.
    🙂



  • +fricky schrieb:

    asc schrieb:

    Wenn ich selbst nicht die Firma irgendwann wechsel, werde ich wohl noch in 10 Jahren mit C++ mein Brot verdienen

    kann sein, aber die wahrscheinlichkeit ist ziemlich gering.

    Nein, sie ist sogar extrem hoch. Alleine schon weil der Chef es so sieht, wir eine (für die Firmengröße) breite Installationsbasis haben, und für eine Migration auf ein anderes System (C# wäre aus meiner Sicht von der Anwendung und Zielrichtung her eine Alternative) nicht genügend Anreiz existiert.

    Wenn du so betriebsblind bist um einen Anwendungsfall zu sehen, heißt dies noch lange nicht, das es Firmen ebenso sehen. Zumal es auch einfach genügend Software auf C++ Basis gibt die weiterentwickelt wird, und auch in einigen Bereichen C++ nur langsam verdrängt wird (z.B. Spieleentwicklung). Dies gilt auch für viele andere Sprachen, in dem einfach bereits genügend Software existiert.

    +fricky schrieb:

    ...bereits die erste(!) antwort ist das beste beispiel (~john: schlechter code des linux kernel, weil in C geschrieben). sowas kann man doch nicht unkommentiert stehen lassen...

    Ach, und du musst dich gleich auf das Niveau herunterziehen und weitermachen? Davon abgesehen das zwei Seiten einer Medaille gibt. Die einen finden C++ syntaktisch schlechter als C, die anderen C schlechter als C++. Ich würde (zumindest in meinen Anwendungsbereich) kein neues Projekt mit einer von beiden Sprachen beginnen (und wenn dann noch eher C++ wegen den höheren Abstraktionsgrad).

    Und selbst auf Embedded Systemen gibt es durchaus (größere) Firmen die unter anderem C++ einsetzen, auch wenn dies eher eine C-Domäne ist.

    Ich sehe es zwar auch so, das die Verbreitung von C++ zurück geht (dies gilt aber auch für C), dennoch wird es nicht einfach so sterben.

    cu André



  • +fricky schrieb:

    es wäre ganz nett, wenn der compiler mit 'nem fehler abbrechen würde, falls keine passende überladung definiert wurde. stattdessen wird's zu bool (ein datentyp, wie er weiter entfernt von einem volatile int* nicht sein kann). das ist total doof.

    Die allgegenwärtigen impliziten Typumwandlungen sind ein Erbe von C, das C++ bis zum Ende mit sich herumschleppen wird. Vielleicht wäre es besser ohne.



  • Bashar schrieb:

    Die allgegenwärtigen impliziten Typumwandlungen sind ein Erbe von C, das C++ bis zum Ende mit sich herumschleppen wird. Vielleicht wäre es besser ohne.

    Es wäre wirklich nicht dumm diese Projektweit als Warnung/Fehler melden zu können (Sprich: zumindest eine optionale Prüfung). Erst vor ein paar Tagen ein Fehler durch Zufall gefunden, der unbemerkt über Jahre hinweg zu Rundungsfehlern (zum Glück weder in einem finanziellen, noch lebenswichtigen Bereich) geführt hat. Merkwürdig nur das ihn selbst die Kunden nicht bemerkt haben...



  • asc schrieb:

    +fricky schrieb:

    asc schrieb:

    Wenn ich selbst nicht die Firma irgendwann wechsel, werde ich wohl noch in 10 Jahren mit C++ mein Brot verdienen

    kann sein, aber die wahrscheinlichkeit ist ziemlich gering.

    Nein, sie ist sogar extrem hoch. Alleine schon weil der Chef es so sieht, wir eine (für die Firmengröße) breite Installationsbasis haben, und für eine Migration auf ein anderes System (C# wäre aus meiner Sicht von der Anwendung und Zielrichtung her eine Alternative) nicht genügend Anreiz existiert.

    ich weiss nicht, was ihr für software macht, aber für micht hört's sich so an, als hängt ihr ziemlich an microsofts nabelschnur. darauf, dass m$ in 10 jahren noch C++ unterstützt, würde ich nicht wetten. 10 jahre sind, in der it-welt, eine sehr lange zeit.

    asc schrieb:

    Ich sehe es zwar auch so, das die Verbreitung von C++ zurück geht (dies gilt aber auch für C)...

    ich sehe keine anzeichen für einen rückgang von C. C hat sich im lowlevel-bereich sehr stark etabliert. vielleicht ist C nicht das optimum, vielleicht wäre z.b. ADA eine geeignetere sprache. aber bevor irgendeine andere sprache C von seinem thron stossen kann, müssen noch 'ne menge bits den bus runterfliessen.

    Bashar schrieb:

    +fricky schrieb:

    es wäre ganz nett, wenn der compiler mit 'nem fehler abbrechen würde, falls keine passende überladung definiert wurde. stattdessen wird's zu bool (ein datentyp, wie er weiter entfernt von einem volatile int* nicht sein kann). das ist total doof.

    Die allgegenwärtigen impliziten Typumwandlungen sind ein Erbe von C, das C++ bis zum Ende mit sich herumschleppen wird. Vielleicht wäre es besser ohne.

    aber die automatischen typumwandlungen, die C macht, führen nicht zu datenverlust. einen pointer zu 'nem bool zu machen ist völlig hirnverbrannt. das kann sich C++ unmöglich von C abgeschaut haben.
    🙂



  • +fricky schrieb:

    aber die automatischen typumwandlungen, die C macht, führen nicht zu datenverlust. einen pointer zu 'nem bool zu machen ist völlig hirnverbrannt. das kann sich C++ unmöglich von C abgeschaut haben.
    🙂

    Folgendes ist doch legaler C-Code, oder?

    int main(void)
    {
       int a = 0;
       int *p = &a;
       if(p)
       {
          //blub
       }
    }
    

    Gut, es gibt in C kein bool im eigentlichen Sinne, aber wie soll man diesen Code noch vernünftig weiter unterstützen, wenn man dann doch bool einführt?

    Zu dem Datenverlust:

    double a = 5.1234567;
    int b = a; //Nein, hier findet kein Datenverlust statt...
    


  • +fricky schrieb:

    ich weiss nicht, was ihr für software macht, aber für micht hört's sich so an, als hängt ihr ziemlich an microsofts nabelschnur...

    Eher an der von Codegear, aber davon abgesehen: Auch wenn ich glaube das die MS-Monokultur mit der Zeit immer weniger wird, glaube ich nicht das es innerhalb von 10 Jahren zu einem Umbruch kommt. Dazu gibt es einfach für viele keine Umfassenden Alternativen (Für einige ja, aber beileibe nicht für alle).

    Und solange 0815-Anwender bereits unter Windows Probleme haben, wie soll es dann erst mit ein paar anderen Betriebssystemen sein, wo sie bei einem Problem erst teilweise kryptische Manuals durchsuchen müssen. MacOS mag für diese Klientel vielleicht passend sein, aber bereits bei den Spielern wird es heikel.

    Meine Prognose ist eher: Sofern nicht etwas bahnbrechendes passiert wird Windows auf Clientrechnern maximal 2% Markanteil pro Jahr (und dies ist wenn ich mir die vergangenen 5 Jahre anschaue schon sehr hoch gegriffen) verlieren. Nehmen wir diese eher Gegen MS gerichtete Prognose würden der Marktanteil in 20 Jahren noch immer ca. 50% in dem Segment betragen.

    +fricky schrieb:

    ...10 jahre sind, in der it-welt, eine sehr lange zeit.

    Stimmt, dennoch sollte man nicht am Markt vorbei entwicheln, und der ist jedenfalls in absehbarer Zeit nicht unser Problem. Zumal ich glaube das unser Programm von der Größe her durchaus bei paralleler Pflege bequem in maximal 3 Jahren komplett auf eine andere Plattform migriert werden kann.

    +fricky schrieb:

    asc schrieb:

    Ich sehe es zwar auch so, das die Verbreitung von C++ zurück geht (dies gilt aber auch für C)...

    ich sehe keine anzeichen für einen rückgang von C. C hat sich im lowlevel-bereich sehr stark etabliert.

    Aber selbst dieser Markt ist im Wandel und Außerhalb vom Lowlevel-Bereich sind die Stellen nach meiner Erfahrung für C und C++ im Rückgang (wenn ich von meiner Bewerbungszeit zurückschließe). Ich würde mich jedenfalls nicht an C festbeißen, ebenso wenig wie auf C++. Aber auch hier gilt: Veränderungen erfolgen nicht von heute auf morgen, und langfristige Projekte schwenken auch nur selten um. Ich rechne sowohl in C wie auch in C++ damit das auch noch in 20 Jahren die Sprachen eine gewisse Verbreitung haben (Vielleicht in Nischen, aber ich tippe noch auf Plätze in den Top20 der Programmiersprachen).

    +fricky schrieb:

    aber bevor irgendeine andere sprache C von seinem thron stossen kann, müssen noch 'ne menge bits den bus runterfliessen.

    TIOBE Programming Community Index for July 2009

    Auf dem Thron befindet sich C jedenfalls schon seit geraumer Zeit auf vielen Statistiken nicht mehr (und die von TIOBE halte ich für nicht die schlechteste), auf einen Podiumsplatz aber durchaus. Interessanterweise liegt C++ wieder auf Platz 3 (Auch wenn sich das wohl in einigen Monaten wieder zu Platz 4 entwickelt). Und 10,4% bei C++ finde ich nicht wenig, wenn der erste Platz [Java] auf 20,4% liegt.

    +fricky schrieb:

    aber die automatischen typumwandlungen, die C macht, führen nicht zu datenverlust. einen pointer zu 'nem bool zu machen ist völlig hirnverbrannt. das kann sich C++ unmöglich von C abgeschaut haben.
    🙂

    Ach? "if(!pointer)" ist also in C nicht möglich?

    cu André



  • Hallo

    asc schrieb:

    Ach? "if(!pointer)" ist also in C nicht möglich?

    cu André

    Ich dachte immer, dass hier der pointer implizit in ein int gecastet wird?

    chrische



  • +fricky schrieb:

    aber die automatischen typumwandlungen, die C macht, führen nicht zu datenverlust. einen pointer zu 'nem bool zu machen ist völlig hirnverbrannt. das kann sich C++ unmöglich von C abgeschaut haben.

    Du leidest an bisschen an Realitätsverlust. So gut, wie du dich mit irgendwelchen Kritiken über C++ auskennst (immerhin wesentlich besser als mit C++ selbst!), solltest du dich auch mal mit Kritiken über C beschäftigen. Was glaubst du eigentlich, was C tut, wenn du einen long zu einem float konvertierst? Oder zu einem char, oder einem bool?

    @asc, würdest du bitte das Zitat korrigieren? Ich hab das nicht gesagt. Danke 🙂



  • Bashar schrieb:

    @asc, würdest du bitte das Zitat korrigieren? Ich hab das nicht gesagt. Danke 🙂

    Sicher... Tut mir leid, keine Absicht 😉



  • Phoemuex schrieb:

    int main(void)
    {
       int a = 0;
       int *p = &a;
       if(p)
       {
          //blub
       }
    }
    

    ...aber wie soll man diesen Code noch vernünftig weiter unterstützen, wenn man dann doch bool einführt?

    das ist ja dasselbe wie 'if(p!=0)'. bei 'nem vergleich darf doch ein 'bool' entstehen (kann ja nur wahr oder falsch sein). wieso sollte sowas nicht unterstützt werden?

    Phoemuex schrieb:

    Zu dem Datenverlust:

    double a = 5.1234567;
    int b = a; //Nein, hier findet kein Datenverlust statt...
    

    ach, das meint ihr. naja, so'n 'floor für arme' musste schon absichtlich programmieren und 'ne warnung gibts obendrein. solche dinge (ob gewollt oder ungewollt) sind offensichtlicher, als ein operator<<, der meistens richtig funktioniert, aber wenn man pech hat, einem hinterhältigerweise 'nen pointer auf ein bit zusammenstaucht.

    asc schrieb:

    +fricky schrieb:

    asc schrieb:

    Ich sehe es zwar auch so, das die Verbreitung von C++ zurück geht (dies gilt aber auch für C)...

    ich sehe keine anzeichen für einen rückgang von C. C hat sich im lowlevel-bereich sehr stark etabliert.

    Aber selbst dieser Markt ist im Wandel und Außerhalb vom Lowlevel-Bereich sind die Stellen nach meiner Erfahrung für C und C++ im Rückgang...

    klar, C im highlevel-bereich ist schon länger tot. C++ wird in absehbarer zeit, was den highlevel-bereich angeht, wohl ebenfalls beigesetzt werden. im gegensatz zu C++ hat C aber den lowlevel-sektor fest in seiner hand. auf dem gebiet würde ich nicht so schnell mit einen dahinscheiden von C rechnen.

    asc schrieb:

    +fricky schrieb:

    aber bevor irgendeine andere sprache C von seinem thron stossen kann, müssen noch 'ne menge bits den bus runterfliessen.

    TIOBE Programming Community Index for July 2009
    Auf dem Thron befindet sich C jedenfalls schon seit geraumer Zeit auf vielen Statistiken nicht mehr...

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

    Bashar schrieb:

    Was glaubst du eigentlich, was C tut, wenn du einen long zu einem float konvertierst? Oder zu einem char, oder einem bool?

    C tut das, was ich von ihm will. cout<< mit 'nem volatile int* tut etwas, das ich nicht will, obs mir nun das ergebnis von if(p!=0) oder einen cast nach bool anzeigt, ist doch nebensächlich, wenn's falsch ist.
    🙂


Anmelden zum Antworten