C Урок 13. Константы



Кроме переменных разного типа, а также массивов, для представления в программе существуют ещё и константы.

Константа — это значение, которое впоследствии в процессе программы не может быть изменено.

Константами мы уже, того не замечая, давно уже пользуемся в наших уроках. Мы использовали обычные целые и дробные числа, строки в кавычках, не используя при этом переменные. Это и были константы.

Константы, как и переменные, также могут иметь различный тип.

 

Целочисленный тип

 

Как и переменные, константы могут иметь, к примеру, целочисленный тип.

Этот тип используется в программе для представления в программе целых значений.

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

Десятичные константы — последовательность цифр от 0 до 9, которая начинаются с цифры, отличной от нуля. Например, -54, 3, 15, 4321.

Восьмеричные — последовательность цифр от 0 до 7, которая всегда начинаются с цифры 0. Например, 0100, 03, 00, 04321.

Шестнадцатеричные — последовательность шестнадцатеричных цифр от 0 до F, которая в начале предваряется символами 0x. Причём, если у цифр будет буквенный вид (от A до F), то они могут выводиться как в нижнем, так и верхнем регистрах. Например, 0xFF, 0xabce, 0x01, 0x1A3C.

Также, как и переменные, целочисленные константы могут различаться и по размеру занимаемой памяти и по наличию или отсутствию знака, в связи с этим, они могут иметь определённый суффикс (постфикс).

Тип int — суффикса нет. Например 0, 50, 123456, 0xFFDDAABB.

А если нам нужно будет объявить беззнаковую константу, то мы уже добавляем суффикс u (U). Например, 0U, 1234u, 0xFFAACCBBU, 043210u.

Также мы можем выделить 8 байт под нашу константу, то есть объявить её типа long, добавив суффикс l (L).Например, 0L, 1234l, 0x10AADD00FFAACCBBL, 0123456L.

Можно и комбинировать ибо константа может иметь беззнаковый тип unsigned long. Например, 10UL, 412343ul, 0xFEAADD00FFAACCBBUL, 0123456UL.

 

Вещественный тип

 

Также константы могут быть и вещественного типа или с плавающей точкой.

Представляется такая константа в виде числа с плавающей точкой и по умолчанию, если не применять никаких суффиксов, ей назначается тип double (двойная точность). Состоит такая константа из целой части, точки, дробной части, символа экспоненты с самой экспонентой, которая может быть со знаком минус. Причём, эти пять видов представления не обязательно могут быть использованы все. Может отсутствовать экспонента, точка, дробная часть и даже целая часть.

Вот примеры констант с плавающей точкой (вещественного типа):

 

123.321, .012, 1.2345E-20, 321E15, .321E-9, 1234.

 

Если мы хотим использовать другой вещественный тип (float или long double), то для этого мы используем суффикс f (F) или l (L)

123.321f, .012L, 1.2345E-20l, 321E15L, .051E-9f, 1234567.L

 

Символьный тип

 

Константы могут также представлять и символы. Для этого они заключаются в символы апострофа

 

'\0', '0', 'n', '\t', '\n', '\r', 's', '3', 'A', 'Z', '\a', '\v'

 

Константы с символом обратного слэша (\) являются управляющими символами. Мы с ними также раньше встречались, например, переводя каретку и перенося строку.

Каждая символьная константа имеет код, например:

\n0x0A — перевод строки,

\a0x07 — звуковой сигнал,

\r0x0D — возврат каретки,

Z0x5A — буква Z.

 

Строковый тип

 

Константы строкового типа имеют вид набора (последовательности) символов, заключённого в кавычки. Кавычки, соответственно в памяти не хранятся, они служат только для обозначения строкового типа.

В конце всего набора символов (строки) компилятор всегда добавляет код 0 ('\0'), чтобы программе в процессе исполнения было легче определить окончание строки.

Вот примеры строковых констант

 

«Hello, World!!!»

«Hello\r\n»

 

Именованные константы

 

Если мы используем константы, не объявляя их заранее, а пишем прямо в выражениях в том виде, котором мы их только что рассмотрели, то это такие константы будут являться неименованными.

Также мы можем константы заранее объявить, тогда это уже будут именованные константы.

Такие константы мы можем объявить двумя способами.

Первый способ — директива препроцессора #define.

Используется она следующим образом

 

#define VAR_CONST1 15

 

После ключевого слова #define следует имя константы, а затем её значение. В результате этого впоследствии, если компилятор увидит где-то в коде данное имя, то он вместо него просто-напросто будет подставлять значение 15

 

printf("Constant value is %d", VAR_CONST1);

 

Вот ещё примеры таких констант

 

#define CONST0 0x00000000U

#define CONST1 0x00000001U

#define CONST2 0x00000002U

#define CONST4 0x00000004U

#define CONST8 0x00000008U

 

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

 

 

Также такой вид объявления констант называют макросом, макроподстановкой или дефайновой заменой. В макросах помимо констант в значениях могут использоваться другие подстановки, мы с ними ещё встретимся впоследствии.

Второй способ объявления констант похож на объявление переменных, только перед типом мы ещё добавляем ключевое слово const

 

const int n = 0xFFFF;

 

В дальнейшем мы данную константу с именем n можем использовать в нашем коде, например вот так

 

printf("Constant value is %ld", n);

 

Соответственно, изменить мы также константу n не можем по определению.

Такой способ объявления, как правило, больше нашел применение в языке C++, хотя в последнее время вполне применяется и в классическом C. Преимущество его по сравнению с дефайновой заменой то, что мы можем явно указать тип константы.

Думаю, на этом нам хватит теории, перейдём к практической части. Хоть мы и пользуемся константами практически в каждом уроке, там ещё есть над чем поразмыслить.

Как обычно, проект мы сделаем из проекта MYPROG12 прошлого занятия и имя ему присвоим MYPROG13.

Откроем файл main.c и в функции main(), как обычно, удалим весь код тела кроме возврата нуля, останется от него вот это

 

int main()

{

   return 0; //Return an integer from a function

}

Удалим также все остальные (кроме main()) функции вместе с прототипами. Сначала поработаем с целыми типами.

Сначала неименованные константы.

Выведем обычное число типа int. Как мы знаем — это целочисленный тип для констант по умолчанию, поэтому суффиксов никаких мы не используем

 

 

Проверим наш код

 

 

Теперь попробуем константу объявить заранее, причём мы её объявим локально, в функции main()

 

 

Затем выведем её значение в консоль. Предыдущий вывод константы закомментируем. Впоследствии я об этом писать не буду, чтобы не плодить лишнюю информацию, и будем так делать постоянно в рамках данного урока

 

 

Проверим, как это работает

 

 

Всё так же отлично выводится.

 

 

Давайте для убеждения в том, что у нас это не переменная, а именно константа, попробуем изменить её значение

 

 

Попробуем собрать код

 

 

Мы получили ошибку, что переменная n у нас только для чтения — это и есть константа.

Теперь объявим константу способом макроподстановки

 

 

Аналогично покажем её значение в функции main()

 

 

Проверим работу нашего кода

 

 

Далее попробуем использование констант целых типов long и unsigned long.

Для простоты мы константы объявлять больше не будем, мы теперь прекрасно знаем как это делается и будем использовать их в неименнованном виде. Данные будем выводить в десятичном виде

 

 

Посмотрим вывод в консоли, собрав предварительно код

 

 

Теперь попробуем вывести несколько констант вещественного типа, вернее мы выведем два разных числа, но представим их сначала типом double, а потом float

 

 

Посмотрим результат

 

 

Сразу видно, как упала точность в последних двух числах.

Теперь выведем символьные константы, причём выведем сначала сами символы, а затем их коды

 

 

А вот результат

 

 

Также мы видим здесь, как сработал управляющий символ перевода строки.

Ну и, напоследок, строковые константы. Для разнообразия мы их сначала объявим.

Одну объявим с помощью макроподстановки

 

 

А вторую — с помощью ключевого слова const в функции main()

 

 

Затем выведем значения данных строковых констант в консоль

 

 

Посмотрим результат работы кода

 

 

Также может случиться ситуация, что нам всё-таки надо будет использовать в константе кавычки, то есть, в нашем случае, их тоже вывести в консоль. В таком случае мы используем обратный слэш. Исправим объявления констант

 

#define HELLO_CONST "\"Hello, world!!!\""

...

const char str1[] = {"\"Hello!!!\""};

 

Посмотрим, как изменится вывод в консоли

 

 

Теперь кавычки у нас тоже вывелись.

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

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование на C Следующий урок

 

Исходный код

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

C Константы

5 комментариев на “C Урок 13. Константы
  1. Андрей:

    Спасибо Вам за понятные уроки! Я не буду выделяться, у меня тоже просьба. Хочется увидеть урок про загрузчик AVR, и примеры использования. Надеюсь это будет интересно не только мне. Еще раз спасибо!!!

  2. Vladimir:

    да, очень нижние и хорошие уроки!

  3. По моему тип long 4 байта (32 бита / 8 = 4).

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*