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



  • Wie ich bereits sagte, es wäre schon mal viel getan, wann man die C Kompatibilität verwirft.

    Warum? Was sollte schlechtes daran sein?



  • net schrieb:

    äääh, ich hoffe du spielst jetzt nicht auf sowas wie 'const int a = 2' an.

    Yep. a ist ein konstanter Ausdruck. Du kannst damit also Sachen machen wie

    char buf[a];
    

    In C geht das nicht. Oder zumnidest ist es dann ein VLA, afaik.



  • groovemaster schrieb:

    @Daniel E.
    Vielleicht einfach mal Klappe halten, wenn man nix zu sagen hat. Ist zwar nicht meine Art, aber solche unqualifizierten und arroganten Sprüche kannst du dir sparen.
    Btw, ich rede nicht nur über void*, sondern auch über ..._cast, const-correctness, malloc/new, etc.pp. Vor Gebrauch das nächste mal also bitte Gehirn einschalten. 😉

    Das hat nichts mit dem Typensystem zu tun, das in C und C++ bis auf die void-Zeiger-Wandlung haarscharf das gleiche ist (sofern C bzw. C++ die entsprechenden Typen kennt, natürlich). Ich schicke dir gerne den aktuellen C- sowie den C++-Standard per Mail zu, dann kannst Du dich selbter von diesen unqualifizierten Sprüchen überzeugen.

    Guck, ProgChild erzählt schon wieder den gleichen, pardon. Schmarrn, da kann einem langsam echt der Hut hochgehen.



  • groovemaster schrieb:

    net schrieb:

    äääh, ich hoffe du spielst jetzt nicht auf sowas wie 'const int a = 2' an.

    Yep. a ist ein konstanter Ausdruck...

    nur scheinbar. ein '(int)&a = ...;' oder 'const_cast' könnte das ändern. #defines sind gegen solche schweinereien immun.



  • Groovemaster schrieb:

    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

    Das ist in meinen Augen Schwachsinn.
    c++ ist eine neue Sprache die den Vorgänger beinhaltet und in sich hat.

    Das "C-Sprachpaket" wurde um OOP erweitert.
    Klar dass wenn man die OOP features benutzt die alte Methode nicht mehr verwendet.
    Was strikt zu trennen ist, ist die Art der Programierung.
    Auf jedenfall sind sie nicht so strikt zu trennen wie ich glaube dass du meinst.



  • net schrieb:

    groovemaster schrieb:

    net schrieb:

    äääh, ich hoffe du spielst jetzt nicht auf sowas wie 'const int a = 2' an.

    Yep. a ist ein konstanter Ausdruck...

    nur scheinbar. ein '(int)&a = ...;' oder 'const_cast' könnte das ändern. #defines sind gegen solche schweinereien immun.

    Jetzt weiss ich auch woher groovemasters sig kommt 😉

    C-Casts in C++ stinken - basta

    🤡



  • user89 schrieb:

    Groovemaster schrieb:

    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

    Das ist in meinen Augen Schwachsinn.
    c++ ist eine neue Sprache die den Vorgänger beinhaltet und in sich hat.

    Und das in abgeänderter Form. Das hatten wir aber schon inf mal.



  • belehrt mich wenn das nicht stimmt aba is wie ein Insekt, dass sich verpuppt.

    Am Anfang konnte es nur kriechen, dann bekam es Flügel.

    Klar dass die die Fliegen wollen nur noch die Flügel verwenden.

    Trotzdem landet und steht das Tier auf den Beinen das es vorher hatte.

    und nur weil es Flügel hat muss es das Kriechen ja ned verlernen. bzw nur in der Luft bleiben.



  • es verwendet das was es gerade braucht und auch die neue verwendet die beine des "alten Körpers"



  • Daniel E. schrieb:

    Das hat nichts mit dem Typensystem zu tun

    Hast Recht. ..._cast ist ja dafür da, um lecker Pizza zu bestellen. Hatte ich ganz vergessen. Und das Ergebnis von new kann natürlich auch an jeden Zeiger zugewiesen werden wie bei malloc. 🙄
    Offenbar heisst für dich Typsystem, implizite Umwandlung. Für mich nicht. Da gibt es noch jede Menge mehr. Also war deine Bemerkung unpassend, und zudem überheblich. 😉

    Daniel E. schrieb:

    Ich schicke dir gerne den aktuellen C- sowie den C++-Standard per Mail zu

    Brauchst du nicht, habe ich bereits. Lies sie, und du wirst sehen, dass es mehr Unterschiede als void* gibt.

    net schrieb:

    nur scheinbar. ein '(int)&a = ...;'

    Was heisst scheinbar? Ein Compiler darf hier a im Speicher ablegen, um eine Adresse zurückzuliefern. Das ändert trotzdem nichts daran, dass a ein konstanter Ausdruck ist.

    net schrieb:

    oder 'const_cast'

    Führt zu undefiniertem Verhalten. Was im Übrigen bei deinem Cast oben auch der Fall ist.

    user89 schrieb:

    Das ist in meinen Augen Schwachsinn.
    c++ ist eine neue Sprache die den Vorgänger beinhaltet und in sich hat.

    Nein, C und C++ haben lediglich eine gemeinsame Teilmenge. Wir befinden uns schliesslich nicht mehr im Jahre 1979.
    Und dass das Design einer C++ Anwendung von der einer C Anwendung abweicht, braucht hier wohl nicht weiter erwähnt werden. Aber es gibt halt auch ganz triviale semantische Unterschiede, wie Casts oder

    // c
    void foo(void);
    // c++
    void foo();
    

    Und das geht zB in der stdlib weiter. Wusstest du eigentlich, dass es in C++ keine Funktionen wie sinf oder cosf gibt?
    Alle diese kleinen bis grossen Unterschiede sind dann doch recht zahlreich.
    Daher ➡ strikt trennen!



  • groovemaster schrieb:

    Daniel E. schrieb:

    Das hat nichts mit dem Typensystem zu tun

    Hast Recht. ..._cast ist ja dafür da, um lecker Pizza zu bestellen. Hatte ich ganz vergessen. Und das Ergebnis von new kann natürlich auch an jeden Zeiger zugewiesen werden wie bei malloc. 🙄
    Offenbar heisst für dich Typsystem, implizite Umwandlung. Für mich nicht. Da gibt es noch jede Menge mehr. Also war deine Bemerkung unpassend, und zudem überheblich. 😉

    Herrje, C++ enthält das gesamte Typensystem als Subset, außer eine in C eingefügte Lücke, die Wandlung von void-Zeigern, für die es in C einen guten Grund gibt. Ansonsten behandelt die Sprache C++ Typen genau so streng oder nicht streng wie C, ich frage mich, was daran so schwer zu kapieren ist.

    edit: Und was ein *_cast mit unserem Thema zu tun hat, weiß ich auch nicht. Ich habe nicht behauptet, die Typsysteme seien identisch (da hätte man auch einfachere Gegenbeispiele finden können: class zB), sondern nur, daß sie, bis auf die obige Ausnahme, gleich streng sind.

    Brauchst du nicht, habe ich bereits. Lies sie, und du wirst sehen, dass es mehr Unterschiede als void* gibt.

    Be-wei-sen, be-wei-sen.



  • Daniel E. schrieb:

    Brauchst du nicht, habe ich bereits. Lies sie, und du wirst sehen, dass es mehr Unterschiede als void* gibt.

    Be-wei-sen, be-wei-sen.

    Zum Beispiel char*. Hier castet C automatisch (Auch wenns vielleicht schwachsinn ist). C++ kann das nicht.

    #include <stdio.h>
    #include <malloc.h>
    
    void hallo(int num) {
        printf("Hallo %d\n", num);
    }
    
    int main (int argc, char* argv[]) {
        char* p;
        p = malloc(4);
    
        hallo(p); // C++ fehler
    
        free(p);
    
        return 0;
    }
    


  • ProgChild schrieb:

    Daniel E. schrieb:

    Brauchst du nicht, habe ich bereits. Lies sie, und du wirst sehen, dass es mehr Unterschiede als void* gibt.

    Be-wei-sen, be-wei-sen.

    Zum Beispiel char*. Hier castet C automatisch (Auch wenns vielleicht schwachsinn ist). C++ kann das nicht.

    Nein. Auch wenn *dein* C-Compiler das Programm übersetzt -- die Sprache kennt nicht mal malloc.h.

    Guck dir mal einen halbwegs kompatiblen Compiler an, sagen wir, http://www.comeaucomputing.com/tryitout/ Der läßt auch im C-Modus Dinge wie 'int *p; char *q=p;' nicht zu, eben strikt nach Norm.

    Der Nächste bitte 🙂



  • @Daniel E.
    Sinnlos mit dir zu diskutieren, da du sowieso alles besser weisst. Casts haben bei dir also nichts mit dem Typsystem zu tun? Ehrlich gesagt ist diese Argumentation so traurig, wie sie an der Realität vorbei geht. Ich habe jetzt keine Lust, alle Unterschiede aufzuführen. Das kannst du ja selber machen. Hier noch ein Beispiel für dich:

    int (*a)();
    	int (*b)(int);
    	a = b;
    

    Oder wenn wir schon bei konstanten Ausdrücken sind, wie wäre es damit

    const int a = 0;
    	char* b = a;
    

    Aber nein, hast ja Recht. Hat alles nix mit dem Typsystem zu tun. 🙄



  • groovemaster schrieb:

    Sinnlos mit dir zu diskutieren, da du sowieso alles besser weisst.

    Ja, in dem Fall weiß ich es wirklich besser. Das C++-Typensystem ist nicht strenger als das C-Typensystem, sieht man von der Wandlung von void-Zeigern ab.

    Casts haben bei dir also nichts mit dem Typsystem zu tun?

    Doch, natürlich, aber die haben als Argument in einer Diskussion über das C-C++-Subset, worum es hier die ganze Zeit geht, nichts verloren.

    Ehrlich gesagt ist diese Argumentation so traurig, wie sie an der Realität vorbei geht. Ich habe jetzt keine Lust, alle Unterschiede aufzuführen. Das kannst du ja selber machen. Hier noch ein Beispiel für dich:

    int (*a)();
    	int (*b)(int);
    	a = b;
    

    Netter Versuch, aber 'int (*a)()' ist in C leider syntaktisch was anderes als in C++ (hat einen anderen Typ). Die C++-Interpretation des Quelltextes (die man in C 'int (*a)(void); ... b = a;' schreiben würde) sollte nicht durch einen standardkonformen Compiler wandern.

    Oder wenn wir schon bei konstanten Ausdrücken sind, wie wäre es damit

    const int a = 0;
    	char* b = a;
    

    Naja, das ist kein gültiges C99 (geht auch nicht durch den Compiler), hat also in der Diskussion nichts verloren.

    Nochmal, bitte.



  • Daniel E. schrieb:

    Doch, natürlich, aber die haben als Argument in einer Diskussion über das C-C++-Subset, worum es hier die ganze Zeit geht

    😕 In welcher Höhle lebst du denn? Darum geht es überhaupt nicht.
    Aber um es nochmal verständlich für _dich_ zu schreiben, es geht um die Vorteile von C und mein Statement dazu, dass ich bis auf den besseren Support keinen sehe, weil C++ ua eine striktere Typisierung hat. Und selbst wenn das nur void* wäre, dann ist das immer noch strikter. 😉

    Daniel E. schrieb:

    Netter Versuch, aber 'int (*a)()' ist in C leider syntaktisch was anderes als in C++

    🙄 Es ist syntaktisch das Gleiche, der Unterschied ist semantischer Natur. Und darum ging es ja. C++ kennt keine "Funktionen mit unbestimmten Parametern". Dehalb ➡ strikter. Man kann sich mit C++ durch besagten Code also kein Bein wegschiessen, mit C schon.

    Daniel E. schrieb:

    Naja, das ist kein gültiges C99 (geht auch nicht durch den Compiler), hat also in der Diskussion nichts verloren.

    Hehe, du bist echt ein Troll. Dass das kein gültiges C ist, ist mir schon klar. Das war ja gerade der Witz an der Geschichte. C++ ist in der Lage, einen konstanten integralen Ausdruck, was 0 ist, in einer Variable zu speichern, und diesen entsprechend, zB für die Evaluierung zu einem Nullzeiger, verwenden. C kann das nicht, und macht daraus 'ne "normale" Konstante. Und wiedderum ➡ strikter, da in C++ hier keine Informationen zum Typ des Ausdrucks verloren gehen, auch wenn sich das syntaktisch nicht äussert.

    Wie wär's, wenn du nicht einfach mal deine sinnlosen Beiträge stecken lässt. Bisher hast du nur rumgestänkert, Müll geschrieben (ok, der Beitrag von ProgChild ist kein gültiges C), nichts zum Thema beigetragen und ein höchst arrogantes Benehmen an den Tag gelegt. "Bitte abstellen!" 😉



  • groovemaster schrieb:

    Daniel E. schrieb:

    Doch, natürlich, aber die haben als Argument in einer Diskussion über das C-C++-Subset, worum es hier die ganze Zeit geht

    😕 In welcher Höhle lebst du denn? Darum geht es überhaupt nicht.
    Aber um es nochmal verständlich für _dich_ zu schreiben, es geht um die Vorteile von C und mein Statement dazu, dass ich bis auf den besseren Support keinen sehe, weil C++ ua eine striktere Typisierung hat. Und selbst wenn das nur void* wäre, dann ist das immer noch strikter. 😉

    Richtig, diese Ausnahme habe ich genannt. Sonst gibt es keine.

    Das gesamte Zeigerhandling, der Umgang mit Integerausdrücken, Const-Correctness &cet. ist ist C++ genau so steng oder nicht streng wir in C. Warum Du immer einen *_cast anschleppst um zu zeigen, daß C++ strenger ist, bleibt der geneigten Leserschaft leider verborgen.

    Daniel E. schrieb:

    Netter Versuch, aber 'int (*a)()' ist in C leider syntaktisch was anderes als in C++

    🙄 Es ist syntaktisch das Gleiche, der Unterschied ist semantischer Natur. Und darum ging es ja. C++ kennt keine "Funktionen mit unbestimmten Parametern".

    Also hat es in der Diskussion nichts verloren, weil es gleiche Syntax mit unterschiedlicher Semantik belegt ist, also andere Typen anders heißen, nicht, gleiche Typen unterschiedlich behandelt werden.

    Dehalb ➡ strikter.

    Nein, ein Unterschied in der Schreibweise um etwas zu sagen: Der C-Code ist korrekt und sagt etwas vollständig anderes als der C++-Code, genau wie 'int new = 23' oder "sizeof 'a' == sizeof 3"auch nicht als Beispiel dafür herhält, daß C strenger oder weniger streng ist als C++. Scheint schwierig zu verstehen zu sein.

    Dass das kein gültiges C ist, ist mir schon klar. Das war ja gerade der Witz an der Geschichte. C++ ist in der Lage, einen konstanten integralen Ausdruck, was 0 ist, in einer Variable zu speichern, und diesen entsprechend, zB für die Evaluierung zu einem Nullzeiger, verwenden. C kann das nicht, und macht daraus 'ne "normale" Konstante. Und wiedderum ➡ strikter, da in C++ hier keine Informationen zum Typ des Ausdrucks verloren gehen, auch wenn sich das syntaktisch nicht äussert.

    Aha, mal sehen, ob ich das richtig verstehe:

    Wenn 'const int a = 3; char *p = a' in C ginge und in C++ nicht, dann wäre C natürlich weniger streng als C++, wenn C++ 'const int a = 0; char *p = a;' nimmt, dann ist es strenger? Was'n Quark. EOD meinerseits, mit Merkbefreiten ohne Diskussionsinteresse, die nur damit beschäftigt sind, mit Arroganz zu unterstellen, brauche ich nicht zu diskutieren.



  • ich finde c ist gut geeignet zur lösung für überschaubare probleme. man kann mal eben schnell mit ein paar zeilen executables produzieren, die viel tun und 20kb klein sind. c ist schnell und maschinennah, auch finde ich persönlich die syntax sehr intuitiv und überschaubar. dies kann je nach empfinden genauso für andere sprachen zutreffen. manche stehen halt auf basic, andere auf java - im endeffekt bei 1-mann-projekten doch fast nur geschmackssache oder?
    möglicherweise sind meine erfahrungswerte zu gering, um das wirklich treffend bewerten zu können, aber ich kann mir nicht vorstellen, dass treiber in java realisiert werden. und was wirklich große projekte (mehrköpfiges team, mehrjärige entwiklungszeit) angeht, kann ich mir vorstellen, dass dort c nicht mehr die erste wahl ist.
    ich denke auch, dass man c nicht mehr im reinen konsolenkontext sehen sollte. für mich als windows user bietet die WINAPI super möglichkeiten umfassende windowsapplikationen zu erstellen. somit ist c trotz der jahre die es auf dem buckel hat, immernoch ein modernes werkzeug das hervorragend funktioniert. und im endeffekt haben sich doch fast alle modernen sprachen bei c was abgeguckt, so dass man c kenntnisse doch als gute programmier-basics bezeichnen kann, oder nicht?

    also: c lernen -> auf jedenfall, ausschließlich in c programmieren -> geschmackssache

    ich finde c kann wirklich spass machen 🙂



  • Daniel E. schrieb:

    Das gesamte Zeigerhandling, der Umgang mit Integerausdrücken, Const-Correctness &cet. ist ist C++ genau so steng oder nicht streng wir in C. Warum Du immer einen *_cast anschleppst um zu zeigen, daß C++ strenger ist, bleibt der geneigten Leserschaft leider verborgen.

    Und wo mach ich das? Das war lediglich ein Beispiel. Dass du das natürlich nicht verstehen wollen können tust, ist mir schon klar. Das ändert aber nichts an der Tatsache, dass es zum Typsystem von C++ gehört.

    Daniel E. schrieb:

    Nein, ein Unterschied in der Schreibweise um etwas zu sagen: Der C-Code ist korrekt und sagt etwas vollständig anderes als der C++-Code, genau wie 'int new = 23' oder "sizeof 'a' == sizeof 3"auch nicht als Beispiel dafür herhält, daß C strenger oder weniger streng ist als C++. Scheint schwierig zu verstehen zu sein.

    Du kapierst es echt nicht, oder? Ich dachte ja erst, du stellst dich so dumm, aber mittlerweile bin ich mir da nicht mehr so sicher.
    Ich sage doch nicht, dass aufgrund gleicher Syntax bei unterschiedlicher Semantik C++ strikter ist. C++ ist deshalb strikter, weil es keine Funktionen mit unbestimmten Parametern zulässt. Syntax spielt hier überhaupt keine Rolle.

    Daniel E. schrieb:

    Wenn 'const int a = 3; char *p = a' in C ginge und in C++ nicht, dann wäre C natürlich weniger streng als C++, wenn C++ 'const int a = 0; char *p = a;' nimmt, dann ist es strenger?

    Du hast echt eine seltsame Vorstellung von strikterer Typisierung. Das hat nicht zwangsläufig was damit zu tun, dass etwas hier geht, was woanders nicht geht.
    C++ behandelt 0 und a gleichwertig. C macht das nicht. Deshalb bindet C++ Typen strenger.

    Daniel E. schrieb:

    Was'n Quark. EOD meinerseits, mit Merkbefreiten ohne Diskussionsinteresse, die nur damit beschäftigt sind, mit Arroganz zu unterstellen, brauche ich nicht zu diskutieren.

    Dass ich dir Arroganz unterstelle (bzw. auch Ignoranz), wundert dich? Dann solltest du dir vllt. nochmal deinen ersten Beitrag anschauen. Aber keine Sorge, ich bin nicht nachtragend. Ansonsten kann ich EOD nur begrüssen, da ich auch keine Lust mehr auf diesen Käse habe.
    Fakt bleibt für mich, um wieder auf das eigentliche Thema zurückzukommen, dass es im C und C++ Typsystem mehr Unterschiede als nur void* gibt. Und dass C++ dabei auf striktere Konventionen baut.



  • Amen.

    als folgerung aus diesem rumgezanke werde ich in zukunft threads dieser art sofort loeschen.


Anmelden zum Antworten