Объясните, пожалуйста, почему символ * при объявлении указателей должен стоять рядом с каждым идентификатором? Разве int* нельзя считать как "отдельный" тип?
- 221,325
- 1,491
- 6
- 23
2 Answers
Разве int* нельзя считать как "отдельный" тип?
Почему нельзя? Можно. Если сделать его типом. Например -
typedef int * pint;
pint a, b, c;
А иначе - как компилятору понять, что именно вы хотите в объявлении int * a, b;? Вот он и придерживается стандарта :)
- 221,325
-
1эх, недосмотрели разработчики си... было бы интересно, если
int* a,b;- это два указателя. аint *a, b;- это указатель и число.... сколько бы новых вопросов было бы... – KoVadim Mar 31 '21 at 07:06 -
1@KoVadim Да-да, а еще отступы чтобы имели значение... И сразу популярность языка взлетит до небес :) – Harry Mar 31 '21 at 08:26
-
1
почему символ * при объявлении указателей должен стоять рядом с каждым идентификатором
Потому что грамматику такую сделали. ¯\_(ツ)_/¯
Объявления имеют вид (упрощенно):
decl-specifier-seq declarator, declarator, ..., declarator
Один декларатор создает одну переменную. В центре него - имя переменной, а вокруг имени могут (но не обязаны) быть *, &, [...], (...) и т. д.
Все остальное попадает в decl-specifier-seq (в вашем случае это int).
Тип каждой переменной определяется по общему для всех переменных decl-specifier-seq, и плюс по информации из декларатора этой конкретной переменной.
Например в int *a, b;:
- decl-specifier-seq - это
int *a- первый деклараторb- второй декларатор
Так что *, как часть декларатора, влияет только на свой декларатор. А int, как часть decl-specifier-seq, влияет на обе переменные.
- 27,445
- 3
- 27
- 40
-
А есть ли свое название у этих символов, которые объявляют массив или указатель и т. д. Допустим про имя переменной мы модем сказать что это идентификатор, а как тогда правильно назвать эту часть декларатора? – n 1 k z z z Mar 31 '21 at 07:21
-
@n1kzzz Почитал первую ссылку из ответа, и вижу, что
*,&,&&, иКласс::*называются ptr-operator. Но это настолько хитрое название, что если вы кому-то их так назовете, вас не поймут.[...], судя по той же ссылке, никак не называются. – HolyBlackCat Mar 31 '21 at 14:57
int *.*это атрибут имени переменной, она говорит, что эта переменная указатель – avp Mar 30 '21 at 22:19(int*)aи это очень похоже на отдельный тип – n 1 k z z z Mar 30 '21 at 22:35int *- это отдельный тип, объявлять указатели следует по одному за раз. – user7860670 Mar 31 '21 at 06:55int *- это тип. – HolyBlackCat Mar 31 '21 at 07:01Declaratorsв стандарте и там было написано: `ptr-operator:& attribute-specifier-seq opt && attribute-specifier-seq opt
– n 1 k z z z Mar 31 '21 at 11:10, а по запросу про этот самыйattribute-specifier-seq` мне выдает это. И я что-то запутался что есть что.*не относится к этомуattribute-specifier-seq? – n 1 k z z z Mar 31 '21 at 11:19[[...]](attribute-specifier-seq). Звездочка - не часть attribute-specifier-seq, конечно. Они же рядом написаны. Если бы звездочка была его частью, то она была бы написата тут. – HolyBlackCat Mar 31 '21 at 14:54