Операции увеличения и уменьшения: ++ и --

Операции увеличения и уменьшения: ++ и --

     Операция увеличения осуществляет следующее простое действие: она увеличивает значение своего операнда на единицу. Существуют две возможности использования данной операции, первая:

     когда символы ++ находятся слева от переменной (операнда), - "префиксная" форма,

и вторая:

     когда символы ++ стоят справа от переменной, - "постфиксная" форма.

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

/*выполнение сложения */

main( ) /*увеличение префиксная и постфиксная формы */

{

int ultra = 0, super = 0;

 while (super < 6)

 {

     super++;

    ++ultra;

    printf(" super = %d, ultra = %d ", 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 дюймов ", size, foot);++size;}

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

size = 2.0;while(++size < 18.5) {

foot = SCALE *size + OFFSET;

printf( %10.1f  %20.2f дюйма " , 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 ");

printf("%5d %5d %5d %5d ", a, aplus, b, plusb);

}

     Если вы все сделали правильно, то, насколько мы помним, в качестве результата вы должны получить следующие строки

а   aplus   b   plusb

2   1         2    2

     Как и предполагалось, значения обеих переменных, а и b, увеличились на 1. Однако переменной aplus значение а было присвоено перед изменением а, в то время как переменной plusb значение b было присвоено после изменения b. В этом и заключается разница между префиксной и постфиксной формами.

aplus = а++ - постфикс: переменная а изменяется после того как ее значение используется

plusb = ++b - префикс: переменная b изменяется перед тем как ее значение используется

  

                                                   РИС. 5.5. Префиксная и постфиксная формы.

     В тех случаях, когда одна из этих операций увеличения используется сама по себе, как, например, в операторе ego++, не имеет значения, какой формой вы пользуетесь. Выбор приобретает смысл, когда операция, и ее операнд являются частью некоторого "высшего" выражения, как, например, в операторах присваивания, которые мы только что рассматривали. В подобной ситуации необходимо иметь представление о результате, который вам хотелось бы получить. Напомним, например, следующий оператор:

while(++size < 18.5)

     При его использовании мы получили таблицу перевода вплоть до размера 18. Но, если бы мы вместо этого записали операцию увеличения в виде size++, в таблицу попал бы и размер 19, поскольку значение переменной size увеличивалось бы после сравнения, а не до этого.

     Конечно, вы могли бы использовать менее красивый способ - оператор присваивания

size = size +1;

     Тогда никто не поверит вам, что вы умеете по-настоящему программировать на языке Си.

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

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

/* овцы */

#define MAX 40

main( )

 {

 int count = 0,

printf(" Я считаю овец, чтобы уснуть ");

while(++ count < MAX)

printf(" %d миллионов овец, а я еще не уснул ", count);

printf(" %d миллионов овец, а я хр-р-р р   " , count);

}

     Попробуйте выполнить ее и посмотрите, работает ли она так, как должна по вашему мнению. Конечно, значение константы МАХ для вашего компьютера можно взять другим. (Кстати, что произойдет при замене префиксной формы операции увеличения постфиксной формой?)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

(2.9) После уменьшения размера занимаего W2K, при установке или удалении компонентов системы слишком часто приходится менять компакт диск, то с дистрибутивом W2k, то с Service Paclk. Как этого избежать?

Из книги Win2K FAQ (v. 6.0) автора Шашков Алексей

(2.9) После уменьшения размера занимаего W2K, при установке или удалении компонентов системы слишком часто приходится менять компакт диск, то с дистрибутивом W2k, то с Service Paclk. Как этого избежать? Чтобы этого избежать, можно скопировать на жесткий диск папку i386 дистрибутива и


Совет 17. Используйте «фокус с перестановкой» для уменьшения емкости

Из книги Эффективное использование STL автора Мейерс Скотт

Совет 17. Используйте «фокус с перестановкой» для уменьшения емкости Предположим, вы пишете программу для нового телешоу «Бешеные деньги». Информация о потенциальных участниках хранится в векторе:class Contestant {...};vector<Contestant> contestants;При объявлении набора участников заявки


Дросселирование семафора для уменьшения состязательности между потоками

Из книги Системное программирование в среде Windows автора Харт Джонсон М

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


10.13.10 Снижение перегрузок за счет уменьшения пересылаемых по сети данных

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

10.13.10 Снижение перегрузок за счет уменьшения пересылаемых по сети данных Сокращение объема пересылаемых данных несколько сложнее, чем рассмотренные выше механизмы. Оно начинает работать, как и уже упомянутый медленный старт. Но, поскольку устанавливается граница для


Навигация в целях увеличения конверсии

Из книги Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов автора Айзенберг Джеффри

Навигация в целях увеличения конверсии Плохо продуманная навигация – самая большая беда всех коммерческих сайтов. Именно ей мы обязаны досадно низким средним показателем конверсии в


82. Используйте подходящие идиомы для реального уменьшения емкости контейнера и удаления элементов

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

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


Операции

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Операции Операции в языке Си имеют либо один операнд (унарные операции), либо два операнда (бинарные операции), либо три (тернарная операция). Операция присваивания может быть как унарной, так и бинарной (см. раздел 4.4).Существенным свойством любой операции является ее


Способы увеличения продаж

Из книги Быстрые деньги в Интернете [50 способов заработать, сидя дома у компьютера] автора Парабеллум Андрей Алексеевич


Глава 1. Из чего состоит система увеличения продаж интернет-магазина

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

Глава 1. Из чего состоит система увеличения продаж интернет-магазина Для большинства владельцев интернет-магазинов продажи – «черный ящик». Представление о взаимосвязи между прилагаемыми усилиями и итоговой прибылью в большинстве случаев есть лишь на интуитивном


Возможность сильного увеличения любой области фотографии

Из книги Язык Си - руководство для начинающих автора Прата Стивен

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


Операция уменьшения: --

Из книги Раскрутка: секреты эффективного продвижения сайтов автора Евдокимов Николай Семенович

Операция уменьшения: --      Каждой операции увеличения соответствует некоторая операция уменьшения, при этом вместо символов ++ мы используем -- -- count, /* префиксная форма операции уменьшения */count --, /* постфиксная форма операции уменьшения */     Ниже приводится пример,


Операции

Из книги C++ для начинающих автора Липпман Стенли

Операции Теперь рассмотрим, что можно и нельзя делать с величинами типа enum. Вы можете присвоить константу типа enum переменной того же типа enum feline pet;pet = tiger;Нельзя использовать другие операции присваивания: pet += cat; /* недопустимо */Можно провести сравнение с целью выявления


Способы увеличения траста

Из книги Windows 10. Секреты и устройство автора Алмаметов Владимир

Способы увеличения траста Наряду с поднятием «пузомерок» (в частности, PR и тИЦ) увеличение траста сайта – ежедневная забота оптимизатора. Пусть траст – величина, не поддающаяся измерению, но ее можно преумножить. Получение даже небольшого rustRank серьезно повышает шансы


4.3. Операции сравнения и логические операции

Из книги автора

4.3. Операции сравнения и логические операции Символ операции Значение Использование ! Логическое НЕ !expr меньше exprexpr = Меньше либо равно expr=expr больше exprexpr = больше либо равно expr=expr == равно expr==expr != не равно expr!=expr логическое