Ist es sinnvoll heute noch C++ anzufangen?



  • 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.
    🙂



  • +fricky schrieb:

    aber wie begegnet man mit RAII dem problem, wenn ein nicht-trivialer destruktor scheitert (was in der realität oft vorkommen kann, angenommen es gelingt nicht, eine TCP-verbindung zu schliessen, es kommt eine negative rückmeldung bei irgendeiner aktion, oder sowas)?

    Exakt so wie in jeder anderen Sprache auch, man muß eine Entscheidung treffen wie man weitermacht. Ignorieren, Fehler loggen oder das Programm abbrechen => abort.



  • Das sehe ich genauso wie +fricky.

    Mal ganz davon abgesehen, dass die besten Tage für C++ definitiv vorbei sind, ist die Sprache einfach auch verdammt unübersichtlich. Fremden C Code kann man, wenn man ein geübtes Auge dafür hat, sehr schnell überfliegen. Das geht bei C++ Code halt absolut gar nicht. C++ hat zu viele mächtige und schlecht umgesetzte Features, die obendrein noch viel zu oft falsch eingesetzt werden, die das Lesen und Warten von Fremdcode einfach zum puren Horror werden lassen.



  • Tippgeber schrieb:

    Wer noch nie in einer Sprache programmiert hat in der das Plus für Stringkonkatenation steht, aber schon einmal etwas theoretische Informatik mitbekommen hat wird da sofort an das Oder aus einem regulären Ausdruck denken und nicht daran, dass hier eine Konkatenation gemeint ist.

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



  • ~john schrieb:

    +fricky schrieb:

    aber wie begegnet man mit RAII dem problem, wenn ein nicht-trivialer destruktor scheitert (was in der realität oft vorkommen kann, angenommen es gelingt nicht, eine TCP-verbindung zu schliessen, es kommt eine negative rückmeldung bei irgendeiner aktion, oder sowas)?

    Exakt so wie in jeder anderen Sprache auch, man muß eine Entscheidung treffen wie man weitermacht. Ignorieren, Fehler loggen oder das Programm abbrechen => abort.

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

    ~john schrieb:

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

    nö, stringverkettung ist nicht assoziativ. wenn man die strings vertauscht, sieht das ergebnis anders aus.
    🙂



  • Invarianz gegen Vertauschung wäre Kommutativität.

    Assoziativität heißt invariant gegen Klammerung:

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


  • 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.)


Anmelden zum Antworten