Как сделать переменную константой c

Обновлено: 05.07.2024

В этой статье будут рассмотрены типы переменных в языке С (Си) для микроконтроллеров AVR, объявление переменных, способы задания констант, будет дан обзор арифметических операций языка С, присваивания, инкремента и декремента.

Переменные

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

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

В языке С (Си) к именам переменных предъявляются следующие требования:

  • можно использовать строчные и прописные буквы, цифры и символ подчёркивания (в С имеет статус буквы);
  • первым символом в имени переменной обязательно должна быть буква;
  • не допускается использование пробелов в имени переменной;
  • длина имени переменной не ограничена;
  • имя переменной не должно совпадать с зарезервированными ключевыми словами языка Си;
  • заглавные и строчные буквы в именах переменных различаются, к примеру, переменные a и A – это разные переменные.

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

Зарезервированные ключевые слова в языке С

Чтобы начать пользоваться переменной она обязательно должна быть объявлена. Обычно объявления переменных производятся в начале функций (хороший стиль), но также можно производить их объявление в любом месте тела функции.

При объявлении переменной вы обязательно должны указать ее тип. В зависимости от типа переменной компилятор резервирует ей место в памяти. Наиболее часто используемыми типами данных в языке Си для микроконтроллеров AVR являются char (символьный тип) и int (целочисленный тип).

Типы переменных

Тип char

Символьный тип (char) является самым экономным типом данных в языке С поскольку использует всего один байт (8 бит) в памяти (микроконтроллера). Может быть знаковым (обозначается как "signed char") и беззнаковым ("unsigned char"). Соответственно, в переменной char знакового типа можно хранить значения в диапазоне от -128 до +127, а в переменной беззнакового типа - от 0 до 255.

Тип int

Переменная целого типа int может быть short (короткой) или long (длинной). При этом модификаторы short и long ставятся после ключевых слов signed или unsigned, поэтому получаем такие типы данных как signed short int, unsigned short int, signed long int, unsigned long int.

Если используется модификатор short, то под хранение переменной целого типа с таким модификатором отводится 2 байта (16 бит). Соответственно, для unsigned short int получаем диапазон хранимых значений от 0 до 65535, а для signed short int - от -32768 до +32767.

При объявлении переменной типа signed short int ключевые слова signed и short можно опускать, поэтому чаще всего при объявлении подобных переменных просто пишут слово int. Вместо int также можно писать просто short, но этим мало кто пользуется, большинство программистов привыкли именно к int.

Переменная типа long int (знаковая (signed) или беззнаковая (unsigned) занимает уже 4 байта (32 бита) в памяти, поэтому диапазоны значений переменных для этих типов будут составлять, соответственно, от -2147483648 до 2147483647 и от 0 до 4294967295.

В языке С существуют еще переменные типа long long int, для хранения которых выделяется 8 байт памяти (64 бита), но вряд ли когда-нибудь в программах для микроконтроллеров у вас возникнет необходимость в использовании столь больших чисел.

Таблица со всеми возможными целыми типами языка С и их параметрами приведена на следующем рисунке.

Типы переменных в языке С

Объявление переменных

Переменные в языке С объявляют в операторе описания. Оператор описания состоит из спецификации типа и списка имён переменных, разделённых запятой. В конце обязательно ставится точка с запятой.

Объявление переменной имеет следующий формат:

[модификаторы] спецификатор_типа идентификатор [, идентификатор] .

Модификаторы - ключевые слова signed, unsigned, short, long.
Спецификатор типа - ключевое слово char или int, определяющее тип объявляемой переменной.
Идентификатор - имя переменной.

Примеры объявления переменных:
char s;
int x, y, z;
unsigned long long t;

Инициализация значения переменной при объявлении

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

С помощью данной записи мы объявляем переменную a целого типа и сразу же в нее записываем число 100.

При этом желательно для улучшения читабельности программы не смешивать инициализируемые переменные и просто объявляемые в одной строке.

Константы

В языке С переменную любого типа можно объявить как немодифицируемую, то есть значение которой в дальнейшем невозможно будет изменить – фактически получаем переменную, доступную только для чтения. Сделать это можно с помощью добавления ключевого слова const к спецификатору типа. При этом полный список модификаторов для констант можно не указывать – нужный для них тип определяется исходя из их значения. К примеру:

const long int z = 25;
const x = -50; // подразумевается const int x=-50
const y = 100000; // подразумевается const long int y=100000

Присваивание

Для присваивания в языке С служит знак "=" – не путать со знаком сравнения двух чисел. При использовании данного знака производится вычисление выражение, стоящего справа от знака присваивания, и полученное значение присваивается переменной, стоящей слева от знака присваивания. При этом старое значение переменной стирается и заменяется на новое.

Примеры:
y = 6 + 8; // сложить значения 6 и 8,
// результат присвоить переменной y (записать в переменную y)

c = b + 5; // прибавить 5 к значению, хранящемуся в переменной b,
// полученный результат присвоить переменной c (записать в переменную b)

d = d + 2; // прибавить 2 к значению, хранящемуся в переменной d,
// полученный результат присвоить переменной d (записать в переменную d)

В правой части значение переменной может быть использовано несколько раз, например:

Арифметические операции

Арифметические операции языка Си представлены в таблице на следующем рисунке.

Арифметические операции в языке С

Примеры:
z = y + 7; // к значению, хранящемуся в переменной y, будет прибавлено число 7,
// полученный результат будет записан в переменную z

k = m * n; // значения переменных m и n будут перемножены,
// результат будет записан в переменную k

t = t - 1; // от значения, хранящегося в переменной t, будет отнято 1
// результат будет записан в переменную t

Дополнительные способы присваивания

Кроме простого оператора присваивания "=", в языке программирования С существует еще несколько комбинированных операторов присваивания: "+=", "-=", "*= m += n; // то же, что и m = m + n; - сложить m и n
// и поместить результат в переменную m

m -= n; // то же, что и m = m - n; - отнять от m значение n
// и поместить результат в переменную m

m *= n; // то же, что и m = m * n; - умножить m на n
// и поместить результат в переменную m

m /= n; // то же, что и m = m / n; - разделить m на n
// и поместить результат в переменную m

m %= n; // то же, что и m = m % n;
// вычислить целочисленный остаток от деления m на n
// и поместить результат в переменную m

Инкремент и декремент

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

Инкремент – операция увеличения значения переменной на 1.

Пример использования:
z++; // значение переменной z будет увеличено на 1

Декремент - операция уменьшения значения переменной на 1.

Пример использования:
z- -; // значение переменной z будет уменьшено на 1

Допустим, что значение переменной n было равно 7. Тогда в m будет записано значение 7, после чего значение переменной n будет увеличено на 1. Таким образом, в m будет 7, а в n - 8.

Если значение n было равно 3, то сначала будет выполнено уменьшение n до 2, а затем это значение будет присвоено переменной m. Таким образом, n и m будет присвоено значение 2.

Комментарии

Переменные и константы в языке С (Си) для микроконтроллеров AVR — 4 комментария

Уважаемый Admin, пытаюсь учится программированию AVR процессоров на языке Си в CvAvr.Не могу понять, почему не правильно работает простейшая программа.
volatile int k=0;
volatile signed int dif=0;
volatile signed int a=0;
volatile signed int b=0;
dif=(a-b)
Ожидаю получить при b>a отрицательный dif, но эта в-на всегда положительна. Пытался подставлять тип signed в выражение, но то же не помогло.
Что я делаю не так?

Добрый вечер, попробуйте использовать полное название типа - signed short int или signed long int, или просто int, без signed. Также попробуйте убрать volatile - для Ардуино эта приставка часто используется, а вот в программах для микроконтроллеров AVR что то особо не припомню ее, не уверен что она будет корректно обрабатываться во всех средах.

Добрый день.
Извините, что напрасно отнял у Вас время. Нашёл свою ошибку. Ограничил величину dif=(a-b) снизу 0.
Поэтому она ниже не шла.
С уважением. Валерий.

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

[Daozy] [Введение в язык C] Урок 3 Переменные, константы, модификаторы типов

Академия Се Е - Введение в курс языка Си

Переменная C

На самом деле переменная - это просто имя области памяти, которой программа может управлять. Каждая переменная в C имеет определенный тип. Тип определяет размер и структуру хранилища переменных. Значения в этом диапазоне могут храниться в памяти. Имя переменной может состоять из букв, цифр и символов подчеркивания. Он должен начинаться с буквы или подчеркивания. Прописные и строчные буквы различаются, потому что C чувствителен к регистру. Исходя из основных типов, описанных в предыдущей главе, существуют следующие основные типы переменных:

Язык C также позволяет определять различные другие типы переменных, такие как перечисления, указатели, массивы, структуры, объединения и т. Д., Что будет объяснено в следующих главах. В этой главе мы сначала объясним основные типы переменных.

Определение переменной в C

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

Здесь тип должен быть допустимым типом данных C, который может быть char, w_char, int, float, double, bool или любым определяемым пользователем объектом, variable_list может состоять из одного или нескольких имен идентификаторов, нескольких идентификаторов Разделите запятыми. Вот несколько правильных утверждений:

Строка int i, j, k; объявляет и определяет переменные i, j и k, которые инструктируют компилятор создавать переменные с именами i, j и k типа int.

Переменные можно инициализировать во время объявления (укажите начальное значение). Инициализатор состоит из знака равенства, за которым следует постоянное выражение, как показано ниже:

Вот несколько примеров:

Объявление переменной в C

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

Есть два случая объявления переменных:

  1. Один из них - необходимость создания места для хранения. Например: int пространство для хранения было создано при его объявлении.
  2. Другой не требует создания места для хранения, используя ключевое слово extern для объявления имени переменной без ее определения. Например: extern int a Переменная a может быть определена в других файлах.

Если нет ключевого слова extern, это определение переменной.

Анализ случая

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

Когда приведенный выше код скомпилирован и выполнен, он даст следующие результаты:

Значения L и R в C

В C есть два типа выражений:

  1. Lvalue (lvalue): выражение, указывающее на ячейку памяти, называется выражением lvalue. Левое значение может отображаться слева или справа от номера назначения.
  2. Rvalue: термин rvalue относится к значению, хранящемуся по некоторому адресу в памяти. Rvalue - это выражение, которое не может быть присвоено, то есть rvalue может отображаться справа от номера назначения, но не может появляться слева от номера назначения.

Переменная является lvalue, поэтому она может отображаться слева от номера присваивания. Числовые литералы являются r-значениями, поэтому они не могут быть назначены и не могут отображаться слева от номера назначения. Следующее является допустимым заявлением:

Но следующий оператор не является допустимым и вызовет ошибку времени компиляции:

Константа C

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

Целочисленная константа

Целочисленные константы могут быть десятичными, восьмеричными или шестнадцатеричными константами. Префикс определяет систему счисления: 0x или 0X означает шестнадцатеричное, 0 означает восьмеричное, без префикса, по умолчанию означает десятичное.

Целочисленная константа также может иметь суффикс. Суффикс представляет собой комбинацию U и L. U представляет собой целое число без знака (без знака), а L представляет собой длинное целое число (long). Суффикс может быть в верхнем или нижнем регистре с буквами U и L в любом порядке.

Вот несколько примеров целочисленных констант:

Ниже приведены примеры различных типов целочисленных констант:

Плавающая константа

Константы с плавающей запятой состоят из целой части, десятичной точки, десятичной части и экспоненты. Для представления констант с плавающей запятой можно использовать десятичную или экспоненциальную форму.
При выражении в десятичной форме оно должно включать целую часть, десятичную часть или и то, и другое. При использовании экспоненциальной формы она должна включать десятичную точку, показатель степени или и то, и другое. Знаковые показатели вводятся буквами e или E.
Вот несколько примеров констант с плавающей запятой:

Константа символа

Символьная константа может быть обычным символом (например, 'x'), управляющей последовательностью (например, '\ t') или общим символом (например, '\ u02C0').

В языке C есть некоторые специфические символы. Когда им предшествует обратная косая черта, они имеют особое значение и используются для представления символов новой строки (\ n) или табуляции (\ t). В следующей таблице перечислены некоторые такие коды escape-последовательностей:

В следующем примере показаны некоторые символы escape-последовательности:

Когда приведенный выше код скомпилирован и выполнен, он даст следующие результаты:

Строковая константа

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

Определить константу

В C есть два простых способа определения констант:

Подробнее см. В следующем примере:

Вы можете использовать префикс const для объявления констант определенного типа следующим образом:

Подробнее см. В следующем примере:

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

Модификация типа

Определите объем (видимость) и жизненный цикл переменных / функций в программах на языке C. Эти модификаторы помещаются перед типами, которые они изменяют. Модификаторы типа, доступные в программах на C, перечислены ниже:

Модификаторы по умолчанию для всех локальных переменных

В приведенном выше примере определяются две идентичные переменные, auto может использоваться только в функциях, то есть auto может изменять только локальные переменные.

register

Используется для определения локальных переменных, хранящихся в регистрах вместо ОЗУ. Это означает, что максимальный размер переменной равен размеру регистра (обычно слова), и к нему нельзя применить унарный оператор '&' (поскольку он не имеет ячейки памяти).

static

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

Следующие примеры демонстрируют применение статических измененных глобальных переменных и локальных переменных:

В этом примере count может использоваться в функции как глобальная переменная.После того, как thingy будет украшен static, он не будет сбрасываться при каждом вызове.
Возможно, вы все еще не можете понять этот пример, поскольку я использовал функции и глобальные переменные, эти две концепции до сих пор не объяснены. Даже если вы не можете полностью понять это сейчас, это не имеет значения, мы подробно объясним это в следующих главах. Когда приведенный выше код скомпилирован и выполнен, он даст следующие результаты:

extern

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

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

Модификатор extern обычно используется, когда два или более файла используют одну и ту же глобальную переменную или функцию, как показано ниже:
Первый файл: test.c:

Второй файл: support.c:

Здесь ключевое слово extern во втором файле используется для объявления счетчика, который был определен в первом файле main.c. Теперь скомпилируйте эти два файла следующим образом:

Примечание. Когда int count; предшествует модификатор static, на него нельзя ссылаться в файлах .c, кроме текущего файла .c, что приводит к ошибкам компиляции (запросы для разных версий компилятора могут отличаться):

Вы найдете много констант в самом framework, в классе Math, где определена константа для PI.

Но, конечно, самое интересное-объявить собственные константы. Константу можно определить в области видимости метода, например:

Однако большинство констант объявляются на уровне класса, так что они могут быть доступны (но не изменены, конечно) из всех методов класса и даже вне класса, в зависимости от области видимости. Константа будет действовать как статический член класса, что означает, что вы можете получить к ней доступ без создания экземпляра класса. Имея это в виду, давайте попробуем полный пример, где определены две константы - личная и публичная константы:

Обратите внимание, как я определяю класс (SomeClass) с двумя константами. Первый является частным, поэтому он может быть доступен только из самого класса, но другой общедоступный. Итак, в нашем основном программном коде я обращаюсь к обеим константам по-разному - во-первых, напрямую, так как неправильный ответ общедоступен, а во-вторых, с помощью метода GetAnswer ().

Какой тип данных может быть задан как константа?

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

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

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

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

Альтернатива константе: поле readonly

Если вы ищете несколько менее ограничительную версию константы класса, вы можете взглянуть на ключевое слово readonly. Он недоступен на уровне метода, но может использоваться на уровне класса для определения поля, которое может быть изменено только во время объявления или выполнения метода конструктора класса. Таким образом, как только объект будет доступен для использования, поле readonly будет иметь одно и то же значение навсегда и не может быть изменено пользователем. Давайте попробуем:

Итак, у нас есть два поля только для чтения: первое-частное, второе-публичное (обычно у нас есть свойства для этого, но немного потерпите меня). Первый объявляется без значения (это можно сделать с полями только для чтения, в отличие от констант), а второй инициализируется немедленно. Вы также заметите, что мы используем класс DateTime в качестве типа данных и присваиваем ему непостоянное значение. Другими словами, мы делаем много вещей, которые мы не можем сделать с константами, делая поля только для чтения хорошей альтернативой константам.

Обратите внимание, как я присваиваю значение полю rightNow в конструкторе класса SomeClass. Как уже упоминалось, это последний шанс присвоить значение полю только для чтения. После этого, независимо от того, находитесь ли вы в методе внутри определяющего класса или снаружи, вы получите ошибку компиляции, если попытаетесь присвоить значение полю только для чтения.

Резюме

Константа может быть определена либо внутри области действия метода, либо на уровне класса. Это позволяет вам определить значение, которое известно уже во время компиляции и которое не может быть изменено позже. Типичными типами констант являются целые числа, числа с плавающей запятой, строки и логические значения. Если вы ищете больше гибкости, попробуйте поле только для чтения, как описано выше.

Is your preferred language not on the list? Click here to help us translate this article into your language!

К примеру мы пишем программу для вычисления параметров окружности. Есть множество значений, которые должны быть неизменными. Например математическая константа pi = 3.14. Рассмотрим реализацию простейшего калькулятора.

При попытке изменить значение переменной pi мы получим ошибку. Это и является главной особенностью констант.

В объектно — ориентированном программировании может использоваться ключевое слово readonly. В данной случае основная фишка состоит в том, что установка значения переменной может проходить не только прямым путем, как мы поступали с константами, но и при инициализации объекта. К примеру, нам для каждого объекта класса нужно установить своё значение константы. И именно для этого случая отлично подходят переменные с ключевым словом readonly. Давайте рассмотрим на примере.

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

Где можно это использовать? Да в любом месте, где по вашему мнению значение переменной не должно меняться в ходе работы программы. При этом важно не забывать различия между const и readonly.

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

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