Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 26.12.2013
Сообщений: 44
1

Константы и C++

14.03.2014, 15:26. Показов 3579. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Скажите новичку зачем в C++ константы? И для чего они?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.03.2014, 15:26
Ответы с готовыми решениями:

Ввод константы
Имеется массив. Нужно чтоб пользователь вводил его размер, но для этого нужно чтоб переменная была...

Вычисляемые константы
Можно ли сделать так, чтобы сначала вычислить, а затем сделать константой?

Константы и указатели
Как это работает? const int c = 2; const int* p1 = &c; int* p2 = (int*)p1; *p2 = 3;...

Инициалиация константы
Здравствуйте, вообщем на шестом ВС вроде была такая возможность, а 2010 ругается: int c=42;...

36
alsav22
26.10.2014, 02:45     Константы и C++
  #21

Не по теме:

Цитата Сообщение от dominqnta Посмотреть сообщение
Спасибо всем. Разобрался
Семь месяцев?!:)

0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 02:52 22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если ваш С++ компилятор разрешает массивы неконстантного размера без выдачи диагностического сообщения - значит это не С++ компилятор
Это значит, что GCC не морочит голову лишними предупреждениями.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.10.2014, 03:07 23
Цитата Сообщение от DrOffset Посмотреть сообщение
Или значит, что это G++. VLA там - расширение, включенное по-умолчанию.
Компиляторы С++ могут реализовывать какие угодно расширения, но в любом случае они обязаны выдавать диагностические сообщения в ответ на формально ошибочный код. Если какой-то компилятор С++ "расширяет" неопределенную часть спецификации языка, он может делать это молча. Но если какой-то компилятор С++ "расширяет" значение определенно ошибочного кода, он будет выдавать диагностическое сообщение.

Компилятор, который проглатывает вышеприведенный код молча не является компилятором С++. В частности, язык программирования, который реализуется компилятором g++ в режиме по умолчанию называется GNU++. Не надо путать его с С++, даже если эти языки несколько похожи друг на друга.

Цитата Сообщение от programina Посмотреть сообщение
Это значит, что GCC не морочит голову лишними предупреждениями.
Неверно. Диагностические сообщения, указывающие на грубые ошибки в коде, не являются лишними, а являются обязательными.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 03:35 24
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Неверно. Диагностические сообщения, указывающие на грубые ошибки в коде, не являются лишними, а являются обязательными.
Неверно. Запись типа: int c = 7; float x[c]; не является ошибкой.

Добавлено через 2 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
они обязаны выдавать диагностические сообщения
Настоящие компиляторы никому не обязаны, ни к чему не привязаны.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.10.2014, 03:39 25
Цитата Сообщение от programina Посмотреть сообщение
Неверно. Запись типа: int c = 7; float x[c]; не является ошибкой.
Повторяю еще раз. Язык С++ запрещает использование неконстантных выражений для указания размера массива. Код 'int c = 7; float x[c];' является ошибочным. (О чем вам, кстати, охотно сообщит тот же компилятор GCC, если вы запустите его в режиме С++.)

Я не предлагаю это к обсуждению. Я даю это под запись для обязательного запоминания.

Добавлено через 1 минуту
Цитата Сообщение от programina Посмотреть сообщение
Настоящие компиляторы никому не обязаны, ни к чему не привязаны.
Да да, конечно...
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 03:42 26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
сообщит тот же компилятор GCC, если вы запустите его в режиме С++
Ни разу не было такого! И да, можно подробнее про переключение режимов в GCC?
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.10.2014, 03:51 27
Цитата Сообщение от programina Посмотреть сообщение
Ни разу не было такого!
Ну, как говорится, есть многое на свете, друг Горацио... По мере появления осмысленного опыта вы еще и не такое узнаете. Я вам даже в некотором смысле завидую...

Цитата Сообщение от programina Посмотреть сообщение
И да, можно подробнее про переключение режимов в GCC?
Да вроде бы все в на соответствующих страничках подробно описано... Да и разжевано было уже сто раз вдоль и поперек на каждом уважающем себя форуме. Как можно этого не знать?

g++ -std=c++11 -pedantic test.cpp

Код
test.cpp: In function ‘int main()’:
test.cpp:3:12: warning: ISO C++ forbids variable length array ‘f’ [-Wvla]
   float f[c];
            ^
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 04:18 28
g++ -std=c++11 test.cpp

Чисто:

Константы и C++


C++
int main()
{
    int c = 7;
    float x[c];
    return c;
}
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
26.10.2014, 04:19 29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но если какой-то компилятор С++ "расширяет" значение определенно ошибочного кода, он будет выдавать диагностическое сообщение.
Не выдает, в этом и дело.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В частности, язык программирования, который реализуется компилятором g++ в режиме по умолчанию называется GNU++. Не надо путать его с С++, даже если эти языки несколько похожи друг на друга.
Даже в режиме -std=c++11, который как бы намекает нам на то, какой язык мы используем, диагностика не выдается и код компилируется. Вот пруф. Чтобы он начал выдавать предупреждение, нужно включить флаг -pedantic, или конкретно -Wvla. Переключения в режим С++11 или С++03, как видно, недостаточно.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Компилятор, который проглатывает вышеприведенный код молча не является компилятором С++.
Эта игра слов мне не нравится и вот почему:
1. gnu++ - это не язык, а набор расширений, которые реализует компилятор для с++.
2. Если некоторое множество расширений входит в компилятор по-умолчанию, это совершенно не значит, что данный компилятор не является компилятором С++. Компилятором С++ не является только тот компилятор, который не реализуется стандарт С++. А в стандарте С++ нет никаких явных запретов на расширения, так же, как нет конкретных требований для диагностики (есть рекомендации, более или менее жесткие, но нет конкретных указаний: "выдать ошибку" или "выдать предупреждение"). Следовательно тезис про то, что G++ - это не компилятор С++ ошибочен.

Хочу также напомнить вот что: в стандарте существует практика указания на жесткость требований, посредством использования определенных форм модальных глаголов. Вот например про массивы:
8.3.4
If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Ну и, к примеру, про оператор присваивания:
12.8/19
An overloaded assignment operator must be declared to have only one parameter
Есть и более слабые формы will be и can be.
Очень часто разработчики компиляторов используют эти формулировки для того, чтобы определить уровень диагностики. Так что, до тех пор, пока в документе не повысится жесткость требований, трактовать отсутствие constant expression в качестве размерности массива как ошибку совсем необязательно. При этом мы не нарушим букву стандарта, следовательно останемся в рамках С++.
Это я к чему:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
но в любом случае они обязаны выдавать диагностические сообщения в ответ на формально ошибочный код.
Ошибка и расширенное поведение - это разные вещи. Плюс к этому, по цитатам выше видно, что стандарт не накладывает требований "обязан" (must) на размерность массива, оставляя лишь более слабое "должен" (shall).
0
programina
26.10.2014, 04:22
  #30

Не по теме:

Кстати, а правда ли, что от прописывания -std=c++11 GCC становится более плюсистым? )

0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.10.2014, 04:49 31
Цитата Сообщение от DrOffset Посмотреть сообщение
Не выдает, в этом и дело.
Даже в режиме -std=c++11, который как бы намекает нам на то, какой язык мы используем, диагностика не выдается и код компилируется. Вот пруф. Чтобы он начал выдавать предупреждение, нужно включить флаг -pedantic, или конкретно -Wvla. Переключения в режим С++11 или С++03, как видно, недостаточно.
Хорошо, пусть будет недостаточно. Действительно нужен флаг '-pedantic' или '-pedantic-errors' - флаги, которые были введены в GCC специально для того, чтобы требовать стандартного поведения.

Цитата Сообщение от DrOffset Посмотреть сообщение
Эта игра слов мне не нравится и вот почему:
1. gnu++ - это не язык, а набор расширений, которые реализует компилятор для с++.
Термин GNU++ выдумал не я. Именно так данный диалект именуется в опциях GCC.

Цитата Сообщение от DrOffset Посмотреть сообщение
2. Если некоторое множество расширений входит в компилятор по-умолчанию, это совершенно не значит, что данный компилятор не является компилятором С++.
А это здесь к чему? Я такого никогда не говорил. Я, кажется, ясно сказал выше, что компиляторы C++ могут реализовывать какие угодно расширения. В том числе и по умолчанию. Однако, стандарт языка четко требует, чтобы ill-fomed код всегда сопровождался диагностическим сообщением.

Цитата Сообщение от DrOffset Посмотреть сообщение
Компилятором С++ не является только тот компилятор, который не реализуется стандарт С++. А в стандарте С++ нет никаких явных запретов на расширения,
Верно. Более того, есть явное разрешение на расширения. Но к чему вы мне об этом сообщаете?

А вот что в стандарте есть, так это требование диагностики ill-formed кода, за исключением мест, где стандарт явно разрешает диагностики не делать.

Цитата Сообщение от DrOffset Посмотреть сообщение
так же, как нет конкретных требований для диагностики (есть рекомендации, более или менее жесткие, но нет конкретных указаний: "выдать ошибку" или "выдать предупреждение"). Следовательно тезис про то, что G++ - это не компилятор С++ ошибочен.
А вот тут уже пошла ерунда. Во-первых, чего стандарт С++ действительно не содержит, так это разделения на "ошибки" и "предупреждения". Такого разделения в С++ не существует. В С++ существует только понятие диагностического сообщения.

Во-вторых, стандарт С++ содержит совершенно четкое требование на эту тему

8 A conforming implementation may have extensions (including additional library functions), provided they
do not alter the behavior of any well-formed program. Implementations are required to diagnose programs
that use such extensions that are ill-formed according to this International Standard
. Having done so, however,
they can compile and execute such programs
Цитата Сообщение от DrOffset Посмотреть сообщение
Хочу также напомнить вот что: в стандарте существует практика указания на жесткость требований, посредством использования определенных форм модальных глаголов.
Совершенно верно. Глаголы "shall" и "must" обозначают максимально жесткое безусловное требование. Глагол "should" обозначает рекомендацию. Документ, который определяет значения этих терминов для всех стандартов - это RFC 2119: http://www.ietf.org/rfc/rfc2119.txt

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот например про массивы:
8.3.4
If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Вот именно! Вы, надеюсь, видите, что в данном случае использована форма "shall"?

Цитата Сообщение от DrOffset Посмотреть сообщение
Очень часто разработчики компиляторов используют эти формулировки для того, чтобы определить уровень диагностики. Так что, до тех пор, пока в документе не повысится жесткость требований, трактовать отсутствие constant expression в качестве размерности массива как ошибку совсем необязательно.
Это опять какая-то чепуха. Требование константности размера в декларации сделано с максимально возможным уровнем жесткости: "shall be". Его невозможно никуда "повысить".

Цитата Сообщение от DrOffset Посмотреть сообщение
Ошибка и расширенное поведение - это разные вещи. Плюс к этому, по цитатам выше видно, что стандарт не накладывает требований "обязан" (must) на размерность массива, оставляя лишь более слабое "должен" (shall).
А, вот в чем ваша ошибка! Вы очевидно перепутали "shall" и "should". Повторяю еще раз "shall be" - это максимальный уровень жесткости требования в стандарте С++ (и в аналогичных документах), равный по строгости "must". Еще раз отсылаю вас к истокам: http://www.ietf.org/rfc/rfc2119.txt

1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the definition is an absolute requirement of the specification.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2014, 04:50 32
Цитата Сообщение от programina Посмотреть сообщение
Чисто:
А как должно быть, если нет:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
-pedantic
?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
26.10.2014, 05:00 33
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Термин GNU++ выдумал не я
Да это понятно, только в том же мане GCC написано, что диалект GNU всегда базируется на одном из стандартов (либо C либо C++). Я это указал к тому, что G++ - это С++ с расширениями, диалект, а не другой язык.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А вот тут уже пошла ерунда. Во-первых, чего стандарт С++ действительно не содержит, так это разделения на "ошибки" и "предупреждения". Такого разделения в С++ не существует. В С++ существует только понятие диагностического сообщения.
Почему ерунда? Я как раз именно о выделенном и говорил.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы очевидно перепутали "shall" и "should".
Да, похоже именно в этом.
Признаю, я действительно довольно давно смотрел эти документы и некоторые вопросы забылись.
Пусть так, в этом вопросе я не прав.

Т.е. как в таком случае следует понимать утверждение про g++? Он компилятором С++ является, только если указан ключ -pedantic? Именно с этим я и не согласен. Можно, в связи с вышеизложенным считать, что имеется ошибка в системе диагностики компилятора, которая приводит к отсутствию сообщения на обязательное требование стандарта, но никак не считать на этом основании, что g++ - это не компилятор С++.
Просто если следовать предложенной формулировке, то на свете не найдется ни одного компилятора С++, потому что у каждого есть какие-либо расширения, в том числе неотключаемые.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 05:00 34
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
флаг '-pedantic' или '-pedantic-errors' - флаги, которые были введены в GCC специально для того, чтобы требовать стандартного поведения.
Я уже написала выше что-почем:
Цитата Сообщение от programina Посмотреть сообщение
Это значит, что GCC не морочит голову лишними предупреждениями.
Если вы хотите морочить себе голову, то включите дополнительно флаги: -Wall, -Wextra, -Weffc++
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
26.10.2014, 05:14 35
Цитата Сообщение от programina Посмотреть сообщение
Если вы хотите морочить себе голову, то включите дополнительно флаги: -Wall, -Wextra, -Weffc++
Это у вас просто отсутствует понимание принципиальной разницы между флагом '-Wall' и флагом '-pedantic'. Читайте, как говорится, доки, они - рулез... Точнее, понимание, я думаю, мы вам уже сформировали. Но организм на первых порах по инерции сопротивляется. Это нормально.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 06:21 36
Цитата Сообщение от TheCalligrapher
Это у вас просто отсутствует понимание
принципиальной разницы между флагом '-Wall' и
флагом '-pedantic'. Читайте, как говорится, доки, они
- рулез... Точнее, понимание, я думаю, мы вам уже
сформировали. Но организм на первых порах по
инерции сопротивляется. Это нормально.
Продолжайте в том же духе, и тогда, благодаря тому "пониманию", которое вы мне сформируете, я скоро не смогу понимать разницу между компилятором и языком.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.10.2014, 09:15 37
Цитата Сообщение от programina Посмотреть сообщение
dominqnta, страховка на случай если кто-то захочет изменить значение обьекта. Компилятор выдаст предупреждение об ошибке.
Наоборот чтоб удобнее было менять на этапе разработки. Вот смотрите: приняли Вы какие то магические числа, например, 7 - это показать окно, 1 - скрыть, 0 - мигнуть на панели задач, а потом, когда эта семёрка ужа валяется в тысячах мест по всему проекту, вдруг решили, что показ окна будет 1, скрытие 2, а мигание 3. Переопределив каждую константу ровно в одном месте, можно поменять её значение сразу везде. Или есть у Вас статический массив и Вы вдруг через 5 версий программы решаете, что его надо увеличить его в 256 раз. Тоже удобно: поменял в одном месте и готово.

Добавлено через 3 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
в стандарт С99 включено понятие массива переменной длины.
Но не так же.
C++
1
2
3
4
int n=10;
int a[n];
...
n=20;// По-вашему в этом месте измениться размер массива?
0
26.10.2014, 09:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2014, 09:15
Помогаю со студенческими работами здесь

встроенные константы в С++ (pi e)
Подскажите, существуют ли в С++ встроенные константы. Например pi=3.14.... или e=2.71.... ...

Статическе константы
Для чего используют статические константы?

Экспоненциальные Константы
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же...

New, константы, указатели
Как продолжить? const int * const* *const* * * x = new В принципе, классика, но я не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru