2013-08-29 3 views
2

Как я прочитал в стандартах С Адг адрес постоянной должен быть квалифицированы следующим образом:Какое правильное использование определителя const?

int * const ptr,

Я спрашивал мой сам, будет работать int const i тоже вместо const int i.

И все.

После того, как я заметил, что они были равны, я просто пытался немного покрутиться, чтобы получить смысл const. Я сделал такие вещи, как

int * const * pPtr и int const * ptr в различных компиляторов, я уведомлен, все они относятся к const, так как если это определение будет:

«Const квалифицируется тип слева от него, так же, как есть нет типа слева от него, он должен перевернуть правую часть «

Но я не мог найти ничего об этом в стандартах. И каждый пример в стандарте написан с const в начале декларации или только за частью static.

(Что по крайней мере, не отказался бы мое предложение ...)

Так почему Allmost каждый использует Конст в начале декларации, как это было бы более понятным то, как я уже говорил?

И как правильно присвоить идентификатор const, в соответствии с предположением, что компиляторы поддерживают оба способа?

+0

Ну, я думаю, что люди склонны использовать «константный Int» более просто потому, что это немного более естественным для создания постоянного целое, чем целая константа, если это делает любой Sence – Fenixp

+1

Это мнение основано на мнениях. Люди делают то и другое. Я предпочитаю 'int const i', потому что у него меньше сюрпризов, когда вы начинаете бросать '*'. Но другие не делают, и язык позволяет обоим. –

+0

@Tom Tanner Я одобрил, но Тема это не мнение основано, потому что im askign для, что говорит стандарт! – dhein

ответ

2

Итак, почему почти каждый использует const в начале объявления, так как было бы более понятным, как я упоминал?

Это всего лишь стиль кодирования, как действительный синтаксис.

C11 §6.7 Объявления

Синтаксис

декларация:

декларация-спецификаторов INIT-описатель-listopt;

static_assert декларация

декларации спецификаторы:

хранения класса спецификатор декларации спецификаторы выбирают

типа спецификатор декларации спецификаторы выбирают

типа-спецификатор декларации -специалисты opt

функция-спецификатор декларации спецификаторы выбирают

выравнивание спецификатор декларации спецификаторы выбирают

INIT-описатель-лист:

INIT-описатель

INIT-описатель-лист, INIT-описатель

INIT-описатель:

описатель

описателя = инициализатор

Обратите внимание на линии, которые я использую полужирный, типа спецификатор ключевые слова, как int, char или void и т.д. типа-классификатор ключевые слова, как constvolatile и т.д.

В соответствии со стандартом, объявления-спецификаторы определены рекурсивно, поэтому const int i и int const i являются действительными:

 int   const  i; 
//  |    | 
//type-specifier type-qualifier 
//  \______________/ 
//    | 
//  declaration-specifier 

     const    int  i; 
//  |     | 
//  |   type-specifier 
//  |     | 
//type-qualifier declaration-specifier 
//  \__________________/ 
//    | 
//  declaration-specifier 
+0

Я не понимаю, что означает «определить рекурсивно». – dhein

+0

@Zaibis Я добавил график, чтобы объяснить, это более ясно? –

0

Правило большого пальца: Перемещение const за * имеет значение. В противном случае это не так.

+0

Вот что я говорю в разных словах, даже не в куске ответа.+ его даже не тот конкретный, как мой вопрос, так что проголосуйте. – dhein

+0

Сообщение OP подразумевает, что движение 'const' по обе стороны от' * 'является проблемой стиля. Это сообщение правильно идентифицирует, что, поскольку проблема стиля для него - это изменение кода. – chux

+0

@chux Я этого не говорил. Я просто сказал, что 'const int' равно eq для' int const' всех остальных, где экспериментальный – dhein

0

Wow, есть много «сопзЬ» происходит.


int * const foo1 

foo1 является "константный указатель на INT". Значение foo1 является постоянным. Что может быть изменено foo1.


int const foo2 
const int foo3 

foo2 и foo3 имеют одинаковый тип - оба являются правильными - С позволяет как. порядок int и const - это выбор . В обоих случаях идентификатор является постоянным.Имея const первый чаще встречается в моем опыте. Поэтому я, как правило, придерживаюсь предшествующего уровня техники. Далее - я нахожу либо ОК, если он согласуется с модулем. В обоих случаях можно было бы ожидать, чтобы найти инициализатор как const int foo3 = 7;


но и некоторые распутывания путаницы необходимо.
[Отредактировано ответ следует]

// OP's experimented with these 
int * const * foo4; 
int const * foo5; 

OP предположил с «Уста квалифицируются типа слева от нее, так же, как нет типа слева от него, он должен quallifie правой части». Это объясняется для этих 2 и, по-видимому, применяется к дополнительным образцам:

foo4 является «указателем на указатель const на int».
foo5 является «указателем на const int».

Дополнительные образцы:

int * const foo6; 
const int* foo7; 
int const * const foo8; 

foo6 является "константный указатель на INT".
foo7 является «указателем на const int» - то же, что и foo5.
foo8 является «указателем const для const int».

foo6 постоянный, данные, на которые он указывает, составляют не постоянный.
foo7 is не постоянный, данные, которые он указывает на , являются рассматриваются как постоянные.
foo8 постоянный. Данные, на которые он указывает, рассматриваются как постоянные.

@ugoren является правильно в посте о перемещении const через *. Перемещение const изменяет тип. Это не разница в стиле, а другой код.


Ref:.

C11 6.2.5.29 «Пример 1 типа обозначается как„“флоат *„“имеет тип„“указатель всплывать„“Его тип категория указатель, а не плавающий тип . Const-квалифицированная версия этого типа обозначается как «float * const», тогда как тип, обозначенный как «const float *», не является квалифицированным типом - его тип является «указателем на const-qualified float», и является указателем на квалифицированный тип ».

C11 6,7

http://cdecl.org/

+0

Я не сказал, что это те же самые i jsut, первые 2 такие же, а остальные я просто экспериментировал с aorund, чтобы получить это поведение. – dhein

+0

@Zaibis «Просто пытаюсь немного arround», приводя к «... все они рассматривайте его, как если бы определение было: const квалифицирует тип слева от него ... »было неясно, какие варианты были опробованы, поскольку это привело к некорректному выводу. Мне показалось, что эти 2 были одинаковыми. Остается более важный вопрос: ясно ли, что перемещение 'const' влево или вправо от' * 'приводит к другому типу, тогда как перемещение его до или после' int' является проблемой стиля? – chux

+0

Я даже не говорю о '*' просто сказал это, чтобы проиллюстрировать, почему я начал это думать. Ofc это приводит к разным результатам, так как я сказал: «Если ничего не осталось слева ... если слева от него' * 'его ссылается на него. Я не понимаю, как вы не можете отфильтровать это из моего вопроса : x в любом случае, первая часть i eddited ... – dhein

Смежные вопросы