Язык Си - [33]

Шрифт
Интервал

  


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

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

while(++size < 18.5)

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

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

size = size +1;

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

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

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

/* овцы */

#define MAX 40

main( )

 {

 int count = 0,

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

while(++ count < MAX)

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

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

}

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

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

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

-- count, /* префиксная форма операции уменьшения */

count --, /* постфиксная форма операции уменьшения */

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

/* бутылки*/

#define MAX 100

main( )

 {

int count = MAX + 1;

while(--  count > 0)

 {

     printf(" %d бутылок пива на полке, %d бутылок пива!\n", count, count);

    printf(" Сними одну и пусти ее по кругу, \n");

    printf("%d бутылок пива! \n \n", count-1); }}

Начальные результаты выглядят так:

100 бутылок пива на полке, 100 бутылок пива!

Сними одну и пусти ее по кругу,

99 бутылок пива!

99 бутылок пива на полке, 99 бутылок пива!

Сними одну и пусти ее по кругу,98 бутылок пива!

Постепенно количество бутылок сходит на нет, и программа завершит свою работу следующим образом

1 бутылок пива на полке, 1 бутылок пива!

Сними одну и пусти ее по кругу,

0 бутылок пива!

     По-видимому, у нашего законченного лирика имеются трудности со склонением существительных с количественными числительными, но это можно устранить, используя условные операторы, показываемые в гл. 7. Необходимо заметить, что смысл операции > словами выражается как "больше". Так же как и операция <, она является "операцией отношения". Подробнее операции отношения мы рассмотрим внизу.

Старшинство операций

     В соответствии с принятым в языке Си порядком вычислений операции увеличения и уменьшения имеют очень высокий уровень старшинства; только круглые скобки обладают более высоким приоритетом. Поэтому выражение x*y++ означает (x)*(y++), а не (x*y)++, что очень удобно, поскольку последнее выражение смысла не имеет. (Операции увеличения и уменьшения применяются к переменной, в то время как произведение х*у само по себе не является переменной в отличие от сомножителей).

     Не путайте только старшинство этих операций с порядком вычислений. Предположим, у нас есть последовательность операторов:

y  = 2;

n  = 3;

nextnum = (у + n ++ )*6;

Какое значение примет переменная nextnum? Подставляя в выражение соответствующие значения, получаем

nextnum = (2 + 3)*6= 5*6 = 30

     Только после того как выражение вычислено, значение переменной n увеличивается до 4. Старшинство операций говорит, что операция ++ имеет отношение только к n; кроме того, оно указывает, когда значение переменной n используется при вычислении выражения, но момент изменения значения n определяется семантикой данной операции.

Не будьте слишком умными

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

while (num < 21)

{

printf("%10d  %10d\n", num*num++);

}

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


Еще от автора Митчел Уэйт
Язык программирования C [Лекции и упражнения, 6-е изд.]

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


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.