Почему указатель С++ * ассоциируется с объявленной переменной, а не с типом?
Почему С++ спроектирован таким образом, что правильный способ объявить два int * s в одной строке -
int *x, *y;
не
int* x,y;
Я знаю, что некоторые люди думают, что вам следует избегать любой формы и объявлять каждую переменную в своей собственной строке, но меня интересует, почему было принято это языковое решение.
Ответы
Ответ 1
Поддерживать совместимость с C-кодом, потому что это работает с C.
Bjarne делает хорошую точку здесь:
Выбор между int* p;
и int *p;
не прав и неправильно, но о стиле и акценте. C подчеркнутые выражения; декларации часто считались не более чем необходимым злом. С другой стороны, С++ имеет большой упор на типы.
Типичный программист С пишет int *p;
и объясняет это синтаксисом *p is
what is the int
и может указывать на C (и С++) грамматику декларации, чтобы аргументировать правильность стиля. В самом деле, * привязывается к имени p в грамматике.
A typical C++ programmer
записывает int* p;
и объясняет тип p is
a pointer to an int
подчеркивания. Действительно, тип p является int *. Я явно предпочитаю этот акцент и считаю его важным для использования более продвинутые части С++.
Итак, мотивация для этого, работающего как это в С++, заключается в том, как он работает в C.
Мотивация, которую он работает так, как в C, состоит в том, что, как указано выше, C подчеркивает выражения, а не типы.
Ответ 2
Простой ответ: потому что это делает C. Что из
конечно, только задает вопрос: почему C делает это так?
Исходная философия в начале С состоит в том, что декларация будет точной
образ использования. Поэтому, когда вы пишете:
int *p;
вы объявляете, что выражение *p
имеет тип int
(и
компилятор правильно определяет тип p
).
Это, разумеется, перестало быть истинным, когда введен день typedef
, и
позже struct
. И любое сходство полностью исчезло с помощью const
(сначала введенный в С++, затем модифицированный в C), где такие вещи, как
int *const p;
не имеют отношения к использованию. Но к тому времени штамп был брошен.
Ответ 3
Ответ
Это происходит от "C" ( "plain c", "pure c", что угодно).
Когда указательная переменная уже объявлена, она используется следующим образом:
...
*p = &x;
*q = SomePointerFunc();
....
Я читал, что оригинальные изобретатели "c" хотели, чтобы программисты объявляли переменные указателей с тем же синтаксисом, что и они, со звездой перед идентификатором переменной:
...
int *p;
int *q;
...
То же самое относится к массивам:
...
x[5] = 'a';
y[77] = SomeItemFunc();
...
...
char x[5];
int y[100];
...
Некоторые преподаватели, которых я имел, настаивают, чтобы объявить типы переменных и функций таким образом (звезда близка к идентификатору):
...
int *p;
int *q;
...
Вместо этого (звездочка рядом с идентификатором типа):
...
int* p;
int* q;
...
Extra
В Java и других языках, например С#, объявление массивов или указателей находится рядом с типом, оставляя только идентификатор переменной или функции, такой как этот псевдокод:
*int p;
*int q;
char[5] x;
int[100] y;
Я предпочитаю эту технику.
Приветствия.