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

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

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

while (num < 21)

{

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

}

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

5

будет напечатано

6

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

     Другим возможным источником неприятностей служит оператор вида

ans = num/2 + 5*(1 + num++);

     Опять проблема заключается в том, что компилятор может выполнять действия не в том порядке, который вы ожидали. Вы можете считать, например, что сначала он определит значение num/2, а затем перейдет к другой части выражения. Но компилятор может вычислить сначала последний член, увеличить переменною num, а затем использовать новое значение при нахождении num/2. Никакой гарантии в этом случае не существует.

Избежать эти трудности достаточно просто:

     1. Не применяйте операции увеличения или уменьшения к переменной присутствующей в более чем одном аргументе функции.

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

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

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

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

Будьте готовы!

Из книги Блоги. Новая сфера влияния автора Попов Антон Валерьевич

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


Будьте собой

Из книги Getting Real (на русском) [вычитывается] автора 37signals

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


Совет 33. Будьте внимательны при использовании remove-подобных алгоритмов с контейнерами указателей

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

Совет 33. Будьте внимательны при использовании remove-подобных алгоритмов с контейнерами указателей Предположим, мы динамически создаем ряд объектов Widget и сохраняем полученные указатели в векторе:class Widget {public:bool isCertified() const; // Функция сертификации объектов Widgetvector<Widget*> v; //


Буфер результатов слишком мал

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

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


Будьте скромнее

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

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


Слишком много потраченных сил

Из книги IT-безопасность: стоит ли рисковать корпорацией? автора Маккарти Линда

Слишком много потраченных сил Нам стало интересно, сколько папок-портфолио продается со скидкой на этом сайте. Мы ведь пришли сюда по ссылке «Огромные скидки на папки– портфолио и многое другое!». Если постараться, то можно найти все папки– портфолио, которые есть в


Не быть слишком доверчивым

Из книги Цифровой журнал «Компьютерра» № 197 автора Журнал «Компьютерра»

Не быть слишком доверчивым Доверие — это страшная вещь в сетях с неправильной настройкой. Как только вы войдете в одну машину, другие машины доверят вам войти в них. Если вам необходима доверительная конфигурация (а абсолютная необходимость возникает лишь в редких


Будьте здоровы, или Чтоб вы сдохли! Как Америка строила революционный сайт медстрахования Евгений Золотов

Из книги Цифровой журнал «Компьютерра» № 202 автора Журнал «Компьютерра»

Будьте здоровы, или Чтоб вы сдохли! Как Америка строила революционный сайт медстрахования Евгений Золотов Опубликовано 29 октября 2013 Даже самые едкие критиканы, кажется, устали считать, сколько раз погас олимпийский факел. Но если вас это всё ещё


4K? Всё ещё слишком рано! Евгений Золотов

Из книги Как приручить компьютер за несколько часов автора Ремнева Ирина

4K? Всё ещё слишком рано! Евгений Золотов Опубликовано 06 декабря 2013 Если только вы не обретаетесь на забытом богом острове в Тихом океане (как там «Инмарсат», не тормозит?), то готов ручаться, уже задумывались над тем, как защитить близких от страшной


Слишком много кнопок

Из книги Компьютерные террористы [Новейшие технологии на службе преступного мира] автора Ревяко Татьяна Ивановна

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


Выбор слишком острых граней

Из книги Все секреты Minecraft автора Миллер Меган

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


Будьте готовы

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

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