
- •Экзаменационные вопросы по дисциплине
- •«Программирование на языках высокого уровня»
- •Среда программирования языка Си.
- •Алфавит языка.
- •Данные и типы данных в Си.
- •Int (целый);
- •Константы и переменные.
- •Перечень операций в Си. Приоритет операций.
- •Структура программы.
- •Int scanf(char *управляющая строка);
- •Массивы в Си.
- •Массивы указателей. Массивы динамической памяти.
- •Представление символа и строки в памяти эвм. Ввод-вывод символов и строк.
- •Понятие функции в Си. Определение и описание. Вызов функции.
- •Передача параметров функции по значению.
- •Передача параметров функции по ссылке.
- •Рекурсивные функции.
- •Определение структур. Инициализация и присваивание структур.
- •Доступ к элементам структур
- •Двоичный режим обмена с файлами. Строковый обмен с файлами.
- •Использование макросов в Си.
Константы и переменные.
Константа — это величина, которая при выполнении программы остаётся неизменной.
Переменная — это ячейка памяти для временного хранения данных. Предполагается, что в процессе выполнения программы значения переменных могут изменяться.
Константные переменные
Если переменная объявлена с ключевым словом const, значит, она не должна меняться. После определения константной переменной вы уже не сможете изменить ее значение или передать ее в качестве аргумента функции, которая не гарантирует ее неизменности. Рассмотрим простой пример с константной целой переменной.
const int j = 17; // Целая константа
j = 29; // Нельзя, значение не должно меняться
const int i; // Нельзя, отсутствует начальное значение
Третья строка неверна, поскольку в ней компилятору предлагается определить случайную переменную, которую никогда не удастся изменить, - этакий странный генератор случайных целых констант.
Вообще говоря, вы сообщаете компилятору, какой конструктор он должен использовать в конкретном случае. Если бы переменная i относилась к нетривиальному классу, то при объявлении константного экземпляра пришлось бы явно указать конструктор и его аргументы. int - вырожденный случай, поскольку на самом деле const int j=17; - то же, что и int j(17).
Но вот компилятор узнал, что нечто должно быть константным. Он просыпается и начинает искать ошибки - не только фактические, но и потенциальные. Компилятор не разрешит использовать ваше константное нечто в любом неконстантном контексте, даже если шестилетний ребенок разберется в программе и докажет, что в ней нет ни одной ошибки.
const i = 17;
int& j = 1; // Нельзя, потому что позднее j может измениться
Не важно, будете ли вы изменять величину, на которую ссылается j. Компилятор предполагает, что вам захочется это сделать, и на всякий случай устраняет искушение. Иначе говоря, константность -свойство переменной, а не данных, поэтому неконстантная переменная не может ссылаться на константную величину.
const и #define
Две следующие строки не эквивалентны:
const int i = 17;
#define i 17;
В первой строке определяется переменная, занимающая некоторую область памяти, а во второй - макрос. Обычно отличия несущественны, если не считать одного-двух лишних тактов, затраченных на каждое обращение к константной переменной. Однако если переменная является глобальной и принадлежит нетривиальному классу со своим конструктором, ситуация резко меняется.
Дополнительные сведения приведены в разделе «Инициализация глобальных объектов» этой главы.
Константы в перечислениях
Перечисления (епит) не очень широко использовались в языке С по одной простой причине: символические имена констант имеют глобальную область действия и быстро захламляют пространство имен. В C++ эта проблема исчезла, поскольку область действия символических имен ограничивается классом или структурой.
class Foo {
public:
enum Status { kOpen = 1, kClosed };
};
// Где-то в программе
Foo::Status s = Foo::kOpen;
Обратите внимание - область действия должна быть явно указана как в имени типа, так и в символическом имени. Следовательно, символические имена kOpen и kClosed можно использовать в программе и для других целей. Компилятор рассматривает символические имена перечислений как макросы, а не как константные переменные. Это обстоятельство может оказаться важным при инициализации глобальных переменных