Характеристики переменной
Каждая переменная имеет свое:
- имя (идентификатор);
- значение (число, которое в ней записано);
- тип;
- время жизни;
- область видимости:
- от декларации и ниже
- до конца блока, в котором определена
Локальные переменные
- область видимости : от декларации до конца блока (функции).
- время жизни : время выполнения этого блока.
- начальное значение по умолчанию : мусор.
Напишем программу, которая вычисляет сумму 5 чисел.
#include <stdio.h>
int main()
{
int sum; // начало области видимости sum
sum = 0; // попробуем удалить эту строку
for (int i=0; i < 5; i++) {
int x; // начало области видимости x
scanf("%d", &x);
sum = sum + x;
} // конец области видимости x
printf("sum = %d\n", sum);
return 0;
// конец области видимости sum
}
- Нельзя использовать переменную до или после области видимости
Нельзя написать
х = 0 до или после цикла. Ее не видно.
- Время жизни: в цикле 5 раз:
- создается переменная х,
- в нее читается число scanf("%d", &x),
- ее значение прибавляется к переменной sum,
- она разрушается в конце каждой итерации цикла.
- Начальное значение по умолчанию.
Представим, что в программе нет строки sum = 0. При создании в локальной переменной sum может лежать любое число (память под переменную выделили, но не записали в нее 0).
Тогда результат работы программы тоже - любое число.
Некоторые компиляторы записывают 0 в локальные переменные при создании. Но по стандарту они не обязаны это делать. Тогда программа без sum=0 может работать, скомпилированная на одном компиляторе (у вас на компьютере) и не работать, скомпилированная на другом компиляторе (на сервере проверяющей системы).

Если у вас на компьютере "все работает", а на другом компьютере "работает неправильно", проверьте все ли переменные инициализированы.
Аргументы функции. Передаются по значению.
- область видимости : вся функция.
- время жизни : время выполнения функции.
- начальное значение по умолчанию : значение аргумента при вызове.
Что будет напечатано и почему? (Функция ничего не возвращает.)
#include <stdio.h>
void foo(int x) {
x = x + 1;
}
int main() {
int x;
x = 5;
foo(x);
foo(x);
printf("x=%d\n", x);
return 0;
}
Ответ:
5
#include <stdio.h>
void swap(int x, int y) {
int t;
t = x;
x = y;
y = t;
}
int main() {
int x, y;
x = 3;
y = 5;
swap(x,y);
printf("x=%d y=%d\n", x, y);
return 0;
}