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

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

Краткий обзор типов данных

Основные типы данных в C:

  1. char — символ, обычно один байт
  2. int — целое число, отражает естественный размер целого числа на хост-машине
  3. float — с плавающей запятой одинарной точности
  4. double — с плавающей запятой двойной точности

Список переменных может содержать одно имя для одной переменной, например

int n;

создает переменную n типа int, символ точки с запятой является терминатором оператора в C, он отмечает конец оператора.

В качестве альтернативы;

int n b;

создает две переменные с именами n и b типа int.

Объявление переменных через список параметров

Переменные, указанные в качестве параметров функции, не требуют повторного объявления в теле используемой функции. Создадим скрипт уже_declared.c;

#include <stdio.h>
int main(int c, int a)
{
    a = 20; c = 10;
    int sum = c + a;
    printf("sum = %d\n", sum);
    return (0);
}

В нашем скрипте;

переменные c и a типа int были указаны в качестве параметров функции main, это квалифицирует их как локальные переменные.

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

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

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

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

Вот простая программа, которая возвращает сумму двух значений. Все значения хранятся в локальных переменных a, b и c в нашей основной функции;

#include <stdio.h>
int main(void)
{
    int a = 10, b = 20, c;
    c = a + b;
    printf(“The value of a = %d, b = %d and a + b = %d\n”, a, b, c);
    return (0);
}

запуск следующих выходных кодов;

The value of a = 10, b = 20 and a + b = 30

Теперь добавим в наш скрипт еще одну функцию:

#include <stdio.h>
int non_local(int c);
int main(void)
{
    int a = 10, b = 20, c;
    int d = 30, e;
    c = a + b;
    printf(“The value of e is %d\n”, non_local(c));
    return (0);
}
int non_local(int c)
{
    int d = 30;
    e = c + d;
    return (e);
}

Быстрый взгляд на наш недавно отредактированный файл;

в нашей основной функции -

  • мы добавили объявления переменных для целых чисел d и присвоили им значение 30 и еще одно целое число e.
  • мы изменили наш оператор printf, теперь требуется отображать значение e.
  • Примечание:
  1. %d — это заполнитель для значения вычисления функции non_local(c), которое дает e. c — обязательная переменная.
  2. int non_local(int c) объявляет int c локальной переменной функции non_local.
  3. e используется в non_local, но определено в main, что является хорошим рецептом для ошибки вне области действия.

В нашей функции non_local -

учитывая значение int c, обратите внимание на объявление;

int non_local(int c)
  • это говорит нам о том, что non_local требует, чтобы параметр int c выполнялся должным образом.
  • мы объявили целое число d и присвоили ему значение 30
  • мы добавляем c к d и сохраняем результат как e
  • мы возвращаем значение e.

Обратите внимание на объявление нашей функции non_local непосредственно перед основной функцией.

Попытка скомпилировать наш отредактированный скрипт возвращает следующую ошибку

local.c: In function ‘non_local’:
local.c:18:9: error: ‘e’ undeclared (first use in this function)
18 | e = c + d;
   | ^

Верный нашему слову, наш компилятор выдает ошибку: 'e' undeclared. Это говорит нам о том, что переменная e выходит за рамки при использовании в non_local. И компилятор любезно выделил строку, в которой произошла ошибка.

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

Глобальные переменные

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

Вернемся к нашему файлу local.c. Чтобы исправить ошибку, нам нужно объявить e вне тела функции. Наш фиксированный local.c будет выглядеть так:

#include <stdio.h>
int e;
int non_local(int c);
int main(void)
{
    int a = 10, b = 20, c;
    int d = 30;
    
    c = a + b;
    printf(“The value of e is %d\n”, non_local(c));
    return (0);
}
int non_local(int c)
{
    int d = 30;
    e = c + d;
    return (e);
}

Теперь мы объявили e глобально. Запуск нашего скрипта теперь отображает:

The value of e is 60

Теперь он выполняется без ошибок. Исправление успешно!

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

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

Давайте рассмотрим следующий сценарий;

Нас интересует, сколько раз выполняется процесс, поэтому мы создаем функциональный скрипт time.c со следующим кодом:

#include <stdio.h>
int times(void);
int main(void)
{
     printf(“Number of function executions: %d\n”, times());
     printf(“Number of function executions: %d\n”, times());
     return (0);
}
int times(void)
{
    int time = 0;
    time++;
    return (time);
}

Наша функция main выводит количество выполнений функции раз. В функции time значение time изначально устанавливается равным 0, мы используем метод time++ для увеличения этого значения на 1 во время каждой итерации.

Запуск выходов кода;

Number of function executions: 1
Number of function executions: 1

Первая итерация возвращает 1, а вторая итерация должна вернуть 2. Однако в нашем случае мы получаем 1 за каждую итерацию. Это связано с тем, что значение времени инициализируется равным 0 после каждой итерации, поэтому значение времени после каждой итерации всегда будет равно 1. Чтобы заставить компьютер «запомнить» обновленное значение времени, мы делаем переменную int time равной статическая переменная. Давайте реализуем это, отредактировав наш файл time.c следующим образом:

#include <stdio.h>
int times(void);
int main(void)
{
    printf(“Number of function executions: %d\n”, times());
    printf(“Number of function executions: %d\n”, times());
    return (0);
}
int times(void)
{
    static int time = 0;
    time++;
    return (time);
}

Запуск выходов кода;

Number of function executions: 1
Number of function executions: 2

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

В программировании переменные являются неотъемлемым строительным блоком. Мы рассмотрели различные сценарии использования переменных в C с помощью иллюстраций. Я избегал упоминать квалификаторы и ключевое слово extern из-за глубины. Я напишу о них полную статью для наглядной иллюстрации. Я надеюсь, что вы найдете эту статью полезной. Пожалуйста, прокомментируйте в случае каких-либо предложений.