Задать вопрос
mrjbom
@mrjbom

Контринтуитивный синтаксис объявления нескольких переменных одного типа?

При объявлении нескольких переменных одного типа в одной строке:
const char* key, value;
Тип key будет const char*, а тип value const char.
Для того, что-бы они оба были указателями, нужно делать так:
const char* key, *value;
Из этого, можно подумать, что при объявлении указателя, символ * относится к имени(не как часть, а как что-то зависящее от него), а не к типу.

Мне кажется, что это очень странный и контринтуитивный синтаксис, противоречащий например тому, когда мы приводим некую переменную к указателю:
uint64_t addr = 0x1000;
// Мы пишем так
void* ptr = (void*)addr;
// А не так
void* ptr = (void)*addr;


Объясните, что я недопонимаю?
  • Вопрос задан
  • 151 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
можно подумать, что при объявлении указателя, символ * относится к имени(не как часть, а как что-то зависящее от него), а не к типу.

Если взять стандарт языка (например C99) и почитать главы Declarations, Type Specifiers и Declarators, то можно увидеть, что он разделяет declaration-specifiers, в который входят только слова и declarators, в который входят скобочки и звёздочки. Т.е. твой вывод по сути верный.

Там же можно увидеть, что часть называемую declarator всегда можно обернуть в скобки, из чего можно извлечь следующий вывод: часть объявления вокруг которой можно поставить скобки самым широким образом относится к конкретному идентификатору, оставшаяся часть -- ко всему списку. Т.е. const char *a, b; можно превратить в const char (*a), b, но нельзя превратить в const (char *a), b или в char (const *a), b.

Ну и напоследок стоит добавить, что такая интерпретация объявления не следует ни из чего с необходимостью, это просто решение которое было принято разработчиками языка. Они могли принять это решение по-другому и тогда уже другие конструкции вызывали бы наше удивление.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
AshBlade
@AshBlade
Просто хочу быть счастливым
Объясните, что я недопонимаю?

Все правильно понимаешь. Привыкай.

P.S. вот поэтому и рекомендуют * писать рядом с переменной, а не у типа - const char *var , а не const char* var
Ответ написан
По делу уже ответили, приведу лишь интересную цитату от Денниса Ритчи:

I'm still uncertain about the language declaration syntax, where in declarations, syntax is used that mimics the use of the variables being declared. It is one of the things that draws strong criticism, but it has a certain logic to it.

Ссылка на интервью
Ответ написан
Комментировать
CityCat4
@CityCat4 Куратор тега C
//COPY01 EXEC PGM=IEBGENER
Никогда не задумывался, потому что сколько на С пишу - всегда пишуchar *aaam, bbbm;
и мне так сразу понятно, что первая переменная у меня - указатель, а вторая - нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы