Шрифт:
/*выполнение сложения */
main /*увеличение префиксная и постфиксная формы */
{
int ultra = 0, super = 0;
while (super < 6)
{
super++;
++ultra;
printf(" super = %d, ultra = %d\n", super, ultra);
}
}
Результаты работы программы "выполнение сложения" выглядят слeдyющим образом
super = 1, ultra = 1
super = 2, ultra = 2
super = 3, ultra = 3
super = 4, ultra = 4
super = 5, ultra = 5
Вот это да! Мы досчитали до 5! Дважды! Одновременно! (Если вы захотите считать дальше, вам необходимо будет только изменить параметр, определяющий верхний предел счета в операторе while).
Признаемся, что мы могли бы получить тот же результат, заменив два оператора увеличения следующими операторами присваивания
super = super + 1, ultra = ultra + 1,
Данные операторы выглядят достаточно простыми. В связи с этим возникает вопрос, зачем нужен еще один дополнительный оператор, не говоря уже о двух, да еще в сокращенной форме?
Во-первых, компактная форма делает ваши программы более изящными и легкими для понимания. Эти операции придают им блеск, что приятно само по себе.
Например, мы можем переписать часть программы "размер обуви2" следующим образом.
size = 3.0;
while(size < 18.5) {foot = SCALE*size + OFFSET;printf("%10.1f %20.2f дюймов\n", size, foot);++size;}
При этом способе мы еще не воспользовались всеми преимуществами операции увеличения. Мы можем сократить данный фрагмент так
size = 2.0;while(++size < 18.5) {
foot = SCALE *size + OFFSET;
printf( %10.1f %20.2f дюйма\n" , size, foot);
}
Здесь мы объединили в одном выражении операцию увеличения переменной на 1 и проверку истинности условия в операции while. Подобного типа конструкция настолько часто встречается в языке Си, что заслуживает более подробного рассмотрения. Во-первых, как она работает. Очень просто значение переменной size увеличивается на единицу, а затем сравнивается с 18.5. Если оно меньше, то выполняются операторы, заключенные в фигурные скобки. После этого переменная size увеличивается на единицу один раз и т. д. Данный цикл повторяется до тех пор, пока значение переменной size не станет слишком большим. Мы изменили значение переменной size с 3.0 на 2.0, чтобы скомпенсировать увеличение переменной size перед ее первоначальным использованием для вычисления переменной foot.
РИС. 5.4. Выполнение одного шага цикла
Во-первых, чем нас привлекает этот способ? Своей компактноcтью. Кроме того (что еще более важно), с его помощью можно объединить в одном выражении два процесса, управляющие циклом. Первый процесс - это проверка, можно продолжать или нет? В данном случае проверяется, меньше ли размер обуви 18.5. Второй процесс заключается в изменении переменной, значение которой проверяется, - в данном случае размер обуви увеличивается на 1. Предположим, мы забыли изменить ее значение. Тогда переменная size всегда будет меньше 18.5, и выполнение цикла никогда не закончится. При выполнении программы компьютер, "пойманный в бесконечный цикл", будет выводить на печать одну за другой идентичные строки. В конце концов вы можете потерять интерес, ожидая результатов, и должны будете каким-то образом прекратить выполнение программы. Наличие проверки и изменения параметра цикла в одном выражении помогает программистам не забывать вводить в программу коррекцию параметра цикла.
Дополнительное преимущество использования операции увеличения заключается в том, что обычно в результате компиляции получается несколько более эффективный объектный код, поскольку она идентична соответствующей машинной команде.
И, наконец, эти операции имеют еще одну особенность, которую можно использовать в ряде затруднительных ситуаций. Чтобы узнать, что это за особенность, попробуйте выполнить следующую программу:
main
{
int a = 1, b = 1;
int aplus, plusb;
aplus = a++; /* постфикснаяформа*/
plusb = ++b; /* префикснаяформа*/
printf(" a aplus b plusb \n");
printf("%5d %5d %5d %5d\n", a, aplus, b, plusb);
}
Если вы все сделали правильно, то, насколько мы помним, в качестве результата вы должны получить следующие строки