В чем разнипца объявлений CONST?
От: Magic Россия  
Дата: 06.05.03 10:02
Оценка:
В чем разница между следующими объявлениями

const char brk[] = {'a','b'};

и

char const brk[] = {'a','b'};
Re: В чем разнипца объявлений CONST?
От: ilnar Россия  
Дата: 06.05.03 10:13
Оценка: -3
Здравствуйте, Magic, Вы писали:

M>В чем разница между следующими объявлениями


M>
M>const char brk[] = {'a','b'};
M>

M>и

массив константных char'ов

M>
M>char const brk[] = {'a','b'};
M>


константный массив char'ов
Re: В чем разнипца объявлений CONST?
От: jazzer Россия Skype: enerjazzer
Дата: 06.05.03 10:13
Оценка:
Здравствуйте, Magic, Вы писали:

M>В чем разница между следующими объявлениями


M>
M>const char brk[] = {'a','b'};
M>

M>и

M>
M>char const brk[] = {'a','b'};
M>


никакой разницы
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: В чем разнипца объявлений CONST?
От: Кодт Россия  
Дата: 06.05.03 10:14
Оценка: 17 (4) +1
Здравствуйте, Magic, Вы писали:

M>В чем разница между следующими объявлениями

M>const char brk[] = {'a','b'};

M>и
M>char const brk[] = {'a','b'};


Ни в чем. Квалификаторы const и volatile могут стоять как перед, так и после имени типа.
Для лучшего понимания — представь себе, что квалификатор нужно сдвинуть вправо до первого "знака препинания" -- (, ), [, ], *, &, ::.
// указатель на константный символ (строку)
const char *
char const *

// константный указатель на переменный символ
char * const

// константный указатель на константный символ
const char * const
char const * const

// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются
const const const int const
int const const const
int const

// если квалификаторы относятся к разным частям - то они не сливаются
const int * const
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[2]: В чем разнипца объявлений CONST?
От: jazzer Россия Skype: enerjazzer
Дата: 06.05.03 10:17
Оценка:
Здравствуйте, ilnar, Вы писали:

I>константный массив char'ов


а что такое "константный массив"? :))
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: В чем разнипца объявлений CONST?
От: Дмитрий Наумов  
Дата: 06.05.03 10:20
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Magic, Вы писали:


M>>В чем разница между следующими объявлениями


M>>
M>>const char brk[] = {'a','b'};
M>>

M>>и

I>массив константных char'ов


M>>
M>>char const brk[] = {'a','b'};
M>>


I>константный массив char'ов


Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?
... << RSDN@Home 1.0 beta 6a >>
Re[2]: В чем разнипца объявлений CONST?
От: Кодт Россия  
Дата: 06.05.03 10:29
Оценка:
Здравствуйте, ilnar, Вы писали:

I>массив константных char'ов

I>константный массив char'ов

И то, и другое имеет тип char const [], то есть массив константных символов.

Массив эквивалентен константному указателю (мы не можем менять значение переменной — только элементы массива).

Поэтому получается char const * const -- константный указатель на константные символы
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[3]: В чем разнипца объявлений CONST?
От: ilnar Россия  
Дата: 06.05.03 10:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, ilnar, Вы писали:


I>константный массив char'ов


J>а что такое "константный массив"?


это все равно, что массив, просто если бы там был не массив, а указатель, то был бы толк от такого именования, тут, да, можно сказать просто массив из char
Re[3]: В чем разнипца объявлений CONST?
От: ilnar Россия  
Дата: 06.05.03 10:41
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?


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

твой вопрос похож на вопрос математика
ответ — нет
Re[4]: В чем разнипца объявлений CONST?
От: Дмитрий Наумов  
Дата: 06.05.03 10:48
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?


I>нет, в приведенном случае , IMHO, сказать константный массив все равно, что сказать просто массив, т.к. его адрес не меняется.

I>тут больше просто игра словами, т.е. перемещаем вперед или назад и получаем разные вещи.

I>твой вопрос похож на вопрос математика

I>ответ — нет

Как тут уже написали — если мы под массивом понимаем указатель, то это будет char * const, то есть константный указатель на char'ы.
... << RSDN@Home 1.0 beta 6a >>
Re[3]: В чем разнипца объявлений CONST?
От: Аноним  
Дата: 06.05.03 10:51
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Массив эквивалентен константному указателю...


Ой-ой-ой! Не играйте словами, это скользкая тема.

На самом деле массив — это не указатель. Тип массива может "распасться" (decay) в тип указателя; результат такого распада — rvalue, а следовательно изменить его значение нельзя.
Re[5]: В чем разнипца объявлений CONST?
От: Кодт Россия  
Дата: 06.05.03 10:53
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Как тут уже написали — если мы под массивом понимаем указатель, то это будет char * const, то есть константный указатель на char'ы.


