Инициализация глобальных и локальных переменных

При инициализации необходимо придерживаться следующих правил:

1. Объявления содержащие спецификатор класса памяти extern не могут содержать инициаторов.

2. Глобальные переменные всегда инициализируются, и если это не сделано явно, то они инициализируются нулевым значением.

3. Переменная с классом памяти static может быть инициализирована константным выражением. Инициализация для них выполняется один раз перед началом программы. Если явная инициализация отсутствует, то переменная инициализируется нулевым значением.

4. Инициализация переменных с классом памяти auto или register выполняется всякий раз при входе в блок, в котором они объявлены. Если инициализация переменных в объявлении отсутствует, то их начальное значение не определено.

5. Начальными значениями для глобальных переменных и для переменных с классом памяти static должны быть константные выражения. Адреса таких переменных являются константами и эти константы можно использовать для инициализации объявленных глобально указателей. Адреса переменных с классом памяти auto или register не являются константами и их нельзя использовать в инициаторах.

Пример: int global_var;

int func(void) { int local_var; /* по умолчанию auto */

static int *local_ptr=&local_var; /* так неправильно */

static int *global_ptr=&global_var; /* а так правильно */

register int *reg_ptr=&local_var; /* и так правильно */ }

В приведенном примере глобальная переменная global_var имеет глобальное время жизни и постоянный адрес в памяти, и этот адрес можно использовать для инициализации статического указателя global_ptr. Локальная переменная local_var, имеющая класс памяти auto размещается в памяти только на время работы функции func, адрес этой переменной не является константой и не может быть использован для инициализации статической переменной local_ptr. Для инициализации локальной регистровой переменной reg_ptr можно использовать неконстантные выражения, и, в частности, адрес переменной local_ptr.

14) Структура программы С++. Директивы препроцессора. Использование комментариев в тексте программы. Объявления функций.

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

Инициализация глобальных и локальных переменных - student2.ru

Комментарии в языке Си

В языке Си для комментариев используются символы
/* - начало комментария;
*/ - конец комментария.
Вся последовательность, заключенная между этими символами, является комментарием.
Это удобно для написания многострочных комментариев:

int a; /* целая
переменная */

Многострочные комментарии также удобно использовать при отладке для сокрытия от выполнения части кода.
В дополнение к этому, для написания коротких комментариев могут использоваться символы //. При этом комментарием является все, что расположено после символов // и до конца строки:

float b; // вещественная переменная

Директивы препроцессора, такие как #define и #ifdef, обычно используются для того, чтобы облегчить изменение исходного кода программ и их компиляцию в разных средах выполнения. Директивы в файле исходного кода позволяют препроцессору выполнять определенные действия. Например, препроцессор может заменять токены в тексте, вставлять содержимое других файлов в файл исходного кода или отключать компиляцию части файла путем удаления разделов текста. Строки препроцессора распознаются и выполняются до расширения макросов. Поэтому если макрос разворачивается в нечто, похожее на команду препроцессора, эта команда не распознается препроцессором.

Препроцессор распознает следующие директивы:

#define #error #import #undef
#elif #if #include #using
#else #ifdef #line #endif
#ifndef #pragma    

Функции всегда определяются глобально. Они могут быть объявлены с классом памяти static или extern. Объявления функций на локальном и глобальном уровнях имеют одинаковый смысл.

Правила определения области видимости для функций отличаются от правил видимости для переменных и состоят в следующем.

1. Функция, объявленная как static, видима в пределах того файла, в котором она определена. Каждая функция может вызвать другуюфункцию с классом памяти static из своего исходного файла, но не может вызвать функцию определенную с классом static в другом исходном файле. Разные функции с классом памяти static имеющие одинаковые имена могут быть определены в разных исходных файлах, и это не ведет к конфликту.

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

3. Если в объявлении функции отсутствует спецификатор класса памяти, то по умолчанию принимается класс extern.

15) Линейные алгоритмы в С++. Спецификатор формата. Пример.

Линейными называются алгоритмы, процесс пошагового выполнения которых можно изобразить прямой линией – сверху вниз.

Пример. Дано двухзначное целое число b. Найти сумму его цифр.

Текстуальная форма алгоритма задачи:

1) Ввести число b с клавиатуры в ЭВМ;

2) Для выделения первой цифры воспользуемся известным в математике способом деления числа b на 10, и возьмем целое число от этого деления;

3) Для выделения второй цифры разделим число b на 10, и возьмем дробную часть от этого деления;

4) Найдем сумму найденных цифр;

5) Полученный результат выдать на экран дисплея.

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

Инициализация глобальных и локальных переменных - student2.ru

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

Код Значение
%c %d %i %е %f %g %о %s %x %р %n %u %[] Читает одиночные символы Читает десятичное число Читает десятичное число Читает число с плавающей запятой Читает число с плавающей запятой Читает число с плавающей запятой Читает восьмеричное число Читает строку Читает шестнадцатиричное число Читает указатель Получает целочисленное значение, равное числу прочитанных символов Читает беззнаковое целое Сканирует множество символов
   

16) Форматированный ввод и вывод на экран в С++. Потоковый ввод и вывод на экран в С++.

Для организации форматированного потокового ввода-вывода в Си++ существуют два средства:

• применение функций-членов класса ios для управления флагами форматирования;

• применение функций-манипуляторов.

Управление флагами форматирования. Флаги форматирования — двоичные коды, управляющие форматом выводимых значений. В заголовочном файле iostream.h определено следующее перечисление, задающее флаги форматирования:

Инициализация глобальных и локальных переменных - student2.ru

В языке С++ был разработан другой способ ввода/вывода с использованием так называемых потоков ввода и вывода.

Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл <iostream>. Для ввода используется операция >>, для вывода – операция <<. Компилятор определяет тип вводимой/выводимой переменной и соответствующим образом форматирует её.

#include <iostream> using namespace std;  
cin >> x; // Ввод значения в переменную x из стандартного потока cin
cout << x; // Вывод значения переменной x в стандартный поток cout
cin >> x >> y; // Ввод двух переменных
cout << "x = " << x << "\ny = " << y << endl; // Функция endl осуществляет перевод строки

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

cin >> x; if (cin.fail()) cout << "Произошла ошибка при вводе\n";

17) Принятие решений. Условные операторы в С++. Пример.

Условный оператор.Формат условного оператора следующий:

if (выражение) оператор1; else оператор2;

Это полная форма оператора, программирующая структуру полного ветвления. Обычно выражение — это некоторое условие, содержащее операции отношения и логические операции. Значение выражения приводится к целому и интерпретируется в соответствии с правилом: равно нулю — ложь, не равно нулю — истина. Если выражение истинно, выполняется оператор1, если ложно — оператор2.

Необходимо обратить внимание на следующие особенности синтаксиса условного оператора:

* выражение записывается в круглых скобках;

точка с запятой после оператора 1 ставится обязательно.

Условный оператор if может использоваться в форме полной или неполной развилки.

В С++ есть условная операция, очень похожая на условный оператор выбора if else. Условная операция «? :» называется тернарной операцией (то есть трёхместная (имеет три операнда), единственная в C++).

Форма записи тернарной операции в C++
"условие" ? "выражение 1" : "выражение 2";
Если условие истинно, то выполняется выражение 1, иначе (условие ложно) выполняется выражение 2.
Пример:

a > b ? cout << a : cout << b; // если а > b, то выполняется cout << a, иначе выполняется cout << b

Таким образом, если, а > b напечатать а, иначе напечатать b. То есть, программа печатает большее из чисел. Использование условной операции может в некоторых случаях упрощать код, тогда как воспользоваться оператором if else таким же образом не возможно. Вернёмся к старой задаче из раздела Оператор выбора if else, напомню условие данной задачи.

18) Разветвляющиеся алгоритмы в С++. Пример.

Разветвляющимся является алгоритм, если последовательность выполнения шагов решения задачи изменяется в зависимости от некоторых условий. Условие – это логическое выражение, принимающее одно из двух значений: «Да» – если условие верно и «Нет» – если условие неверно, – и которое может содержать логические операции и знаки отношений.

Рис. 1 иллюстрирует структурные схемы разветвляющихся алгоритмов укороченной (а) и полной (б) формы.

Инициализация глобальных и локальных переменных - student2.ru

Рисунок 1. Схемы разветвляющихся алгоритмов

Разветвляющиеся алгоритмы оформляются операторами полной или укороченной формы (табл. 1). В условном операторе выполняется всегда одна из веток («Да» при истинном условии или «Нет», если оно ложно), и никогда не выполняются обе вместе.

Таблица 1. Формы записи операторов условного перехода

Форма записи Структура оператора
краткая if (условие) { операторы-Да }
полная if (условие) { операторы-Да; } else { операторы-Нет}

К условным операторам относится оператор выбора или оператор переключатель (табл. 2), который замечателен тем, что может заменить вложенные операторы условия.

Таблица 2. Оператор выбора (или оператор-переключатель)

Структура оператора
switch выражение { case значение1: { операторы} . . . . . . . . . . . case значениеN: { операторы} default { операторы} }

19) Организация циклов в С++. Итерационные алгоритмы. Пример.

Цикл - это повторение одного и того же участка кода в программе. Последовательность действий, которые повторяются, называют телом цикла. Один проход цикла - это шаг или итерация. Переменные, изменяющиеся внутри цикла и влияющие на его окончание, называются параметрами цикла.

В C++ предусмотрены три оператора, реализующих циклический процесс: while, do..while и for

Общий вид цикла for:

Наши рекомендации