Язык С: переменные

Предыдущая часть: “Язык С: типы данных

Переменная  —  это не что иное, как именованная область памяти, которой могут манипулировать программы. Каждая переменная в языке 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 есть два вида выражений:

  1. L-значения. Выражения, которые ссылаются на область памяти, называются выражениями l-значения. L-значение может появляться как в левой, так и в правой части присваивания.
  2. R-значения. Термин r-значение относится к значению данных, которое хранится по некоторому адресу в памяти. R-значение  —  это выражение, которому не может быть присвоено значение, что означает, что r-значение может появляться только в правой части присваивания.

Переменные  —  это l-значения, поэтому они могут появляться в левой части присваивания. Числовые литералы являются r-значениями, поэтому их нельзя присвоить и они не могут появляться в левой части. Посмотрите на следующие допустимые и недопустимые операторы:

int g = 20; // допустимый оператор

10 = 20; // недопустимый оператор, который приведет к ошибке во время компиляции

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

Читайте нас в TelegramVK и Яндекс.Дзен

Предыдущая статьяMongoDB: вставка документа 
Следующая статьяИндексация строк в Rust и TypeScript в сравнениях