
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Область действия и область видимости
Область действия переменной – это правила, которые устанавливают, какие данные доступны из данного места программы.
Область действия также влияет на время жизни переменной, т.е. время, в течение которого переменная хранится в памяти.
С точки зрения области действия переменных различают три типа переменных:
глобальные,
локальные
формальные параметры.
Правила области действия определяют, где каждая из них может применяться.
Локальные переменные
Локальные переменные – это переменные, объявленные внутри блока, в частности внутри функции. Область действия локальной переменной – блок.
Локальная переменная существует пока выполняется блок, в котором эта переменная объявлена. При выходе из блока эта переменная (и ее значение) теряется.
Локальную переменную обязательно надо инициализировать.
Переменные могут быть локальными и по отношению к функции main().
Рекомендации.
Используйте только локальные объявления для таких переменных, как счетчики циклов и т.п.
Локализуйте переменные в функциях для изоляции данных в различных частях программы друг от друга.
Обязательно инициализируйте локальные переменные, чтобы знать наверняка, какие значения в них находятся.
В языке Си локальные переменные могут быть автоматическими и статическими.
Локальные переменные по умолчанию являются автоматическими, поэтому их не нужно объявлять. Если вы все же хотите сделать это по каким-то причинам, то добавьте к объявлению переменной слово auto. Автоматические означает, что при каждом вызове функции эти переменные создаются заново, а при выходе из функции уничтожаются. На практике это значит, что автоматические переменные не хранят свои значения между вызовами функций, в которых они определены.
Автоматические переменные хранятся в оперативной памяти машины, точнее, в стеке.
Если функции все-таки необходимо сохранить значение некоторой переменной между вызовами функций, их необходимо объявить статическими с помощью ключевого слова static.
Область действия локальной статической переменной - вся программа. Место в памяти под локальные статические переменные выделяется в начале работы программы в разделе глобальных и статических переменных. Однако область видимости локальных статических переменных такая же, как и у автоматических. Значение статических переменных сохраняется от одного вызова функции до другого. Локальные статические переменные инициализируются нулем, если не указан другой инициализатор. При последующих вызовах функции, в которой описана эта переменная, инициализации не происходит.
Например, функция печати хотела бы знать, сколько строк уже послано на принтер, чтобы определить, не следует ли начать новую страницу.
void print(int x) {
static int lineCount;
/* Далее идут операторы функции */
}
В языке Си локальные переменные можно объявить в любом блоке программы (т.е. в любом фрагменте кода, заключенном в фигурные скобки). Объявления переменных должны стоять в блоке первыми, раньше всех остальных операторов.
Пример такого объявления.
#include <stdio.h>
main() {
/* объявление переменной, локальной в main(). */
int count = 0;
printf("\n До блока, count = %d", count);
/* Открытие блока */
{
/* Объявление переменной, локальной в блоке. */
int count =999;
printf("\n В блок, count = %d", count);
}
printf("\n После блока, count = %d\n", count);
}
Резульлат:
До блока, count = 0
В блоке, count =999
После блока, count = 0
Эта программа демонстрирует, что переменные с одним и тем же именем count, объявленные в блоке и вне блока, полностью независимы друг от друга.
Эта разновидность локальных переменных встречается в практике программирования крайне редко. Основное применение локальных переменных в блоках состоит в том, чтобы локализовать смысловую ошибку в программе: отделить часть программы фигурными скобками, объявить там локальные переменные и проследить за тем, что с ними произойдет. Еще одним их преимуществом можно считать то, что объявление и инициализация переменной выполняются в непосредственной близости от операторов, которые ее используют. Это помогает сделать программу более удобочитаемой.