Чтение онлайн

на главную

Жанры

Программирование для карманных компьютеров

Волков Владимир

Шрифт:

Приведенный пример демонстрирует применение инструкций if…else. В листинге показано, что инструкции могут быть вложенными. Следует обратить внимание, что если в качестве выражений фигурируют блоки, то точка с запятой ставится только в конце инструкции. switch (переключатель)

Эта инструкция предназначена для того, чтобы переключить ход выполнения программы на одну из ветвей в соответствии со значением переменной на входе.

Ее синтаксис приведен ниже:

switch (<switch variable>) {

case <constant expression>: <statement>; [break;]

default: <statement>;

}

В этом определении показано, как переменная передается инструкции switch. Если значение переменной соответствует одному из значений константы case, то выполняется соответствующее выражение, которое может быть завершено инструкцией. Если не было найдено значения переменной,

соответствующее одной из констант case, то выполняется ветвь default. Каждую из ветвей желательно завершать инструкцией break, иначе возможно выполнение сразу нескольких ветвей. Ветвь default может отсутствовать в конструкции switch. Работа оператора switch проиллюстрирована в блоке 11 рассматриваемого примера. При помощи этого оператора происходит выполнение той или иной функции в зависимости от того, какая клавиша была нажата на клавиатуре. while Инструкция while предназначена для организации цикла, в котором тело цикла может ни разу не быть выполнено. Это зависит от значения переменной продолжения цикла. Синтаксис этой инструкции приведен ниже.

while (<condition>) <statement>

Инструкция statement будет выполняться до тех пор, пока будет оставаться верным условие condition. Пример подобного цикла приведен ниже.

while (*p == ) p++; do while Инструкция do while предназначена для организации цикла, в котором тело цикла будет выполнено хотя бы один раз. Синтаксис этой инструкции приведен ниже.

do <statement> while (<condition>)

Инструкция statement будет выполняться до тех пор, пока будет выполняться условие condition. for Инструкция for предназначена для организации параметрического цикла. Синтаксис этой инструкции приведен ниже.

for (<initialization>]; <condition>]; <increment>]) <statement>

В секции <initialization> выполняется инициализация переменной цикла, в секции <condition> устанавливается условие, а в секции <increment> обуславливается механизм изменения переменной цикла. Блок инструкций <statement> является телом цикла. Пока условие соблюдается <condition>, цикл будет выполняться. Пример инструкции for приведен ниже.

for (int i = 0; i < 10; i++){

sprintf(nn, «%d», i);

strcat(mm, nn);

strcat(mm, " ");

}

break

Инструкция break прерывает выполнение инструкций switch, for, while или do и передает управление следующему блоку инструкций.

continue

Эта инструкция прерывает только текущую итерацию цикла и передает управление следующей итерации.

goto Инструкция goto предназначена для передачи управления на произвольную инструкцию программы, которая должна быть помечена соответствующей меткой. Это может быть в том числе и инструкция объявления имени. Заметим, что метка может быть только локальной, в качестве метки может выступать любое необъявленное до сих пор имя с двоеточием после него. Синтаксис конструкции приведен ниже.

identifier:

goto <identifier>;

return Эта инструкция предназначена для выхода из текущей функции и возврата в то место, откуда эта функция была вызвана. При необходимости она может возвращать значение. Синтаксис этой конструкции приведен ниже.

return [<expression>];

Пример этой инструкции выглядит достаточно просто.

double sqr(double x)

{

return (x*x);

}

Указатели

Указатель – это объект, хранящий в себе адрес некоей области памяти, в которой располагается переменная или иной объект. Но кроме адреса указатель еще хранит в себе тип объекта, на который указывает. Обычно различают указатели на объекты и указатели на функции. Оба типа указателей – специальные объекты для хранения адресов памяти. Эти два класса имеют различающиеся свойства, назначения и правила манипуляции ими.

Указатели на функции используются для того, чтобы осуществлять доступ к функциям и передавать функции как параметры для других функций. Для указателей на функции нельзя использовать арифметику указателей. Для указателей на объект , напротив, постоянное уменьшение и увеличение являются стандартной операцией для сканирования массивов и других структур данных в памяти.

В С++ указатель всегда имеет тип. Указателя без типа не может существовать. Указатель всегда указывает или на функцию, или на объект какого-то типа. Даже если указатель нетипизирован, он должен иметь тип void*.

Может быть нулевой указатель, который гарантированно указывает на адрес в памяти, который не может указать ни один другой указатель. То есть нулевой указатель

ни на что не указывает. Присвоение указателю константы 0 делает его нулевым указателем.

Синтаксис объявления указателя достаточно прост.

type *ptr;

После того как указатель будет объявлен, его обязательно нужно инициализировать. В этом случае type может быть любым типом, в том числе и пользовательским. Получившийся указатель будет трактоваться как указатель на объект типа, и после инициализации к этому указателю будут применимы все правила относительно видимости и времени жизни того объекта, на который он указывает.

Также один указатель можно присвоить другому. Правила этой операции достаточно просты и перечислены в следующем списке.

? Указателю типа void можно присвоить любой другой указатель.

? Никакому указателю не может быть присвоен указатель типа void.

? Указатель на объект и указатель на функцию не могут быть присвоены один другому.

? Указатели на объекты одного типа могут быть присвоены один другому.

? Указатели на объекты разного типа могут быть присвоены один другому только при соблюдении некоторых условий.

Помимо этого существует несколько правил арифметики указателей. Они, конечно, не являются обычными переменными, но язык C++ позволяет выполнять некоторые операции, которые приведены в следующем списке.

? Над указателями можно выполнять операцию инкремента и декремента. В этом случае указатель будет увеличиваться на размер объекта, на который он указывает.

? Указатели можно вычитать, но только в том случае, если это указатели на элементы одного и того же массива.

? Указатели можно сравнивать.

Массивы

Синтаксис объявления массива достаточно прост.

type declarator <constant-expression>]

Эта конструкция объявляет массив, состоящий из constant-expression элементов типа type. Следующий фрагмент кода можно рассматривать как пример объявления массивов.

float v[3]; //массив из трех элементов с плавающей точкой v[0], v[1], v[2] char* а[32]; //массив из 32 указателей на char а[0]…а[31]

Количество элементов массива не может изменяться после объявления. При необходимости объявить многомерный массив он объявляется массивом массивов, как это показано ниже.

int d[10][20];

Эта команда объявляет массив d из десяти массивов по 20 элементов типа int в каждом из них. Начальное значение массиву можно присвоить через указание списка значений.

int v1[] = {1, 3, 5, 7}; char v2[] = {\'a\',\'b\',\'d\',\'l\',0};

Если размер массива не объявлен, то он вычисляется по количеству инициализирующих элементов. Если размер объявлен, то количество элементов не может быть больше объявленного. Количество элементов может быть меньше объявленного, и в этом случае недостающие элементы инициализируются нулевым значением.

Массив удобно инициализировать строковым литералом. В C++, как и в С, в строковом литерале на один символ больше, чем используется при записи, таким образом, в строковом литерале «???» будет 4 символа.

Имя массива является указателем на его первый элемент. При направлении в строку массива символов, туда помещается содержащаяся в массиве строка. Если же мы отправим в строку массив, то туда будет помещен адрес первого элемента массива, а при разыменовании массива будет получено значение его первого элемента.

ВНИМАНИЕ! Можно также получить адрес элемента массива, следующего за последним. Компилятор C++ спокойно пропускает такой код. Мало того, можно получить как адрес, так и указатель на любой из элементов массива, выходящий за пределы массива как угодно далеко, и даже можно записать туда значение, что рано или поздно приводит к вторжению в «чужую» память и ошибке доступа к памяти с аварийным завершением работы программы или даже всей операционной системы. Поскольку массивы не хранят в себе информации о количестве элементов массива, при такого рода операциях ответственность за не выход за диапазон возложена целиком на программиста.

Таким образом, последовательный доступ к элементам массива может осуществляться как по индексу, указанному в скобках, так и по указателю на первый элемент массива, который при инкременте указывает на следующий элемент, а при разыменовании выдает значение текущего элемента. Этот механизм используется при дальнейшей работе над примером.

Упражнение 4.1 (продолжение)

20. В конец файла MyExp.cpp нужно добавить код, приведенный в листинге 4.11. Указанную функцию нужно объявить в заголовочном файле. Также потребуется добавить еще одну ветку case.

Поделиться:
Популярные книги

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Провинциал. Книга 7

Лопарев Игорь Викторович
7. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Провинциал. Книга 7

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

Жребий некроманта 2

Решетов Евгений Валерьевич
2. Жребий некроманта
Фантастика:
боевая фантастика
6.87
рейтинг книги
Жребий некроманта 2

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Гром над Империей. Часть 1

Машуков Тимур
5. Гром над миром
Фантастика:
фэнтези
5.20
рейтинг книги
Гром над Империей. Часть 1

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род