Was ist die semantisch genaue Position für das kaufmännische Und in C++-Referenzen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Mäuse

Es ist ziemlich allgemein bekannt, dass Zeiger semantisch korrekt deklariert werden

int *x;

anstatt

int* x;

Das liegt daran, dass C sieht *x als int, nicht x als int-Zeiger.

Dies lässt sich leicht demonstrieren durch

int* a, b;

wo a ist ein int-Zeiger, während b ist ein int.

Es gibt mindestens 5 doppelte Fragen zu Stack Overflow, die dieses Problem für Zeiger erörtern. Aber was ist mit Referenzen?

  • Leerzeichen spielen keine Rolle, da sie während der Lexikphase übersprungen werden. Sie können null oder mehr Leerzeichen vor und null oder mehr Leerzeichen nach dem Sternchen haben. Beide deklarieren x als Zeiger, nicht als Referenz.

    – Thomas Matthäus

    31. März 2014 um 16:34 Uhr

  • @mic_e: Das ist exakt wozu dieser Knopf da ist. Wir haben sogar einen Post auf Meta, der es demonstriert: meta.stackexchange.com/questions/132886/… Leider wird dies oft als Versuch angesehen, mehr Wiederholungen zu erzielen, obwohl die Beantwortung Ihrer eigenen Frage sicherlich ermutigt wird.

    – BoltClock

    31. März 2014 um 16:35 Uhr


  • @Jens: Es ist ziemlich schrecklich, wenn man darüber nachdenkt … C ++ folgt einer völlig anderen Designphilosophie als C, was dazu führt int& i als guter Stil, aber aufgrund seiner Legacy-C-Kompatibilität verbirgt dieser “gute Stil” direkt die tatsächliche Semantik Ihres Codes …

    – Mäuse

    31. März 2014 um 17:15 Uhr

  • Es ist definitiv schlechter Stil, aber jemand, der das Problem nicht recherchiert hat, wird automatisch davon ausgehen int& a, b; deklariert zwei Referenzen, und ich denke, das ist ein ernstes Problem, zumal der Compiler möglicherweise nicht einmal eine Warnung ausgibt.

    – Mäuse

    31. März 2014 um 17:26 Uhr


  • Der Umgang mit mehreren Deklarationen auf diese Weise war a sehr schlecht Designwahl beim Erstellen der C-Sprache. Jetzt stecken wir damit fest, auch in C++. Es ist wahr, dass mit int *i passt besser zu dieser sprachsemantischen Regel, aber es ist eine schreckliche Regel. Der bessere Weg, damit umzugehen, besteht darin, (1) keine mehrfachen Deklarationen zuzulassen und (2) den Typ vom Bezeichner zu unterscheiden (z int* i oder int& i). Jeder mit den geringsten Kenntnissen in C/C++ kennt diese Regel, und deshalb müssen wir die Leute nicht daran erinnern, wir müssen sie nur vermeiden.

    – Michael Persson

    31. März 2014 um 17:55 Uhr

Benutzer-Avatar
Alejandro Blasco

Bjarne Stroustrup sagt:

EIN typical C programmer schreibt int *p; und erklärt es *p is what is the int Hervorhebung der Syntax und kann auf die Deklarationsgrammatik von C (und C++) verweisen, um für die Korrektheit des Stils zu argumentieren. Tatsächlich bindet das * in der Grammatik an den Namen p.

EIN typical C++ programmer schreibt int* p; und erklärt es p is a pointer to an int Typ hervorheben. Tatsächlich ist der Typ von p int*. Ich bevorzuge eindeutig diese Betonung und sehe sie als wichtig an, um die fortgeschritteneren Teile von C++ gut zu nutzen.

Wenn Sie eine Zeigervariable oder ein Argument deklarieren, können Sie das Sternchen (oder das kaufmännische Und) entweder neben dem Typ oder dem Variablennamen platzieren.

Das Wichtigste ist, dies konsistent innerhalb einer einzigen Datei zu tun.

// These are fine, space preceding.
char *c;
const int &i;

// These are fine, space following.
char* c;
const int& i;

Bei der Recherche zu dieser Frage habe ich bereits die Antwort gefunden:

Das & muss genauso geschrieben werden wie die *.

Der Democode ähnelt dem Pointer-Demonstrationscode:

int main() {
    int a = 0;
    int b = 1;

    int& ar = a, br = b;

    br = 2;

    return b;
}

Dies gibt 1 zurück, was bedeutet, dass ar ist eine int-Referenz, während br ist nur eine ganze Zahl.

  • Viele Styleguides schlagen eine Variable pro Deklaration vor. Obwohl mehr als eine möglich ist, wird die Lesbarkeit bei der Deklaration von Zeigern und Referenzen verbessert.

    – Thomas Matthäus

    31. März 2014 um 16:35 Uhr

  • @ThomasMatthews: Auf jeden Fall. In keiner Weise würde ich dazu ermutigen, tatsächlich mehrere Zeiger, Referenzen oder sogar Variablen in einer Anweisung zu deklarieren. Dies ist nur eine Demonstration der internen Funktionsweise von C++.

    – Mäuse

    31. März 2014 um 16:44 Uhr

  • Wie das Ergebnis dieses Codes zeigt, haben Kommas in C++-Variablendeklarationen eine nuancierte Bedeutung, die sich von ihrer Bedeutung in anderen Sprachen unterscheidet und nicht unbedingt intuitiv offensichtlich ist. Ich stimme zu, dass sie vermieden werden sollten. Ich ziehe es jedoch vor, ein Leerzeichen entweder vor oder sowohl vor als auch nach einem kaufmännischen Und zu platzieren.

    – Schawais

    25. Juni 2020 um 21:27 Uhr


Dank “template typedefs” können Sie mehrere Referenzen auf (wohl) nettere Weise deklarieren:

template<typename T> using ref = T&;
int a, b;
ref<int> ar = a, br = b;

1012800cookie-checkWas ist die semantisch genaue Position für das kaufmännische Und in C++-Referenzen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy