Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
dominqnta
2 / 2 / 0
Регистрация: 26.12.2013
Сообщений: 42
Завершенные тесты: 2
#1

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

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

Скажите новичку зачем в C++ константы? И для чего они?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 15:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Константы и C++ (C++):

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

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

константы в классах - C++
в классе используется константа типа double. Как правильно задать ее? как static const double внутри класса или просто написать...

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

Экспоненциальные Константы - C++
Всем доброго времени суток. Хотелось бы спросить такую вещь. Вид Экспоненциальной Константы же такой: {E|e} Тогда такая константа что...

Определение константы - C++
Помогите составить определение следующих данных - константа pi = π = 3.14159265358 (12 значащих цифр)

36
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
14.03.2014, 16:47 #16
programina, уже выяснили. Зависит от компилятора.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
14.03.2014, 16:58 #17
Цитата Сообщение от programina Посмотреть сообщение
Странно, у меня все компилируется.
вот здесь, поднимал тему
кое-что про const
0
dominqnta
2 / 2 / 0
Регистрация: 26.12.2013
Сообщений: 42
Завершенные тесты: 2
26.10.2014, 01:19  [ТС] #18
Спасибо всем. Разобрался
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3912 / 2149 / 549
Регистрация: 18.10.2014
Сообщений: 3,756
26.10.2014, 01:41 #19
Языки С и С++ - очень сильно отличающиеся языки, в том числе и в том, что они считают константами. Поэтому перед тем, как выяснять, какой компилятор прав, а какой нет, сначала разберитесь, о каком языке вы говорите.

В языке С++ массивы бывают только константного (т.е. известного при компиляции) размера. Если ваш С++ компилятор разрешает массивы неконстантного размера без выдачи диагностического сообщения - значит это не С++ компилятор.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
26.10.2014, 02:20 #20
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если ваш С++ компилятор разрешает массивы неконстантного размера без выдачи диагностического сообщения - значит это не С++ компилятор.
Или значит, что это G++
VLA там - расширение, включенное по-умолчанию.
0
alsav22
26.10.2014, 02:45
  #21

Не по теме:

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

0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 02:52 #22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Если ваш С++ компилятор разрешает массивы неконстантного размера без выдачи диагностического сообщения - значит это не С++ компилятор
Это значит, что GCC не морочит голову лишними предупреждениями.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3912 / 2149 / 549
Регистрация: 18.10.2014
Сообщений: 3,756
26.10.2014, 03:07 #23
Цитата Сообщение от DrOffset Посмотреть сообщение
Или значит, что это G++. VLA там - расширение, включенное по-умолчанию.
Компиляторы С++ могут реализовывать какие угодно расширения, но в любом случае они обязаны выдавать диагностические сообщения в ответ на формально ошибочный код. Если какой-то компилятор С++ "расширяет" неопределенную часть спецификации языка, он может делать это молча. Но если какой-то компилятор С++ "расширяет" значение определенно ошибочного кода, он будет выдавать диагностическое сообщение.

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от programina Посмотреть сообщение
Настоящие компиляторы никому не обязаны, ни к чему не привязаны.
Да да, конечно...
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
26.10.2014, 03:42 #26
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
сообщит тот же компилятор GCC, если вы запустите его в режиме С++
Ни разу не было такого! И да, можно подробнее про переключение режимов в GCC?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3912 / 2149 / 549
Регистрация: 18.10.2014
Сообщений: 3,756
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
programina
1914 / 599 / 37
Регистрация: 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
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
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     Константы и C++
  #30

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2014, 04:22
Привет! Вот еще темы с ответами:

Не различает константы - C++
Добрый вечер. Есть константы в базовом классе:protected: ... // тут enum'ы и структуры const QString FORMAT_DIR = "format"; ...

Константы в структурах - C++
есть массив структур. допустим 10 элементов. как инициализировать 5 элементов массива константами?

Константы препроцесора - C++
А есть ли где-то список предустановленых констант препроцесора? Мне нужно узнать тип операционой системы, версию, и поочие. Есть ли где-то...

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


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

Или воспользуйтесь поиском по форуму:
30
26.10.2014, 04:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru