Array M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си — руководство для начинающих
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
III. ФОРМА ЗАПИСИ:
for(инициализация; проверка условия; коррекция) оператор
Тело цикла выполняется до тех пор, пока проверяемое условие не станет ложным или равным нулю
III.ПРИМЕР
for(n = 0; n < 10; n++)
printf(" %d %d\n", n, 2*n + 1);
Выше уже упоминалось о том, что в языке Си имеется несколько операций присваивания .
Важнейшей из них является, конечно, операция =, при использовании которой значение выражения справа от знака присваивается переменной слева от него. Остальные операции присваивания корректируют значения переменных В записи каждой из них имеются имя переменной, стоящее слева от знака операции, и выражение справа от него Переменной присваивается новое значение, равное старому, скорректированному с помощью величины выражения, стоящего справа. Результат зависит от используемой операции. Например: scores+= 20то же самое, что scores = scores + 20, dimes -= 20то же самое, что dimes = dimes - 2, bunnies *= 2то же самое, что bunnies = bunnies * 2, time /= 2.73то же самое, что time = time / 2.73, reduce %= 3то же самое, что reduce = reduce % 3.
Правые части здесь являются обыкновенными числами, но мы могли бы использовать и более сложные выражения
х*= 3*у + 12
то же самое, что и
х = х*(3*у + 12)
Этим операциям присваивания назначен тот же низкий приоритет, что и обычной операции =, т.е. меньший, чем операциям +или *. Это и отражено в последнем примере. Вам совершенно не обязательно использовать все эти формы. Однако они более компактны, и при трансляции обычно позволяют получить более эффективный машинный код, чем традиционная, более длинная запись. Они бывают особенно полезны в том случае, когда вы хотите поместить некоторое выражение в спецификацию цикла for.
Операция "запятая"
Операция "запятая" увеличивает гибкость использования цикла for, позволяя включать в его спецификацию несколько инициализирующих или корректирующих выражений. Например, ниже приводится программа, которая выводит на печать величины почтовых тарифов первого класса обслуживания. (Во время написания этой книги почтовые тарифы были такими: 20 центов за первую унцию и по 17 центов за каждую следующую.)
/* почтовые тарифы*/
#define FIRST 20
#define NEXT 17
main( )
{
int ounces, cost;
printf(" унциистоимость\n");
for(ounces = 1, cost = FIRST; ounces <= 16; ounces++, cost+ = NEXT)
printf(" %3d %7d\n" , ounces, cost);
}
Первые четыре строки результата работы программы будут выглядеть следующим образом:
унции стоимость
1 20
2 37
3 54
Мы воспользовались операцией "запятая" в первом и третьих выражениях: в первом случае она позволяет инициализировать переменные ouncesи cost; во втором - на каждой итерации увеличивать значение ouncesна 1, а costна 17 (величину константы NEXT). Все вычисления осуществляются в спецификации цикла for. Применение операции "запятая" не ограничено только циклами forно именно в них она используется особенно часто. Операция обладает одним дополнительным свойством: при ее использовании гарантируется, что выражения, к которым она применяется (т. е. выражения, разделенные запятой), будут вычисляться слева направо. Поэтому переменная ounces будет инициализирована до переменной cost. В данном примере это не имеет значения, но порядок инициализации мог бы оказаться существенным, если выражение, соответвующее cost, содержало бы переменную ounces. Символ "запятая" также используется как разделитель. Поэтому запятые в операторах: char ch, date;
РИС. 8.4. Операция "запятая" и цикл for
ИЛИ
printf(" %d %d\n", chimps, chumps);
являются разделителями, а не знаками операции "запятая".
Резюме: наши новые операции
I. ОПЕРАЦИЯ ПРИСВАИВАНИЯ
Каждая из этих операций корректирует значение переменной слева от знака с помощью величины справа от него, в соответствии с указанной операцией. Ниже мы используем обозначение п.ч. для правой части, а л.ч. для левой части.
+= прибавляет величину п.ч. к переменной л.ч.
-= вычитает величину п.ч. из переменной л.ч.
*= умножает неременную л.ч. на величину п.ч.
/= делит переменную л.ч. на величину п.ч.
%= дает остаток от деления переменной л.ч. на величину и.ч.
ПРИМЕР:
rabbits *= 1.6;то же самое, что и rabbits * 1.6;
II. ДОПОЛНИТЕЛЬНЫЕ ОПЕРАЦИИ:ОПЕРАЦИЯ "ЗАПЯТАЯ"
Операция "запятая" связывает два выражения в одно и гарантирует, что самое левое выражение будет вычисляться первым. Обычно она используется для включения дополнительной информации в спецификацию цикла for.
Пример:
for(step == 2, fargo = 0; fargo < 1000; step *= 2)
fargo + = step;
Философ Зенон и цикл for
Посмотрим, как с помощью операции "запятая" можно разрешить старый парадокс. Греческий философ Зенон утверждал, что пущенная стрела никогда не достигнет цели. Сначала, говорил он, стрела пролетит половину расстояния до цели. После этого ей останется пролететь половину всего расстояния, но сначала она должна будет пролететь половину того, что ей осталось пролететь, и т. д. до бесконечности. Поскольку расстояние полета разбито на бесконечное число частей, для достижения цели стреле может потребоваться бесконечное время. Мы сомневаемся, однако, что Зенон вызвался бы стать мишенью для стрелы, полагаясь только на убедительность своего аргумента. Применим количественный подход и предположим, что за одну секунду полета стрела пролетает первую половину расстояния. Тогда за последующую 1/2 секунды она пролетит половину того, что осталось от половины, за 1/4 - половину того, что осталось после этого, и т д. Полное время полета представляется в виде суммы бесконечного ряда 1 + 1/2 + 1/4 + 1/8 + 1/16 -1- ... . Мы можем написать короткую программу для нахождения суммы первых нескольких членов.
/* Зенон*/
#define LIMIT 15
main ( )
{
int count;
float sum, x;
for(sum = 0.0, x = 1.0, count = 1; count <= LIMIT; count++, x *= 2.0)
{
sum + = 1.0/x;
printf(" sum = %f когдаcount = %d.\n" , sum, count);
}
}
В результате выполнения программы получим значения сумм, соответствующих первым 15 членам ряда:
sum = 1.000000 когда count = 1.
sum = 1.500000 когда count = 2.
sum = 1.750000 когда count = 3.
sum = 1.875000 когда count = 4.
sum = 1.937500 когда count = 5.
sum = 1.968750 когда count = 6.
sum = 1.984375 когда count = 7.
sum = 1.992188 когда count = 8.
sum = 1.996094 когда count = 9.
sum = 1.998047 когда count = 10.
sum = 1.999023 когда count = 11.
sum = 1.999512 когда count = 12.
sum = 1.999756 когда count = 13.
Читать дальшеИнтервал:
Закладка: