Предыдущая часть: “Язык С: типы данных”
Переменная — это не что иное, как именованная область памяти, которой могут манипулировать программы. Каждая переменная в языке C характеризуется:
- типом, определяющим размер и расположение памяти переменной;
- диапазоном значений, которые могут храниться в этой памяти;
- набором операций, которые можно применить к переменной.
Имя переменной может состоять из букв, цифр и символа подчеркивания. Оно должно начинаться либо с буквы, либо с символа подчеркивания. Строчные и заглавные буквы различаются, поскольку C чувствителен к регистру. Выделим основные типы переменных:
- char — целочисленный тип, представляющий обычно один октет (один восьмибитовый байт);
- int — наиболее естественный размер целого числа для компьютера;
- float — значение с плавающей запятой одинарной точности;
- double — значение с плавающей запятой двойной точности;
- void — представляет отсутствие типа.
Язык C также позволяет определять другие типы переменных (перечисление, указатель, массив, структура, объединение и т.д.), которые будут рассмотрены в последующих разделах. Здесь уделим внимание только основным типам переменных.
Определение переменных
Определение переменной указывает компилятору, где и какой объем памяти нужно создать для этой переменной. Определение переменных задает тип данных и содержит список одной или нескольких переменных этого типа следующим образом:
type variable_list;
Здесь type
должен быть допустимым типом данных языка C, включая char
, w_char
, int
, float
, double
, bool
или любой объект, определяемый пользователем; а variable_list
может состоять из одного или нескольких имен идентификаторов, разделенных запятыми. Ниже показаны некоторые допустимые объявления:
int i, j, k;
char c, ch;
float f, salary;
double d;
Строка int i, j, k;
объявляет и определяет переменные i
, j
и k
; которые инструктируют компилятор создать переменные с именами i
, j
и k
типа int
.
Переменные могут быть инициализированы (им присваивается начальное значение) в их объявлении. Блок инициализации состоит из знака равенства, за которым следует константное выражение, как показано ниже:
type variable_name = value;
Приведем примеры:
extern int d = 3, f = 5; // объявление d и f.
int d = 3, f = 5; // определение и инициализация d и f.
byte z = 22; // определение и инициализация z.
char x = 'x'; // переменная x имеет значение 'x'.
Определение без инициализации: переменные со статической длительностью хранения неявно инициализируются со значением NULL
(все байты имеют значение 0
); начальное значение всех остальных переменных не определено.
Объявление переменных
Объявление переменной подтверждает компилятору, что существует переменная с заданным типом и именем. Получив такое подтверждение, компилятор может приступить к дальнейшей компиляции, не требуя полной информации о переменной. Определение переменной имеет значение только во время компиляции: компилятору необходимо фактическое определение переменной во время сборки программы.
Объявление переменной полезно при использовании нескольких файлов и определении переменной в одном из файлов, который будет доступен во время сборки программы. Можно использовать ключевое слово extern для объявления переменной в любом месте. Хотя в своей программе вы можете объявлять переменную несколько раз, она должна быть определена только один раз в файле, функции или блоке кода.
Пример
Рассмотрим пример, где переменные были объявлены в самом верху, но определены и инициализированы внутри главной функции.
#include <stdio.h>
// Объявление переменных:
extern int a, b;
extern int c;
extern float f;
int main () {
/* объявление переменных: */
int a, b;
int c;
float f;
/* фактическая инициализация */
a = 10;
b = 20;
c = a + b;
printf("value of c : %d \n", c);
f = 70.0/3.0;
printf("value of f : %f \n", f);
return 0;
}
Когда приведенный выше код компилируется и выполняется, выдается следующий результат:
value of c : 30
value of f : 23.333334
Тот же принцип применим к объявлению функции, когда вы указываете имя функции во время ее объявления, а ее фактическое определение может быть дано в любом другом месте. Например:
// объявление функции
int func();
int main() {
// вызов функции
int i = func();
}
// определение функции
int func() {
return 0;
}
L-значения и R-значения
В языке C есть два вида выражений:
- L-значения. Выражения, которые ссылаются на область памяти, называются выражениями l-значения. L-значение может появляться как в левой, так и в правой части присваивания.
- R-значения. Термин r-значение относится к значению данных, которое хранится по некоторому адресу в памяти. R-значение — это выражение, которому не может быть присвоено значение, что означает, что r-значение может появляться только в правой части присваивания.
Переменные — это l-значения, поэтому они могут появляться в левой части присваивания. Числовые литералы являются r-значениями, поэтому их нельзя присвоить и они не могут появляться в левой части. Посмотрите на следующие допустимые и недопустимые операторы:
int g = 20; // допустимый оператор
10 = 20; // недопустимый оператор, который приведет к ошибке во время компиляции
Читайте также:
- Обучение программированию лучше начать с языка С. И вот почему
- 7 моих любимых расширений VS Code
- Курс на продуктивность: 10 бесплатных инструментов и сайтов для разработчиков
Читайте нас в Telegram, VK и Яндекс.Дзен