int * i; oder int * i; oder int * i; [geschlossen]

Kommentare

Antwort

Wenn Sie schreiben:

int* i, j, k; 

Sie schlagen irreführend vor, dass alle i, j und k Zeiger auf int sind.

Ich behaupte also, es ist besser, das * an die Variable anzuhängen Name.

Kommentare

  • Und ich ' würde int * i; ist nur deshalb kein Konkurrent, weil es auf den ersten Blick wie eine Multiplikation aussieht.
  • +1, weil ich ' dieses Szenario vorher nicht berücksichtigt habe.
  • " Sie schlagen irreführend vor, dass alle i, j und k Zeiger auf int sind. " Es sei denn, Sie ' Schreiben Sie C # neu, wobei int* als Typ angesehen wird und int* i, j zwei Zeiger deklariert. Die Frage kann als unvollständig angesehen werden – sie hängt von der Sprache ab, in der Sie ' verwenden, welche Stile sinnvoll sind. In CI folgen Sie int *x, in C # mache ich etwas anderes.
  • @Joren: Entschuldigung, da ich kein C # -Programmierer bin, habe ich einfach angenommen, indem ich mir das Codefragment in angesehen habe Die Frage war C oder C ++.
  • Ich denke, es ist durchaus vernünftig anzunehmen, dass es C oder C ++ ist, es sei denn, C # wird ausdrücklich erwähnt. Zeiger werden in C # nicht sehr oft angezeigt.

Antwort

Ich bevorzuge int* i weil i den Typ „Zeiger auf ein int“ hat und ich denke, dies macht es mit dem Typsystem einheitlich. Natürlich tritt das bekannte Verhalten auf, wenn versucht wird, mehrere Zeiger in einer Zeile zu definieren (dh das Sternchen muss vor jedem Variablennamen stehen, um einen Zeiger zu deklarieren), aber ich deklariere Zeiger einfach nicht auf diese Weise. Ich denke auch, dass es „ein schwerwiegender Fehler in Sprachen im C-Stil ist.

Kommentare

  • Auch ich folge dieser Konvention. Aus dem gleichen Grund.
  • Wenn ich persönlich ' mehrere Zeiger in meinem Code deklariere, behandle ich dies als Codegeruch. Ich sollte ' nicht so viele Zeiger benötigen; und normalerweise ' t. Das Problem mehrerer Deklarationen in einer einzelnen Zeile taucht also in keinem Code auf, den ich schreibe: Eine Deklaration pro Zeile.
  • Das Problem dabei ist, dass der Typ kein " Zeiger auf ein int ". C (und C ++) haben keinen ' keinen Zeigertyp. Es ist ein Zeiger auf einen Speicherblock vom Typ int.
  • Ich würde argumentieren, dass *i den Typ .
  • @Billy: Wenn ja, habe ich ' diese Verwirrung in 12 Jahren des Versuchs, Standardese zu verstehen, zu analysieren und zu erklären, noch nie gesehen . " Der Zeiger auf ein int " ist ein vollkommen gültiger Typ in C und C ++.

Antwort

Für C, wo wir uns nicht stark auf Typen konzentrieren, bevorzuge ich:

int *i;

Da der Schwerpunkt auf dem int liegt, nicht auf dem Zeiger. Was ist der int? *i ist der int.

Kommentare

  • Guter Punkt. Mit Zeigern können Sie Stellen Sie sich den Start als Teil des Namens vor. Wenn Sie beispielsweise int i = 5 haben, verwenden Sie, um den Wert von i zu erhalten den Namen i. Wenn Sie int *i; *i = 5 haben, verwenden Sie ebenfalls *i.
  • Ich lese int * i als: * i ist ein int. Daher ist i ein Zeiger auf int.Variablendeklarationen in C verwenden Typausdrücke, int und * sind nur Operatoren. int * i analysiert als int (* (i)) und wird so interpretiert, dass i einen Zeiger auf eine Ganzzahl hat. char * p [] wird als char (* ([] (p))) analysiert (weil [] eine höhere Priorität als * hat) und bedeutet: p hat das Typ-Array des Zeigers auf char.
  • For Aus diesem Grund haben sie sich entschieden, * neben die Variable zu schreiben, weil * ein Operator ist, der darauf angewendet wird.
  • Ich scheine dies auch zu bevorzugen – hält die Typdefinition sauberer. Außerdem macht das, was Giorgio geschrieben hat, auch für mich Sinn, und Dennis hat in seiner Argumentation etwas Ähnliches geschrieben.

Antwort

Ich bevorzuge seit Jahren int* i. Es gibt jedoch ein starkes Argument für int *i, da Sie bei Verwendung des vorherigen Stils immer noch die Mehrfachdeklarationsregel beachten müssen:

int* a, *b; // not int* a, b; 

Da Sie sich an diese Regel erinnern müssen, gewinnen Sie nicht einfach – aber ich würde auch nicht sagen, dass sie komplexer ist. Das Vermeiden mehrerer Deklarationen in einer Zeile ist nur eine andere Möglichkeit, um zu sagen, dass Sie sich an diese Regel erinnern Der Unterschied zwischen den beiden Stilen ist umstritten.

Selbst wenn ich ihn verwende, fühlt es sich ein bisschen albern an, so zu tun, als würde die Syntax der C-Deklaration anders funktionieren als sie, indem das Sternchen eher neben den Typ gesetzt wird als die Variable, an die es syntaktisch gebunden ist.

Ich kaufe mich nicht in diese ein betont den Zeigertyp (für i), während der andere den int-Typ betont (für *i), aber das kann sein, dass es nach 15 Jahren C- und C ++ – Verwendung nur ist , wenn ich es mir anschaue, ohne darüber nachdenken zu müssen Die meisten Anfänger, die diese Frage stellen, können dies noch nicht.

Auch wenn ich es vorziehe, finde ich es nicht unangenehm, Code im anderen Stil zu lesen / schreiben. Konsistenz, bla bla bla.

Sie müssen nicht einmal int * i erwähnen.

Antwort

Ich bevorzuge die erste. Es ist natürlich, dass ein Zeiger Teil des Typs ist.

Da ich C # verwende, werden Typen intuitiver behandelt als C, sodass es kein Problem gibt, mehrere Zeiger in derselben Anweisung zu deklarieren:

int* a, b, c; // three pointers 

Antwort

Ich bevorzuge int* i (C ++ – Stil).
Aufgrund der daraus resultierenden visuellen Mehrdeutigkeit (int* i, j) vermeide ich es, mehrere Variablen in einer Anweisung zu deklarieren.

Siehe auch Bjarne Stroustrups häufig gestellte Fragen zu C ++ – Stil und Technik für Rationales.

Antwort

Wenn Sie mehrere Variablen deklarieren möchten, das Sternchen jedoch nicht wiederholen möchten:

template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3; 

(Wie Sie in der Strukturvorlage sehen können, Ich bevorzuge den int* i -Stil.)

Und hier ist eine allgemeinere Lösung:

template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3; 

Dieser funktioniert mit jedem „problematischen Typ“, zum Beispiel Arrays und Referenzen:

Kommentare

  • omg, c ++ zeigt mir immer etwas Neues :). Danke!
  • OMG, C ++ ist schrecklich! typedef int* int_ptr hätte den Trick gemacht. Sicher, ich muss ein neues typedef für verschiedene Zeigertypen deklarieren, aber in der Praxis wie viele werden das sein? Höchstens acht?
  • @benzado In der Praxis benötigen Sie ' weder das typedef noch einen der ausgefallenen Tricks, die ich demonstriert habe, da keine vernünftige Person mehrere Variablen deklariert in einer Zeile. Trotzdem interessant.
  • Ich weiß, ich habe mehr über die Tendenz von C ++ – Programmen gesprochen, Sprachfunktionen zu verwenden, nur weil sie dies können.
  • @benzado: !!! Ich habe das so oft gesehen!

