- •Основные логические функции и элементы
- •Комбинированные цифровые схемы. Построение цифровой схемы по произвольной таблице истинности (сднф)
- •Комбинированные цифровые схемы. Построение цифровой схемы по произвольной таблице истинности (скнф)
- •Комбинированные цифровые схемы. Декодер. Десятичный дешифратор
- •Комбинированные цифровые схемы. Семисегментный дешифратор
- •Сумматор
- •Бистабильные схемы
- •Rs-триггер
- •Синхронный rs-триггер
- •Статический d-триггер
- •Динамический d-триггер
- •T-триггер. Суммарный асинхронный счетчик
- •Параллельный регистр
- •Последовательный регистр
- •Архитектура микопроцессорной системы
- •Структурная схема микропроцессорной системы
- •Основные концепции языков программирования
- •Парадигмы языков программирования
- •Критерии оценки языков программирования
- •Объекты данных в языках программирования
- •Механизмы типизации
- •Виды типизации
- •Произвольные типы
- •Время жизни переменных
- •Область видимости переменных
- •Типы данных
- •Векторы и массивы
- •Указатели
- •Выражения и операторы присваивания
- •Структуры управления на уровне операторов
- •Составной оператор (блок)
- •Операторы if
- •Переключатели
- •Цикл while (while-do)
- •Цикл repeat(do-while)
- •Цикл for-do
- •Функции
- •Функции без возвращаемого значения
- •Параметры и переменные в функциях
- •Необходимость инициализации переменных (автоматические переменные)
- •Статические переменные
- •Передача по значению
- •Адреса и указатели
- •Чем «опасны» указатели?
- •Ввод-вывод
- •Функции как часть типа данных
- •Конструкторы и деструкторы
- •Перегрузка операторов и функций
- •Перегрузка функций. Прототипы и сигнатуры
- •Пространство имен
- •Исключения (exceptions)
- •Наследование и полиморфизм
- •Уровни доступа к базовому классу
- •Одноименные поля в произвольном и базовых классах
- •Виртуальные функции
- •Абстрактные классы. Чистые виртуальные функции.
- •Виртуальные конструкторы
Параметры и переменные в функциях
При объявлении функции указываются формальные параметры, которые потом используются внутри самой функции. При вызове функции мы используем фактические параметры. Фактическими параметрами могут быть переменные любого подходящего типа или константы.
Локальные переменные существуют только во время выполнения программного блока, в котором они объявлены, создаются они при входе в блок, а разрушаются — при выходе из него. Более того, переменная, объявленная в одном блоке, не имеет никакого отношения к переменной с тем же именем, объявленной в другом блоке.
В отличие от локальных, глобальные переменные видимы и могут использоваться в любом месте программы. Они сохраняют свое значение на протяжении всей работы программы. Чтобы создать глобальную переменную, ее необходимо объявить за пределами функции. Глобальная переменная может быть использована в любом выражении, независимо от того, в каком блоке это выражение используется.
inti,j; /* У первой функции видныi,jфайлового уровня. Кроме того, у нее есть формальный параметрk и локальная переменнаяresult В процессе работы эта функция изменяет значение файловой переменнойi*/intf1(intk) { intresult; result=i*j+k; i+= 100; returnresult; }
/* Во второй функции имя формального параметра совпадает с именем переменной i файлового уровня, при работе используется параметр, а не файловая переменная. */ int f2(int i)
{ /* i - параметр, j - файловая */ return i*j;
}
/* С третьей функцией аналогичная ситуация, что и со второй. Только на этот раз маскируется файловая переменная j, и не формальным параметром, а локальной переменной. */ int f3(int k)
{ int j; j=100; /* i - файловая, j - локальная */ return i*j + k;
}
Переменная j самого внутреннего блока маскирует не только файловую, но и локальную переменную из внешнего блока. */ int f4 (int k)
{ /* Объявляем переменную и сразу инициализируем */ int j=100; { /* Объявляем еще одну локальную с тем же именем, что у файловой и локальной из внешнего блока */ int j=10; /* i - файловая, j - локальная, причем из внутреннего блока */ return i*j + k; }
}
Необходимость инициализации переменных (автоматические переменные)
Самый простой метод - это объявление переменных внутри функций. Если переменная объявлена внутри функции, каждый раз, когда функция вызывается, под переменную автоматически отводится память. Когда функция завершается, память, занимаемая переменными, освобождается. Такие переменные называют автоматическими.
При создании автоматических переменных они никак не инициализируются, т.е. значение автоматической переменной сразу после ее создания не определено, и нельзя предсказать, каким будет это значение. Соответственно, перед использованием автоматических переменных необходимо либо явно инициализировать их, либо присвоить им какое-либо значение.
!!! ИНИЦИАЛИЗАЦИЯ ДО ИСПОЛЬЗОВАНИЯ!!!
/* Файловая переменная без инициализации, будет равна 0 */ int s; int f() { /* Локальная без инициализации, содержит "мусор" */ int k; return k; } int main() { printf("%d\n", s); /* Всегда печатает 0 */ /* Невозможно предсказать, что увидим */ /* К тому же числа могут быть разными */ printf("%d\n", f()); ...; printf("%d\n", f()); return 0;