'int* x' 'int * x' oder 'int *x' ?



  • Noch zur Ergänzung ... 🙄

    Der Grund für die Verwirrung ist wohl, dass in C Typausdrücke nicht vorgesehen sind. Aus vielen anderen Sprachen kennt man es, dass man überall dort, wo man vordefinierten Typen (int usw.) hinschreiben kann, auch kompliziertere Typausdrücke verwenden kann, um so etwas wie "Array von Zeigern auf int" zu beschreiben.

    In C gibt es das aber allgemein nicht. Typausdrücke wie int*[5] (fünfelementiges Int-Zeiger-Array) sind zwar in bestimmten Zusammenhängen (Funktionsparameterlisten, Cast-Ausdrücke, sizeof) erlaubt, aber nicht da, wo man sie am ehesten brauchen könnte, nämlich bei Deklarationen. Deklarationen hätten dann einfach die Form Typausdruck Bezeichner, z.B.

    int[5] array;            // stattdessen: int array[5];
    int*[5] pointerarray;    // stattdessen: int *pointerarray[5];
    int(char*,char*) strcmp; // stattdessen: int strcmp(char*,char*);
    

    Jetzt kann man natürlich fragen, warum das in C nicht erlaubt ist, und ob es nicht in die Sprache eingebaut werden sollte.

    Wenn es die einzige Möglichkeit für Deklarationen wäre und man die jetzige Syntax ganz abschaffen würde, würde das (abgesehen vom Kompatibilitätsbruch mit sämtlichem existierenden C-Code) zu anderen Unschönheiten führen, z.B. dass bei Funktionsdefinitionen die Parameternamen nicht direkt neben ihren Typen stehen.

    Und wenn man es einfach zusätzlich erlauben würde, hätte man zwei verschiedene Möglichkeiten, um die selbe Sache zu machen. Das würde gegen den "Spirit of C" gehen, und irgendeinen praktischen Nutzen hätte es ohnehin nicht.

    Also ist die Syntax schon in Ordnung so, wie sie ist.

    Was nun die Frage int *x vs. int* x betrifft: IMHO ist die erste Möglichkeit die einzig sinnvolle. Die zweite sieht so aus, als ob int* ein Typausdruck ("Zeiger auf int") wäre, den man benutzt, um eine Variable dieses Typs zu deklarieren. Das ist aber nunmal nicht der Fall, es gibt dort keinen solchen Typausdruck. Das Sternchen gehört syntaktisch zum x. Und das auch nicht nur, weil irgendjemand mal gedankenlos die Grammatik so definiert hat und sich an der Stelle nicht entscheiden konnte, was besser ist, sondern weil es sich aus dem grundlegenden Aufbau von Deklarationen in C so ergibt.

    Aber natürlich kann jeder Leerzeichen dahin setzen wo er will. 🙂



  • So sehen Deklarationen richtig schön aus 👍



  • ich benutze jedenfalls immer letzteres, aber dann wiederum bin ich auch c- und kein c++ programmierer.



  • namespace invader schrieb:

    int[5] array;            // stattdessen: int array[5];
    int*[5] pointerarray;    // stattdessen: int *pointerarray[5];
    int(char*,char*) strcmp; // stattdessen: int strcmp(char*,char*);
    

    Jetzt kann man natürlich fragen, warum das in C nicht erlaubt ist, und ob es nicht in die Sprache eingebaut werden sollte.

    Vielleicht weil es blöd aussieht, sinnlos und zudem unverständlich ist. Die Typausdrücke, die man z.B. in Casts verwendet, sind ja einfach Deklaratoren ohne Bezeichner. Das heißt, man muss schonmal die übliche Deklaratorsyntax drauf haben, um diese Ausdrücke überhaupt lesen zu können. Dazu kommt, dass das Parsen (für den Menschen) ohne den Bezeichner in der Mitte auch nicht gerade erleichtert wird.
    In Java und C# kommt man ja nur deshalb mit dieser Syntax aus, weil es für Deklaratoren nicht so schrecklich viele Möglichkeiten gibt, im Grunde gibt es nur den [] Typkonstruktor.

    Aber natürlich kann jeder Leerzeichen dahin setzen wo er will. 🙂

    👍



  • Bashar schrieb:

    namespace invader schrieb:

    Jetzt kann man natürlich fragen, warum das in C nicht erlaubt ist, und ob es nicht in die Sprache eingebaut werden sollte.

    Vielleicht weil es blöd aussieht, sinnlos und zudem unverständlich ist.

    Das liegt immer im Auge des Betrachters. Man muß nur lange genug mit einer typenlosen Sprache hantieren, dann kommt einem das gesamte Typengedöns sinnlos, unverständlich und blöd aussehend vor. 🤡

    Nun gut, C ist sowohl typisiert als auch standardisiert, damit erledigen sich Fragen, warum das niemand ändert, weitgehend.
    Aber die Existenz dieses Threads (4 Seiten, quasi ohne Trolling) zeigt auch, daß bezüglich dieser Thematik eine gewisse Verunsicherung herrscht, auch bei Leuten, die mehr als "hello world" hinbekommen haben. Das ist absolut C- typisch.

    Deswegen gehört so was eigentlich auf's Wesentliche destilliert in die FAQ, aber da macht ja schon länger keiner mehr was ... 😞

    EDIT: Upps, sind ja schon fünf Seiten ... 🙄



  • pointercrash() schrieb:

    ...daß bezüglich dieser Thematik eine gewisse Verunsicherung herrscht...

    dabei gibts viele tutorials im internet zum thema: wie c-declarions entziffern.
    ausserdem gibts ein tool, das deklarationen in lesbaren text umwandelt, bestimmt auch mit sprachausgabe.
    🙂



  • +fricky schrieb:

    dabei gibts viele tutorials im internet zum thema: wie c-declarions entziffern.

    Jo, aber meist auf Englisch. Für viele besteht da eine gewisse Sprachbarriere, weil sie zwar logisch denken können, aber mit Fremdsprachen nicht klarkommen.

    +fricky schrieb:

    ausserdem gibts ein tool, das deklarationen in lesbaren text umwandelt, bestimmt auch mit sprachausgabe. 🙂

    Je nu, laß' mal sehen ... spricht dat Dingens auch Deutsch?
    Davon abgesehen ist ein Abzählreim für's Verständnis meist wertvoller, als ein Automat, der mir das auflöst und vorbetet - das wäre eher was für Autisten. 😃



  • pointercrash() schrieb:

    +fricky schrieb:

    ausserdem gibts ein tool, das deklarationen in lesbaren text umwandelt, bestimmt auch mit sprachausgabe. 🙂

    Je nu, laß' mal sehen ... spricht dat Dingens auch Deutsch?

    ich weiss nicht mehr, wo's das programm gab. kann sein, dass es bei free-BSD dabei war. das machte text aus z.b. int *(*f(void))(int); 'f is a function that takes one integer argument and returns a pointer to function returning a pointer to an int', oder so ähnlich. auf deutsch war's natürlich nicht, computerkram ist doch immer englisch, weisste doch.
    🙂



  • cdecl ist so ein Programm, bei Ubuntu im Paket cutils.


Anmelden zum Antworten