Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GRIGOREV.DOC
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
608 Кб
Скачать
☆

1.8. Циклические конструкции

В языке С существует три вида циклов : while , do while и for , являющихся аналогами циклов WHILE, REPEAT и FOR (не вполне) в языке PASCAL.

Оператор цикла while записывается в виде:

while ( логическое выражение ) оператор/блок

- и выполняется до тех пор, пока логическое выражение в скобках истинно, т.е. не равно нулю.

Оператор цикла do while записывается в виде:

do оператор/блок while ( логическое выражение );

- и выполняется, пока истинно логическое выражение в скобках, но в отличие от цикла while логическое выражение вычисляется после выполнения тела цикла.

Цикл for является наиболее сложным из трех видов циклических операторов языка С :

for( [ инициализирующее выражение ] ; [ логическое выражение ] ;

[ корректирующее выражение ] ) [ оператор/блок ]

Цикл for выполняется следующим образом: перед началом цикла (толь­ко один раз) вычисляется инициализирующее выражение, затем вычисляется логическое выражение и, если оно истинно, выполняется тело цикла, и после каждого шага цикла вычисляется корректирующее выражение. В цикле for все три выражения могут отсутствовать, но два символа “ ; ” должны быть записаны в скобках. При отсутствии логического выражения предполагается, что его значение всегда истинно. Никаких специальных требований к выражениям, используемым в цикле for, не предъявляется, это совершенно произвольные выражения, а их названия лишь обозначают порядок записи этих выражений в скобках.

Запишем, используя три типа цикла, алгоритм вычисления суммы квадратов натуральных чисел от 1 до n :

s=0; i=1; while (i<=n) {s+=i*i; i++;}

s=0; i=1; do s+=i*i; i++; while(i<=n);

s=0; for(i=1; i<=n; i++) s+=i*i;

Третий вариант записи можно упростить, если в инициализирующем и в корректирующем выражениях использовать операцию “запятая”.

for(i=1,s=0; i<=n; s+=i*i,i++);

Таким образом, тело цикла оказалось пустым (но ; должна остаться).

Для немедленного выхода из цикла любого типа можно использовать оператор break. Для пропуска части операторов тела цикла используется оператор continue; , полностью аналогичный процедуре Continue в языке PASCAL.

1.9. Указатели, адресная арифметика

Указателями называются переменные и константы, значениями которых являются адреса участков памяти, выделенных для объектов конкретных типов. В языке C так же, как в языке PASCAL, существуют типизированные и обобщенные указатели. Типизированные указатели описываются в виде:

базовый тип * имя указателя , * имя указателя , ... ;

* относится только к тому имени, непосредственно перед которым она стоит. В одном операторе описания можно описать как переменные некоторого типа, так и указатели на такой тип. Символ * , меняющий тип переменной, называется в таком контексте модификатором. Переменные типа «ука­затель» можно инициализировать так же, как и числовые переменные, например :

int a=0, *b=&a, **c=&b;

Обобщенный указатель имеет тип void* , в нем можно хранить адреса любых объектов, но его использование ограничено по сравнению с типизированными указателями. Отметим, что любой адрес можно проверить на равенство или неравенство со специальным значением NULL (аналогичным константе NIL в языке PASCAL), которое записывается вместо нуля. Слово NULL позволяет определить указатель, который ничего не адресует.

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

1. Операция “значение”, записывающаяся в виде * указатель , результат операции есть значение, записанное по адресу, хранящемуся в данном указателе. В языке PASCAL такая операция записывается в виде указатель^ . Операция “значение” применима только к типизированным указателям. Она имеет такой же приоритет, как и все другие унарные операции.

2. К указателям применима операция явного преобразования типа, причем указатель можно преобразовать не только в указатель другого типа, но и в число, и число можно преобразовать в указатель.

3. Операция присваивания = , при этом оба операнда должны быть указателями одного типа, либо один из них должен иметь тип void* , либо правый операнд должен быть числом 0.

4. Операции сравнения == , != , < , <= , > , >= , при этом оба операнда должны быть указателями одного типа, либо один из них должен иметь тип void* , либо один из операндов должен быть числом 0.

5. Операция вычитания - , оба операнда должны быть указателями одного типа, либо второй операнд должен быть целым числом.

6. Операция сложения + , при этом второй операнд должен быть целым числом.

7. Увеличение и уменьшение указателя ++ , -- .

8. Операции присваивания += и -= , второй операнд в этом случае должен быть целым числом.

9. Операция “адрес” & .

При выполнении операций 5-8 используется так называемая адресная арифметика, т.е. за 1 принимается размер в байтах типа данных, базового для этого указателя. Это свойство арифметических операций с указателями особенно часто используется при работе с массивами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]