Здравствуйте, 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
Здравствуйте, 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'ы массива константны, можно ли считать что весь массив константен?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, ilnar, Вы писали:
I>константный массив char'ов
J>а что такое "константный массив"?
это все равно, что массив, просто если бы там был не массив, а указатель, то был бы толк от такого именования, тут, да, можно сказать просто массив из char
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?
нет, в приведенном случае , IMHO, сказать константный массив все равно, что сказать просто массив, т.к. его адрес не меняется.
тут больше просто игра словами, т.е. перемещаем вперед или назад и получаем разные вещи.
твой вопрос похож на вопрос математика
ответ — нет
Здравствуйте, ilnar, Вы писали:
I>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?
I>нет, в приведенном случае , IMHO, сказать константный массив все равно, что сказать просто массив, т.к. его адрес не меняется. I>тут больше просто игра словами, т.е. перемещаем вперед или назад и получаем разные вещи.
I>твой вопрос похож на вопрос математика I>ответ — нет
Как тут уже написали — если мы под массивом понимаем указатель, то это будет char * const, то есть константный указатель на char'ы.
Здравствуйте, Кодт, Вы писали:
К>Массив эквивалентен константному указателю...
Ой-ой-ой! Не играйте словами, это скользкая тема.
На самом деле массив — это не указатель. Тип массива может "распасться" (decay) в тип указателя; результат такого распада — rvalue, а следовательно изменить его значение нельзя.
Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Как тут уже написали — если мы под массивом понимаем указатель, то это будет char * const, то есть константный указатель на char'ы.
В оригинале — константный указатель на константные char'ы.
Здравствуйте, Кодт, Вы писали:
К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются К>const const const int const К>int const const const К>int const
какой-то компилятор (чуть ли не VC6) сильно ругался на повторение const.
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Кодт, Вы писали:
К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются К>const const const int const К>int const const const К>int const
J>какой-то компилятор (чуть ли не VC6) сильно ругался на повторение const.
J>Проверьте, у кого есть возможность...
не очень сильно, грозит только зеркальным варнингом номер 4114
Здравствуйте, ilnar, Вы писали:
I>Здравствуйте, Дмитрий Наумов, Вы писали:
ДН>Если весь массив константен можно ли сказать, что каждый из его char'ов константен? И наоборот, если все char'ы массива константны, можно ли считать что весь массив константен?
I>нет, в приведенном случае , IMHO, сказать константный массив все равно, что сказать просто массив, т.к. его адрес не меняется. I>тут больше просто игра словами, т.е. перемещаем вперед или назад и получаем разные вещи.
Неверно. Никаких разных вещей мы тут не получаем. Вышеприведенные объявления являются объявлениями массивов константных символов. И первое, и второе. Причем они являются таковыми и по смыслу, и просто "по прочтению". Откуда ты выкопал такое странное различие — я не знаю.
В C/C++ невозможно объявить константный массив, т.е. привязать модификатор 'const' именно к имени массива, а не к его элементам. Любая попытка сделать это приведет к ошибке компиляции. Для того, чтобы попытаться привязать модификатор 'const' именно к самому массиву, придется воспользоваться скобками:
char (const brk)[5];
Вот это действительно будет попытка объявить "константный массив неконстантных символов". Компиляироваться это, разумеется, не будет.
Здравствуйте, Кодт, Вы писали:
К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются К>const const const int const К>int const const const
Нет, не сливаются. Такое явное повторение квалификаторов приведет к ошибке компиляции. Избыточные квалификаторы допускаются (и игнорируются) только в ряде неявных случаев (типа, добавление 'const' к typedef-имени, которое внутри и так 'const'). См. 7.1.5/1.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Здравствуйте, ilnar, Вы писали:
АТ>Неверно. Никаких разных вещей мы тут не получаем. Вышеприведенные объявления являются объявлениями массивов константных символов. И первое, и второе. Причем они являются таковыми и по смыслу, и просто "по прочтению". Откуда ты выкопал такое странное различие — я не знаю.
АТ>В C/C++ невозможно объявить константный массив, т.е. привязать модификатор 'const' именно к имени массива, а не к его элементам. Любая попытка сделать это приведет к ошибке компиляции. Для того, чтобы попытаться привязать модификатор 'const' именно к самому массиву, придется воспользоваться скобками:
АТ>Вот это действительно будет попытка объявить "константный массив неконстантных символов". Компиляироваться это, разумеется, не будет.
признаю ошибку, в спешке вообще не обратил внимание на то, что массив по определнию константный, когда писал, имел ввиду указатели, извиняйте за дезинформацию
К>// несколько одинаковых квалификаторов, относящихся к одной и той же части, сливаются К>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 могут стоять как перед, так и после имени типа.
Много раз встречал такое утверждение в литературе. Подскажите, плз, где об этом сказано в стандарте?