Erwägen:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Sind diese beiden Funktionen in jeder Hinsicht gleich oder gibt es einen Unterschied?
Ich bin an einer Antwort für die C-Sprache interessiert, aber wenn die C ++ - Sprache etwas Interessantes enthält, würde ich es auch gerne wissen.
Antworten:
const T
undT const
sind identisch. Mit Zeigertypen wird es komplizierter:const char*
ist ein Zeiger auf eine Konstantechar
char const*
ist ein Zeiger auf eine Konstantechar
char* const
ist ein konstanter Zeiger auf a (veränderlich)char
Mit anderen Worten sind (1) und (2) identisch. Die einzige Möglichkeit, den Zeiger (und nicht den Zeiger)
const
zu erstellen, besteht darin, ein Suffix- zu verwendenconst
.Aus diesem Grund ziehen es viele Menschen vor, immer
const
auf die rechte Seite des Typs zu setzen („East const“ -Stil): Dadurch wird seine Position relativ zum Typ konsistent und leicht zu merken (es scheint auch anekdotisch einfacher zu sein, Anfängern beizubringen ).quelle
Der Trick besteht darin, die Deklaration rückwärts zu lesen (von rechts nach links):
Beides ist dasselbe. Deshalb:
Der Trick zum Rückwärtslesen ist besonders praktisch, wenn Sie mit komplexeren Deklarationen wie den folgenden umgehen:
quelle
char const *
, von links nach rechts gelesen lautet: "pointer, const, char". Es ist ein Zeiger auf const char. Wenn Sie "ein Zeiger, der konstant ist" sagen, befindet sich das Adjektiv "konstant" auf dem Zeiger. In diesem Fall hätte Ihre Adjektivliste also wirklich lauten müssen: "const, pointer, char". Aber Sie haben Recht, dieser Trick ist nicht eindeutig. Es ist wirklich ein "Trick", mehr als eine definitive "Regel".Es gibt keinen Unterschied. Beide deklarieren "a" als eine Ganzzahl, die nicht geändert werden kann.
Die Stelle, an der Unterschiede auftreten, ist die Verwendung von Zeigern.
Beide:
Deklarieren Sie "a" als Zeiger auf eine Ganzzahl, die sich nicht ändert. "a" kann zugewiesen werden, "* a" jedoch nicht.
deklariert "a" als konstanten Zeiger auf eine Ganzzahl. "* a" kann zugewiesen werden, "a" jedoch nicht.
deklariert "a" als konstanten Zeiger auf eine konstante Ganzzahl. Weder "a" noch "* a" können zugeordnet werden.
quelle
Prakash hat Recht, dass die Deklarationen gleich sind, obwohl eine etwas ausführlichere Erklärung des Zeigerfalls angebracht sein könnte.
"const int * p" ist ein Zeiger auf ein int, mit dem das int nicht über diesen Zeiger geändert werden kann. "int * const p" ist ein Zeiger auf ein int, das nicht geändert werden kann, um auf ein anderes int zu zeigen.
Siehe https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
quelle
const int
ist identisch mitint const
, wie es bei allen Skalartypen in C der Fall ist. Im Allgemeinen ist das Deklarieren eines Skalarfunktionsparameters alsconst
nicht erforderlich, da die Call-by-Value-Semantik von C bedeutet, dass alle Änderungen an der Variablen lokal für die umschließende Funktion sind.quelle
Dies ist keine direkte Antwort, sondern ein verwandter Tipp. Um die Dinge gerade zu halten, verwende ich immer die Konvektion "
const
außen angelegt", wobei mit "außen" ganz links oder ganz rechts gemeint ist. Auf diese Weise gibt es keine Verwirrung - die Konstante gilt für die nächste Sache (entweder den Typ oder die*
). Z.B,quelle
Sie sind die gleichen, aber in C ++ gibt es einen guten Grund, immer rechts const zu verwenden. Sie werden im Einklang überall da konstanten Elementfunktionen müssen auf diese Weise erklärt werden:
Es ändert den
this
Zeiger in der Funktion vonFoo * const
nachFoo const * const
. Siehe hier.quelle
Ja, sie sind nur für gleich
int
und anders für
int*
quelle
Ich denke in diesem Fall sind sie gleich, aber hier ist ein Beispiel, wo Ordnung wichtig ist:
quelle