Antwort

Ich würde mich für da der erste Teil den Variablentyp (Zeiger auf int) bezeichnet, während der zweite Teil den Namen bezeichnet (i). Das würde für mich keinen Sinn ergeben Der Typ ist int und der Name ist *i. Außerdem sieht int * i; für mich ein bisschen nach Multiplikation aus.

Kommentare

  • C-Deklarationssyntax ist nicht ' ist in dieser Hinsicht nicht konsistent, da Typinformationen leicht nach dem Bezeichner kommen können: Arrays sind das klarste Beispiel.
  • @Roger: Ich weiß, aber diese Frage war speziell über eine einzelne Variablendeklaration und nichts anderes.
  • Ich denke, dass ' ein bisschen viel hinein liest. 🙂 So wie ich die Frage verstehe, fragt ', welchen Stil Sie überall verwenden.
  • @Roger: Sie ' hat wahrscheinlich recht, aber mein Ziel war es, die Frage des OP ' zu beantworten: " Was ist Ihre bevorzugte Methode zum Deklarieren? ein Zeiger? ".Offensichtlich steht es jedem frei, sich das in der Frage vorgestellte Thema an der Grenze anzuschauen, und es wird hier sogar empfohlen. Als jemand, der ' nicht in C / C ++ entwickelt, hatte ich das Gefühl, dass dies zu weit von meinem Fachgebiet entfernt sein würde.

Antwort

In Deklarationen, die ich int * i; verwende, lesen Sie sie als i is a pointer to an integer.

Der Zeiger trägt sowohl zum Typ als auch zur Variablen bei, sodass er sich in der Mitte befinden sollte.

Es ist eine gute Sache, zu vermeiden, dass mehrere Dinge in derselben Zeile deklariert werden: int * i, j;

Antwort

In C gibt es keine Zeigertypen! Also, „int * „bedeutet nichts. Das Sternchen ist immer an das Element gebunden, das rechts davon geschrieben ist, es gehört zu dem Element, das rechts davon steht.“ * i „ist ein int. Und weil * i ein int ist, folgt, dass i ein ist Zeiger auf int. Das ist die Logik dahinter und deshalb ist „int * i“ die einzig mögliche Lösung. Alles andere ist eine Illusion (die in den meisten Fällen vom Compiler automatisch korrigiert wird). In C ++ und C # ist das etwas anderes. Aber für C gibt es nur eine Bibel: „Dennis M. Ritchie: Die C-Programmiersprache“. Dennis (RIP!) Schrieb es: „int * i“. Es besteht keine Notwendigkeit dazu Stellen Sie dies in Frage.

Kommentare

  • " In C " – Woher haben Sie diese Idee? int* ist ein Zeigertyp.

Antwort

Ich verwende tatsächlich alle drei Konventionen unter bestimmten Umständen. Auf den ersten Blick scheine ich inkonsistent, aber …

  • int * wenn der Bezeichner nicht vorhanden ist, um visuell zu bestätigen, dass der Name nicht vorhanden ist.
  • int* intptr auf typedef s und ähnlichen Deklarationen, um visuell zu verstärken, dass es Teil des Typs ist. Ähnliches gilt für Funktionszeigerdeklarationen: (int* (*foo)(int))
  • int *identifier und class &identifier auf Funktionsparameter, um visuell zu verstärken, dass der Parameter möglicherweise ein sogenannter „out“ -Parameter ist.
  • const int * const * const, wenn ich cv verwende Qualifizierer.
  • int * foo; zu lokalen Deklarationen.

Ich denke, ich bin etwas visuell orientiert.

Antwort

Ich verwende int *i, da es jedoch einfacher ist zu erkennen, dass es sich um einen Zeiger handelt Ich glaube nicht, dass es wirklich wichtig ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.