Как сделать константу в си

Обновлено: 02.07.2024

Пожалуйста, приостановите работу AdBlock на этом сайте.

Давайте снова обратимся к программе подсчёта чисел, сгенерированных функцией rand:

Допустим, мы хотим расширить диапазон чисел, которые генерируют программа. Вместо чисел от 0 до 2 мы хотим генерировать числа от 0 до 10 .

Для того чтобы внести в программу подобное изменение, нам необходимо заменить 3 на 11 в трёх местах в программе: в объявлении массива count , в вызове функции rand и в цикле, который выводит массив count на экран. Не очень-то удобно, особенно если таких мест будет очень много. Легко запутаться и что-нибудь пропустить.

Синтаксис директивы define

В конце не нужно ставить ; . Между именем и значением не нужно ставить = .

Надеюсь, вы помните, что программа компилируется в машинный код с помощью компилятора? На самом деле этот процесс довольно сложный, да и компилятор состоит из нескольких частей. Одна из частей компилятора – препроцессор. Он обрабатывает текст программы и подготавливает его к компиляции. Одна из функций препроцессора – подключение файлов, указанных в директивах include . Другая функция – это обработка инструкций define .

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

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

Давайте посмотрим на нашем примере.

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

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

После того как мы запустим процесс компиляции, над программой начнёт работать препроцессор. Он подключит три заголовочных файла. После этого вместо имён EXPERIMENTS и NUMBERS произойдёт подстановка значений 1000000 и 3 , соответственно.

После окончания работы препроцессора этот кусочек программы будет выглядеть вот так:

В примере выше мы используем именованные константы в качестве, так сказать, настроек (параметров) программы. Меняя значения этих параметров мы изменяем саму программу. Например, меняя значение константы NUMBER мы изменяем количество случайных опытов. Это стандартный приём в программировании на Си. Использование данного приёма позволяет писать более понятный код, который, кроме того, будет легко изменить под условия конкретной задачи.


Константа – это величина (число или символ), которая при выполнении программы всегда остаётся неизменной, т. е. не может изменяться во время выполнения программы. В зависимости от значения константы, компилятор самостоятельно присваивает ей тот или иной тип (char, int и т. д.).

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

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

Типы данных можно разделить условно на три группы:

1. целые – данные целого типа,
2. вещественные – данные, которые могут иметь дробную часть,
3. символы – данные типа char, которые представляют собой какой-то символ и занимают в памяти всего один байт. Также char можно считать целым типом малой величины, так как зачастую его используют в этом качестве, когда хотят оперировать малыми значениями, чтобы сэкономить память.

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

Тип Размер в байтах (битах) Интервал изменения
unsigned char 1 (8) от 0 до 255
signed char (char) 1 (8) от -128 до 127
unsigned short 2 (16) от 0 до 65 535
signed short (short) 2 (16) от -32 768 до 32 767
unsigned int (unsigned) 4 (32) от 0 до 4 294 967 296
signed int (int) 4 (32) от -2 147 483 648 до 2 147 483 648
unsigned long 4 (32) от 0 до 4 294 967 295
signed long (long) 4 (32) от -2 147 483 648 до 2 147 483 647
unsigned long long 8 (64) от 0 до 18 446 744 073 709 551 615
signed long long (long long) 4 (32) от -9 223 372 036 854 775 808
до 9 223 372 036 854 775 807
float 4 (32) от 3.4Е-38 до 3.4Е+38
double 8 (64) от 1.7Е-308 до 1.7Е+308
long double 10 (80) от 3.4Е-4932 до 3.4Е+4932

Приведём примеры объявления и определения переменных. В Си это осуществляется в следующей форме:

int i, n; // i и n объявлены как переменные целого числа типа int

Далее этим числам можно присвоить определённые значения:


Точно также это выглядит и для символьных переменных:

char sym1, sym2 ; // sym1 и sym2 объявлены как переменные типа char
sym1 = 'c' ; sym2 = 'f' ; // и им присвоены символьные значения c и f


Начальное значение может быть присвоено переменной и сразу в момент её объявления в форме: тип_переменной имя_переменной = значение;
Для приведённых выше примеров это будет выглядеть следующим образом:

int i = 0 , n = 154 ;
char sym1 = 'c' , sym2 = 'f' ;


Работая с вещественными переменными (float, double, long double), при присвоении им значений обязательно присутствие десятичной точки либо экспоненциальной формы в записи, а для "float" ещё и суффикса f. Например:

float f1 = 120.f ; // f1 =120 – переменная типа float
double f2 = 30.0 ; либо double f2 = 3e+1 ; // f2 =30 - переменная типа double

Для того, чтобы функция использовалась в константном выражении, то есть, вычислялась компилятором, необходимо определить её со спецификатором constexpr .

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

const

Объекты со спецификатором const не могут быть изменены, а также должны быть инициализированы.

Поскольку объекты со спецификаторов const не могут быть изменены, то следующий код будет ошибочным:

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

При использовании указателя задействуются два объекта: сам указатель и объект, на который указывает. Префиксное' объявление указателя с const делает константным объект, а не указатель. Чтобы объявить как const сам указатель, а не объект, на который он указывает, необходимо поместить const после символа указателя. Например:

Местоположение const относительно базового типа не принципиально, поскольку не существует типа данных const*. Принципиальным является положение const относительно символа *. Поэтому возможны следующие записи:

Объект, который является константой при доступе через один указатель, может быть изменяемым при доступе иными способами. Это особенно полезно для аргументов функции. Объявляя аргумент указателя как const , функции запрещается изменять объект, на который указывает. Например:

Первая версия используется для строк, элементы которых не должны быть изменены функцией и возвращает указатель на const, который не позволяет изменять результат. Вторая версия используется для изменяемых строк.

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

constexpr

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

Существует множество причин, по которым кому-то может понадобиться именованная константа, а не буква или значение, хранящееся в переменной:

  1. Именованные константы упрощают понимание и поддержку кода.
  2. Переменная может быть изменена (поэтому мы должны быть более осторожными в наших рассуждениях, чем для константы).
  3. Язык требует постоянных выражений для размеров массивов, меток case и аргументов значений шаблона.
  4. Программисты встраиваемых систем любят помещать неизменяемые данные в постоянное запоминающее устройство. Потому что доступная только для чтения память дешевле, чем динамическая память (с точки зрения затрат и потребления энергии) и часто более многочисленная. Кроме того, данные в постоянной памяти защищены от большинства сбоев системы.
  5. Если инициализация выполняется во время компиляции, то в многопоточной программе системе не может быть никаких расхождений данных.
  6. Выполнение вычислений на этапе компиляции улучшает производительность программы.

Значение constexpr вычисляется во время выполнения компиляции, и если оно не может быть вычислено, то компилятор выдаст ошибку.

Возможности константных выражений достаточно велики, поскольку имеется возможность использовать целочисленнные типы данных, данные с плавающей точкой, перечисления, а также операторы, которые не изменяют значения переменных (такие как +, ? и [] , но не = или ++ )

Рекомендуем хостинг TIMEWEB

Рекомендуем хостинг TIMEWEB

Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Как следует из названия, константы имени задаются таким переменным или значениям в языке программирования C / C ++, которые нельзя изменить после их определения. Это фиксированные значения в программе. Могут быть любые типы констант, такие как целые числа, числа с плавающей запятой, восьмеричные, шестнадцатеричные, символьные константы и т. Д. Каждая константа имеет некоторый диапазон. Целые числа, которые слишком велики, чтобы поместиться в int, будут считаться длинными. Теперь есть различные диапазоны, которые отличаются от битов без знака до битов со знаком. Под битом со знаком диапазон int изменяется от -128 до +127, а под битом без знака int варьируется от 0 до 255.


Определение констант:
В программе C / C ++ мы можем определить константы двумя способами, как показано ниже:

Литералы: значения, присвоенные каждой постоянной переменной, называются литералами . Как правило, термины, константы и литералы используются взаимозаменяемо. Например, « const int = 5; «, Является константным выражением, а значение 5 называется константным целочисленным литералом.
Смотрите здесь для различных типов литералов в C ++ .

Давайте теперь узнаем о двух вышеуказанных способах в деталях:

Пример:

printf ( "Integer Constant: %d\n" ,val);

printf ( "Floating point Constant: %.1f\n" ,floatVal);

printf ( "Character Constant: %c\n" ,charVal);

using namespace std;

cout "Integer Constant: " "\n" ;

cout "Floating point Constant: " "\n" ;

cout "Character Constant: " "\n" ;


Ниже программа показывает, как использовать const для объявления клиентов разных типов данных:

const int intVal = 10;

const float floatVal = 4.14;

const char charVal = 'A' ;

const char stringVal[10] = "ABC" ;

printf ( "Integer constant:%d \n" , intVal );

printf ( "Floating point constant: %.2f\n" , floatVal );

printf ( "Character constant: %c\n" , charVal );

printf ( "String constant: %s\n" , stringVal);

using namespace std;

const int intVal = 10;

const float floatVal = 4.14;

const char charVal = 'A' ;

const string stringVal = "ABC" ;

cout "Integer Constant: " "\n" ;

cout "Floating point Constant: " "\n" ;

cout "Character Constant: " "\n" ;

cout "String Constant: " "\n" ;


Выход:

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Читайте также: