Подтвердить что ты не робот

Почему указатель С++ * ассоциируется с объявленной переменной, а не с типом?

Почему С++ спроектирован таким образом, что правильный способ объявить два int * s в одной строке -

int *x, *y;

не

int* x,y;

Я знаю, что некоторые люди думают, что вам следует избегать любой формы и объявлять каждую переменную в своей собственной строке, но меня интересует, почему было принято это языковое решение.

4b9b3361

Ответ 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;

Я предпочитаю эту технику.

Приветствия.