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

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

int *x, *y;

не

int* x,y;

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

 Vijay14 июн. 2012 г., 14:14
возможно, они считаются более гибкими, так что пользователь может одновременно объявить и указатель, и обычную переменную.
 Adriano Repetti14 июн. 2012 г., 14:18
Прочитай этоresearch.att.com/~bs/bs_faq2.html#whitespace по причине в C ++, по причинам C:cm.bell-labs.com/cm/cs/who/dmr/chist.html
 bames5314 июн. 2012 г., 15:38
 Morwenn14 июн. 2012 г., 14:49
Я бы сказал, что самая странная часть с инициализацией. Скажем, у нас естьint* p = new int[5]; затемint* a = &p; было бы хорошо: "Дайте указателю a адрес p". Ноint *b = &p; странно: "Дайте целому числу * b адрес p". Учитывая, что * b является int, зачем давать адреса? Вот почему я считаю, что цепочечные объявления указателей не имеют смысла.
 Fanael14 июн. 2012 г., 14:12
Потому что это так, как это сделано в C.

Ответы на вопрос(3)

Решение Вопроса

Бьярне делает хорошую мысльВот:

The choice between int* p; and int *p; is not about right and wrong, but about style and emphasis. C emphasized expressions; declarations were often considered little more than a necessary evil. C++, on the other hand, has a heavy emphasis on types.

A typical C programmer writes int *p; and explains it *p is what is the int emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the * binds to the name p in the grammar.

A typical C++ programmer writes int* p; and explains it p is a pointer to an int emphasizing type. Indeed the type of p is int*. I clearly prefer that emphasis and see it as important for using the more advanced parts of C++ well.

Таким образом, мотивация для такой работы в C ++ заключается в том, как она работает в C.

Мотивация, с которой он работает так в C, заключается в том, что, как указано выше, C делает акцент на выражениях, а не на типах.

 14 июн. 2012 г., 14:14
Так почему же C работает именно так? :)
 14 июн. 2012 г., 14:22
Краткий ответ выше: «C выделенные выражения; декларации часто считались не более чем необходимым злом. & quot;
 14 июн. 2012 г., 14:14
@illEatYourPuppies ах, но это совсем другой вопрос: P
 14 июн. 2012 г., 15:59
Я обычно бегаю сint * p потому что я нахожу оба пути безобразными :)
 Sideshow Bob14 июн. 2012 г., 15:55
@LuchianGrigore, только если у вас нет любопытства вообще :)

Конечно, напрашивается только вопрос: почему C делает это таким образом?

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

int *p;

, вы заявляете, что выражение*p имеет типint (и Компилятор определяет фактический типp соответственно).

Это, конечно, перестало быть правдой в день, когда C представилtypedef, а также потомstruct, И любое сходство полностью исчезло сconst (сначала введенный в C ++, затем модифицированный в C), где такие вещи, как

int *const p;

не имеют никакого отношения к использованию. Но к тому времени жребий был брошен.

Answer

Это происходит от "C" («обычный с», «чистый с», безотносительно).

Когда переменная-указатель уже объявлена, она используется следующим образом:

...
*p = &x;
*q = SomePointerFunc();
....

Я читал, что первоначальные изобретатели "с" хотел, чтобы программисты объявляли переменные указателей с тем же синтаксисом, что и они,with the star before the variable identifier:

...
int *p;
int *q;
...

То же самое касается массивов:

...
x[5]  = 'a';
y[77] = SomeItemFunc();
...

...
char x[5];
int  y[100];
...

Некоторые учителя, которые у меня были, настаивают на объявлении типов для переменных & amp; работает следующим образом (звездочка близка к идентификатору):

...
int *p;
int *q;
...

Вместо этого (звездочка рядом с идентификатором типа):

...
int* p;
int* q;
...

Extra

В Java и других языках, таких как C #, объявление массивов или указателей находится рядом с типом, оставляя только идентификатор переменной или функции, как этот псевдокод:

*int p;
*int q;
char[5] x;
int[100]  y;

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

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

Ваш ответ на вопрос