В оригинале — константный указатель на константные char'ы.
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[2]: В чем разнипца объявлений CONST?
От: jazzer Россия Skype: enerjazzer
Дата: 06.05.03 11:02
Оценка:
Здравствуйте, Кодт, Вы писали:

К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются

К>const const const int const
К>int const const const
К>int const

какой-то компилятор (чуть ли не VC6) сильно ругался на повторение const.

Проверьте, у кого есть возможность...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: В чем разнипца объявлений CONST?
От: ilnar Россия  
Дата: 06.05.03 11:14
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Кодт, Вы писали:


К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются

К>const const const int const
К>int const const const
К>int const

J>какой-то компилятор (чуть ли не VC6) сильно ругался на повторение const.


J>Проверьте, у кого есть возможность...


не очень сильно, грозит только зеркальным варнингом номер 4114
Re[4]: В чем разнипца объявлений CONST?
От: Андрей Тарасевич Беларусь  
Дата: 06.05.03 14:56
Оценка: 3 (1) +1
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, Дмитрий Наумов, Вы писали:


ДН>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?


I>нет, в приведенном случае , IMHO, сказать константный массив все равно, что сказать просто массив, т.к. его адрес не меняется.

I>тут больше просто игра словами, т.е. перемещаем вперед или назад и получаем разные вещи.

Неверно. Никаких разных вещей мы тут не получаем. Вышеприведенные объявления являются объявлениями массивов константных символов. И первое, и второе. Причем они являются таковыми и по смыслу, и просто "по прочтению". Откуда ты выкопал такое странное различие — я не знаю.

В C/C++ невозможно объявить константный массив, т.е. привязать модификатор 'const' именно к имени массива, а не к его элементам. Любая попытка сделать это приведет к ошибке компиляции. Для того, чтобы попытаться привязать модификатор 'const' именно к самому массиву, придется воспользоваться скобками:

char (const brk)[5];


Вот это действительно будет попытка объявить "константный массив неконстантных символов". Компиляироваться это, разумеется, не будет.
Best regards,
Андрей Тарасевич
Re[2]: В чем разнипца объявлений CONST?
От: Андрей Тарасевич Беларусь  
Дата: 06.05.03 15:01
Оценка:
Здравствуйте, Кодт, Вы писали:

К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются

К>const const const int const
К>int const const const

Нет, не сливаются. Такое явное повторение квалификаторов приведет к ошибке компиляции. Избыточные квалификаторы допускаются (и игнорируются) только в ряде неявных случаев (типа, добавление 'const' к typedef-имени, которое внутри и так 'const'). См. 7.1.5/1.
Best regards,
Андрей Тарасевич
Re[5]: В чем разнипца объявлений CONST?
От: ilnar Россия  
Дата: 06.05.03 15:01
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Здравствуйте, ilnar, Вы писали:


АТ>Неверно. Никаких разных вещей мы тут не получаем. Вышеприведенные объявления являются объявлениями массивов константных символов. И первое, и второе. Причем они являются таковыми и по смыслу, и просто "по прочтению". Откуда ты выкопал такое странное различие — я не знаю.


АТ>В C/C++ невозможно объявить константный массив, т.е. привязать модификатор 'const' именно к имени массива, а не к его элементам. Любая попытка сделать это приведет к ошибке компиляции. Для того, чтобы попытаться привязать модификатор 'const' именно к самому массиву, придется воспользоваться скобками:




АТ>Вот это действительно будет попытка объявить "константный массив неконстантных символов". Компиляироваться это, разумеется, не будет.



признаю ошибку, в спешке вообще не обратил внимание на то, что массив по определнию константный, когда писал, имел ввиду указатели, извиняйте за дезинформацию
Re[3]: В чем разнипца объявлений CONST?
От: Андрей Тарасевич Беларусь  
Дата: 06.05.03 15:06
Оценка: 4 (2)
К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются
К>const const const int const
К>int const const const

АТ>Нет, не сливаются. Такое явное повторение квалификаторов приведет к ошибке компиляции. Избыточные квалификаторы допускаются (и игнорируются) только в ряде неявных случаев (типа, добавление 'const' к typedef-имени, которое внутри и так 'const'). См. 7.1.5/1.


Стоит, правда, добавить, что это относится именно к С++. В С можно явно указывать избыточные модификаторы.
Best regards,
Андрей Тарасевич
Re[2]: В чем разнипца объявлений CONST?
От: Аноним  
Дата: 07.05.03 13:44
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ни в чем. Квалификаторы const и volatile могут стоять как перед, так и после имени типа.


Много раз встречал такое утверждение в литературе. Подскажите, плз, где об этом сказано в стандарте?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.