Welche Vorteile hat C, was kann man an C loben?
-
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.