Язык C: константы и литералы
Константы — фиксированные величины, которые не изменяются во время выполнения программы. Эти фиксированные величины также называются литералами.
Константы могут относиться к любому из основных типов данных, например:
- целочисленная константа;
- константа с плавающей точкой;
- символьная константа;
- строковый литерал.
Используются также перечислимые константы.
С константами обращаются так же, как и с обычными переменными. Только значения констант не могут быть изменены после их определения.
Целочисленные литералы
Целочисленный литерал может быть десятичной, восьмеричной или шестнадцатеричной константой. Префикс определяет основание (радикс) целочисленной константы:
- 0x или 0X — шестнадцатеричной;
- 0 — восьмеричной;
- отсутствие префикса — десятичной.
Целочисленный литерал может также иметь суффикс. Он представляет собой комбинацию букв U и L, означающих целое беззнакового и длинного типа (соответственно). Суффикс может быть прописной или строчной буквой и располагаться в любом порядке.
Вот несколько примеров целочисленных литералов:
Ниже приведены другие примеры различных типов целочисленных литералов:
Литералы с плавающей точкой
Литерал с плавающей точкой состоит из целой части, десятичной точки, дробной части и экспоненты. Литералы с плавающей точкой можно представлять либо в десятичной форме, либо в экспоненциальной.
При представлении десятичной формы включают десятичную точку, экспоненту либо и то, и другое; а при представлении экспоненциальной формы — целую часть, дробную часть либо обе части. Знаковая экспонента обозначается символом e или E.
Вот примеры литералов с плавающей точкой:
Символьные константы
Символьные литералы заключаются в одинарные кавычки; например, ‘x’ может храниться в простой переменной типа char.
Символьный литерал может быть:
- обычным символом (например, ‘x’);
- управляющей последовательностью (например, ‘\t’);
- универсальным символом (например, ‘\u02C0’).
В языке С есть определенные символы, которые имеют особое значение, когда им предшествует обратный слэш, например, новая строка (\n) или табуляция (\t).
Вот список таких кодов управляющей последовательности:
- \\ — символ \
- \’ — символ ‘
- \” — символ “
- \? — символ ?
- \a — звуковой сигнал
- \b — возврат на одну позицию (backspace)
- \f — смена страницы
- \n — новая строка
- \r — возврат каретки
- \t — горизонтальная табуляция
- \v — вертикальная табуляция
- \ooo — восьмеричное число (от одной до трех цифр)
- \xhh … … — шестнадцатеричное число (из одной или нескольких цифр)
Ниже приведен пример, показывающий несколько символов управляющей последовательности:
Когда приведенный выше код компилируется и выполняется, выдается следующий результат:
Строковые литералы
Строковые литералы (константы) заключаются в двойные кавычки “”. Строка содержит символы, похожие на символьные литералы:
- обычные символы;
- управляющие последовательности;
- универсальные символы.
Можно разбить длинную строку на несколько строк, используя строковые литералы и разделяя их пробельными символами.
Вот примеры строковых литералов. Все три формы являются идентичными строками:
Определение констант
В языке С есть два простых способа определения констант:
- Использование препроцессора #define.
- Использование ключевого слова const.
Препроцессор #define
Ниже приведена форма использования препроцессора #define для определения константы:
Следующий пример детально объясняет эту форму:
Когда приведенный выше код компилируется и выполняется, выдается следующий результат:
Ключевое слово const
Префикс const используется для объявления констант с определенным типом следующим образом:
Пример, указанный ниже, детально объясняет эту форму:
Когда приведенный выше код компилируется и выполняется, выдается следующий результат:
Обратите внимание: хорошей практикой программирования является определение констант в ЗАГЛАВНЫХ БУКВАХ.
Как ввести константу в c
Отличительным признаком переменных является то, что мы многократно в течение работы программы можем изменять ее значение:
Здесь переменная number последовательно меняет свое значение:
В отличие от переменных значение констант устанавливается один раз при их объявлении. Для определения константы используется ключевое слово const :
Если в коде будет содержаться изменение константы, то компилятор не сможет скомпилировать подобную программу.
Как правило, в виде констант определяются такие значение, которые должны оставаться постоянными в течение работы всей программы и не могут быть изменены. Например, если программы выполняет математические операции с использованием числа PI, то было бы оптимально определить данные значение как константу, так как оно все равно в принципе неизменно:
Константы в С++
В С++ для представления константы рекомендуется использовать объявление переменной с начальным значением и ключевым словом const :
Область видимости константы такая же, как у обычной переменной. С помощью ключевого слова const можно объявить указатель на константу
const тип *ИмяПеременной;
Еще одна возможность const состоит в создании постоянного указателя на величину указанного типа
тип *const ИмяПеременной = Значение;
Использование const имеет несколько преимуществ по сравнению с #define .
- При объявлении константы с использованием const явно указывается тип величины.
- Константа, объявленная с использванием const , просто согласуется с производными типами, например, объявление массива:
Однако не любое использование #define можно исключить с помощью const . Например, нельзя объявить массив с размером, заданным через const .
Такой код работать не будет.
Перечислимый тип данных
С помощью ключевого слова enum можно объявить особый целочисленный тип с набором именованных целых констант, называемых перечислимыми константами:
С помощью такого определения создается целочисленный тип day с названиями 7 дней недели, каждое из которых является целочисленной константой.
Перечислимые константы — идентификаторы, которые по умолчанию имеют следующие значения: 0, 1, 2, 3, 4, 5, 6. Первому присваивается значение 0, и каждому последующему – на 1 больше предыдущего.
Если не устраивают значения по умолчанию, то перечислимые константы могут быть инициализированы произвольными целыми константами или константными выражениями
Урок №37. const, constexpr и символьные константы
До этого момента, все переменные, которые мы рассматривали, были обычными. Их значения можно было изменить в любое время, например:
Тем не менее, иногда полезно использовать переменные, значения которых изменить нельзя — константы.
Константы
Возьмем к примеру величину силы тяжести на Земле: 9.8м/с^2 . Она вряд ли поменяется в ближайшее время. Использовать константу в этом случае будет наилучшим вариантом, так как мы предотвратим, таким образом, любое (даже случайное) изменение этого значения.
Чтобы сделать переменную константой — используйте ключевое слово const перед типом переменной или после него. Например:
Несмотря на то, что язык C++ позволяет размещать const как перед типом данных, так и после него, хорошей практикой считается размещать const перед типом данных.
Константы должны быть инициализированы при объявлении. Изменить их значения с помощью операции присваивания нельзя:
Объявление константы без её инициализации также вызовет ошибку компиляции:
Обратите внимание, константы могут быть инициализированы и с помощью неконстантных значений:
Ключевое слово const является наиболее полезным (и наиболее часто используемым) с параметрами функций:
Таким образом, при вызове функции константа-параметр сообщает и гарантирует нам то, что функция не изменит значение переменной myValue .
Время компиляции и время выполнения
Когда вы находитесь в процессе компиляции программы, то это время компиляции (англ. «compile time»). Компилятор проверяет вашу программу на синтаксические ошибки и, если их нет, конвертирует код в объектные файлы.
Временной промежуток с момента старта выполнения программы и до момента окончания её работы называется временем выполнения программы (англ. «runtime»). Код выполняется строка за строкой.
Спецификатор constexpr
В языке C++ есть два вида констант:
Константы времени выполнения. Их значения определяются только во время выполнения программы. Переменные типа usersAge и myValue выше являются константами времени выполнения, так как компилятор не может определить их значения во время компиляции. usersAge зависит от пользовательского ввода (который можно получить только во время выполнения программы), а myValue зависит от значения, переданного в функцию (это значение также определится только во время выполнения программы).
Константы времени компиляции. Их значения определяются во время компиляции программы. Например, переменная со значением силы тяжести на Земле является константой времени компиляции, так как мы её определяем во время написания программы (до начала её выполнения).
В большинстве случаев не важно какой тип константы вы используете: времени выполнения или времени компиляции. Однако, все же есть несколько ситуаций, когда C++ может потребовать константу времени компиляции вместо времени выполнения (например, при определении длины массива фиксированного размера — мы рассмотрим это несколько позже). Так как есть 2 типа констант, то компилятору нужно постоянно отслеживать, к какому из них относится какая переменная. Чтобы упростить это задание, в C++11 добавили спецификатор constexpr, который сообщает компилятору, что текущая переменная является константой времени компиляции: