C: Переменные

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

Язык C поддерживает несколько базовых типов данных, таких, как char, int, float и double. Существуют и дополнительные типы данных, объявляемые с использованием слов signed, unsigned и long, которые позволяют хранить в памяти значения из больших диапазонов.

Целые числа

Целочисленная переменная типа int позволяет хранить целые числа в четырех байтах памяти. При присваивании целочисленной переменной значения с плавающей точкой типа float или double, это значение будет автоматически преобразовано в целочисленное.

int count = 8;

Также в распоряжении разработчика имеются беззнаковые (unsigned int), короткие (short int),  длинные (long int) и расширенные длинные (long long int) целочисленные значения. Они могут использоваться при необходимости:

  • Переменная типа short int может хранить значения из диапазона от -32768 до 32768 и занимает два байта памяти.
  • Переменная типа unsigned short int может хранить значения из диапазона от 0 до 65535 занимает два байта памяти.
  • Переменная типа int может хранить значения из диапазона от -2147483648 до  2147483648 и занимает четыре байта памяти.
  • Переменная типа unsigned int может хранить значения из диапазона от 0 до 4294967295 и занимает четыре байта памяти.
  • Переменная типа long int может хранить значения из диапазона от -2147483648 до  2147483648 и занимает четыре байта памяти на 32-битных системах и значения из диапазона от -9223372036854775807 до 9223372036854775807 и занимает восемь байт памяти на 64-битных системах.
  • Переменная типа unsigned long int может хранить значения из диапазона от 0 до 4294967295 и занимает четыре байта памяти на 32-битных системах и значения из диапазона от 0 до 18446744073709551615 и занимает восемь байт памяти на 64-битных системах.
  • Переменная типа long long int может хранить значения из диапазона от -9223372036854775807 до 9223372036854775807 и занимает восемь байт памяти на любых системах.
  • Переменная типа unsigned long long int может хранить значения из диапазона от 0 до 18446744073709551615 и занимает восемь байт памяти на любых системах.

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

long lightspeed = 299792458;
long int lightspeed = 299792458;
signed long lightspeed = 299792458;
signed long int lightspeed = 299792458;

Числа с плавающей точкой

Переменная с плавающей точкой типа float позволяет хранить вещественные числа в четырех байтах памяти.

float pi = 3.14;

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

double score = 53.92819384;

Кроме того, имеется тип данных long double для работы с вещественными числами с повышенной точностью.

Символы

Символьная переменная типа char позволяет хранить один символ в одном байте памяти. Хотя в качестве значения переменной и устанавливается символ, в памяти хранится его целочисленное представление.

char initial = 'd';

Помимо обычной символьной переменной существует знаковая (signed char) и беззнаковая (unsigned char) символьные переменные.

Строки

В языке C для строк не используется отдельного типа данных, как это делается в таких языках, как Python. Вместо этого строки представлены массивами символьных переменных.
Подробнее об этом будет рассказано в разделе «Строки».

Логические значения

Современный стандарт языка C99 включает поддержку логических переменных типа bool (принимающих значения true и false), однако в случае компиляции программы с такими переменными с помощью устаревшего компилятора будут возникать ошибки.

Новый тип данных объявлен как _Bool, хотя в случае подключения модуля <stdbool.h> тип _Bool будет эквивалентен типу bool.

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. int main()
  5. {
  6.     bool run = false;
  7.  
  8.     if (run == true)
  9.         printf("Работает...\n");
  10.     else
  11.         printf("Не работает.\n");
  12.  
  13.     return 0;
  14. }

Примечание: для использования типа bool программа должна компилироваться с параметром -std=c99.

Локальные и глобальные переменные

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

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

Статические переменные

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

Статическая переменная объявляется с помощью слова static, располагающегося перед описанием типа переменной.

static int age;

Пример:

  1. #include <stdio.h>
  2.  
  3. void stat()
  4. {
  5.     int var = 1;
  6.     static int svar = 1;
  7.  
  8.     printf("var = %d, static = %d\n", var, svar);
  9.     var++;
  10.     svar++;
  11. }
  12.  
  13. int main()
  14. {
  15.     int i;
  16.     for (i = 0; i < 5; i++)
  17.     {
  18.         stat();
  19.     }
  20.  
  21.     return 0;
  22. }

Загрузить файл исходного кода

Ключевые слова

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

  • auto
  • break
  • case
  • char
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • sizeof
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • while

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

Пример:

  1. #include <stdio.h>
  2.  
  3. int x = 5;
  4.  
  5. int main()
  6. {
  7.     int y = 8;
  8.    
  9.     printf("Глобальная переменная: %i\n", x);
  10.     printf("Локальная переменная: %i\n", y);
  11.    
  12.     return 0;
  13. }

Загрузить файл исходного кода