2016-10-07 2 views
11

Ich lerne C++. In meinem Kurs wird erklärt, dass es am besten ist const sofort nach das, was Sie unveränderlich machen wollen zu platzieren, denn dies ist, wie const funktioniert.Warum arbeitet `const` an dem Ding, das ihm unmittelbar vorausgeht?

Viele Menschen, darunter zum Beispiel Bjarne Stroustrup selbst, wie const vor zu schreiben. Aber das führt manchmal zu Problemen:

const int *foo; //modifiable pointer to a constant int. 
int const *bar; //constant pointer to a modifiable int? No! It's a modifiable pointer to a constant int. (So the same type as foo) 

Ein Beispiel, das diese in Aktion zeigt:

int fun(int const *mypointer) 
{ 
    *mypointer = 5; //Won't compile, because constant int. 
    mypointer = 0; // Is okay, because modifiable pointer. 
} 

Was macht noch verwirrender ist, dass Compiler wie g ++ wie int const bar zu const int bar neu zu schreiben in ihrem Fehlermeldungen.

Nun, dieses Verhalten ist verwirrend mich sehr. Warum funktioniert const auf diese Weise? Es würde viel einfacher zu verstehen sein, wenn es "nur" an dem Ding arbeiten würde, das danach gestellt wurde.

+14

verrückt Typspezifizierer Syntax der C ist meist ein Unfall der Geschichte. –

+1

Und dann wollte C++ zum größten Teil rückwärtskompatibel sein, also blieben sie dabei. –

+5

_Das führt manchmal zu Problemen_ <- Normalerweise führt es zu Problemen, wenn Sie nicht wissen, wie es funktioniert. – skypjack

Antwort

6

C++ folgt Syntax von C.

Es sieht seltsam, aber in C Sie nicht eine Art von Variable angeben, aber eine Art von Ausdruck mit ihm:

  • int v bedeutet, dass v ist int;
  • int *v bedeutet, dass *vint ist, also v Zeiger auf int;
  • int v[] bedeutet, dass v[…]int ist, so ist v Array von int;
  • int v() bedeutet, dass v()int ist, so v Funktion zurückkehrt int;
  • etc (Sie brauchen immer eine solche Erklärung von inneren zu lesen).

Näher auf Ihre Frage, in C-Typ-Spezifikation aus mehreren Wörtern bestehen kann: unsigned char, long int, const double (sogar mehr als zwei - const unsigned long long int). Anzahl der wiederholten Worte Angelegenheiten (long long int im allgemeinen Fall unterscheidet sich von long int), aber Reihenfolge der Wörter nicht (long int ist die gleiche wie int long). Deshalb ist const int *p das gleiche wie int const *p (und const int i ist dasselbe wie int const i).

Was int * const p, ist es wahrscheinlich nicht gehorcht gemeinsames System. Da es keinen solchen Ausdruck wie * const p gibt (wobei eine Variable ist) in C, können wir es nicht mit etwas wie erklären. Ausdruck * const p wird den Typ int haben ". Denken Sie jedoch, wo können wir das Schlüsselwort const setzen, um anzugeben, dass der Zeiger selbst konstant ist, nicht der dereferenzierte Wert?(Unter der Annahme, dass sowohl const int *p und int const *p bedeuten, dass ein dereferenzierte Wert konstant ist, und wir wollen nicht, zusätzliche Keywords in Sprache einzuführen.) Nirgendwo außer nach *; also hier geht es.

1

Um eine C-Deklaration verstehen es eine Right-Left rule ist, die sehr hilfreich ist: Zum Beispiel

int * 

ein Zeiger auf eine ganze Zahl ist (beachten Sie, dass Sie das Recht lesen müssen links). Das Gleiche gilt für die Referenz auf int:

int & 

nun die Art der p8 von rechts nach links gelesen werden:

char * const * const p8; // const pointer to const pointer to char 

Ich vermute, dass const die vorhergehende Art modifiziert, nur um im Einklang mit dieser Regel. Die Tatsache, dass Sie const ganz am Anfang der Deklaration setzen können, ist eine Ausnahme.

Hinweis: Das Beispiel stammt aus this article (aber es etwas geändert).

Verwandte Themen