
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операция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()
Все сказанное до сих пор о свойствах локальных переменных внутри функций относится в полной мере и к функции main(). Вообще говоря, main() — это такая же функция, как и другие. Единственное различие состоит в том, что она вызывается операционной системой при запуске программы, и после завершения программы управление снова передается в операционную систему.
Это означает, что локальные переменные, определенные в функции main(), создаются при запуске программы и существуют до самого ее завершения. В силу этого понятие статической переменной, сохраняющей свое значение между вызовами main(), не имеет смысла: переменная не может существовать в промежутках между запусками программы. Поэтому внутри main() не существует различия между автоматическими и статическими локальными переменными. Можно, конечно, с полным правом объявить локальную переменную в функции main() как статическую, но это не будет иметь никакого реального эффекта.
Формальные параметры - это переменные, объявленные при описании функций как ее аргументы. Формальные параметры могут использоваться в теле функции так же, как локальные переменные, которыми они по сути дела и являются. Область действия формальных параметров - блок, являющийся телом функции.
Переменные-параметры всегда имеют начальное значение, переданное как аргумент в функцию. Поэтому понятия "статический" и "автоматический" не имеют никакого смысла в приложении к ним.
Регистровые переменные
В языке С есть ключевое слово register. Оно используется в объявлении автоматической переменной для того, чтобы попросить компилятор поместить ее не в оперативную память, а в регистр процессора.
Рассмотрим пример:
Void func1(void)
{
register int x;
/* Код функции */
}
Ключевое слово register — это предложение, а не категорическое распоряжение. Преимущества регистровых переменных наиболее ярко проявляются тогда, когда эти переменные используются в программе очень часто, например, как счетчики циклов.
Ключевое слово register может употребляться только с простыми числовыми переменными, но не с массивами или структурами. Его также нельзя совмещать с объявлением переменной как статической или внешней. Нельзя и определить указатель на регистровую переменную.
В опциях интегрированной среды есть возможность задавать способы использования регистровых переменных:
не использовать вообще;
использовать только тогда, когда есть ключевое слово register;
по усмотрению компилятора.
Глобальные переменные
Глобальные переменные - это переменные, объявленные вне какой-либо функции в том числе, и вне функции main(). В отличие от локальных переменных глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены.
Область действия глобальной переменной – распространяется на весь файл исходного кода, в котором она объявлена.
Глобальные переменные рекомендуется инициализировать, даже при том, что они по умолчанию получают начальное значение 0.
Делать переменную внешней целесообразно только в том случае, если доступ к ней нужен подавляющему большинству функций программы. Иначе лучше передать их как параметры.
Использование глобальных переменных имеет свои недостатки:
они занимают память в течение всего времени работы программы;
использование глобальных переменных делает функции менее общими и затрудняет их использование в других программах;
использование внешних переменных делает возможным появление ошибок из-за побочных явлений. Эти ошибки, как правило, трудно отыскать.
Ключевое слово extern
Если в функции используется глобальная переменная, то согласно хорошему стилю программирования ее следует объявить внутри этой функции с помощью ключевого слова extern в следующем виде:
extern тип имя;
Здесь тип обозначает тип переменной, а имя— ее идентификатор.
Декларация extern необходима, если объявление переменной находится не в одном программном модуле.
Декларацией extern фактически говорится: «Эта функция использует переменную такого-то типа и с таким-то именем, определенную где-то в другом месте».
Глобальные статические переменные
Глобальную переменную можно сделать статической, добавив к ее объявлению слово static:
static float rate;
main()
{
/* Код программы */
}
Различие между обычной глобальной переменной и статической глобальной переменной состоит в области действия. Обычная глобальная переменная видима из всех функций файла исходного кода, а также может использоваться функциями из других файлов. Статическая внешняя переменная видна только из функций ее файла и только ниже точки объявления.
Конечно, данные различия имеют значение в основном для программ, чей исходный код распределен по двум или более файлам.