Не будьте слишком умными
Не будьте слишком умными
Вы можете попасть в глупое положение, если попытаетесь использовать операцию увеличения в неподходящих случаях. Например, вы могли бы захотеть улучшить нашу программу вывода на печать целых чисел и их квадратов, заменив имеющийся там цикл 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. Не применяйте операции увеличения или уменьшения к переменной, которая входит в выражение более одного раза.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Будьте готовы
Будьте готовы Удостоверьтесь, что у вас есть полный комплект брони, зелья, зачарованное оружие и инструменты, которые помогут вам выжить и победить. Вам потребуются мечи, луки и кирка, достаточное количество булыжника для создания мостов через озера с лавой, гравий
Будьте готовы!
Будьте готовы! Метки: большой бизнес, корпоративный блог, автор блогаПочему большой компании проще влиять на целевую аудиторию? Потому что она уже пользуется доверием, зачастую у нее хорошая репутация. Ее продукция лежит на полках многих магазинов, ее информация
Будьте скромнее
Будьте скромнее Первое правило успеха в Сети заключается в следующем. Старайтесь не привлекать внимания к собственной персоне. Как бы ни были хороши ваш бизнес и вы сами, любой текст на сайте должен прежде всего учитывать интересы посетителей. Дайте понять клиентам, что
Слишком много потраченных сил
Слишком много потраченных сил Нам стало интересно, сколько папок-портфолио продается со скидкой на этом сайте. Мы ведь пришли сюда по ссылке «Огромные скидки на папки– портфолио и многое другое!». Если постараться, то можно найти все папки– портфолио, которые есть в
Выбор слишком острых граней
Выбор слишком острых граней Существует много инструментов для выбора граней, с которыми в некоторых случаях громоздко работать. Блендер имеет встроенные инструменты, чтобы выбирать грани, которые имеют слишком маленькую площадь или которые имеют слишком короткий
Буфер результатов слишком мал
Буфер результатов слишком мал Когда мы рассказывали о функции door_call, мы отметили, что если буфер результатов оказывается слишком мал, библиотека дверей осуществляет автоматическое выделение нового буфера. Сейчас мы покажем это на примере. В листинге 15.4 приведен текст
Совет 33. Будьте внимательны при использовании remove-подобных алгоритмов с контейнерами указателей
Совет 33. Будьте внимательны при использовании remove-подобных алгоритмов с контейнерами указателей Предположим, мы динамически создаем ряд объектов Widget и сохраняем полученные указатели в векторе:class Widget {public:bool isCertified() const; // Функция сертификации объектов Widgetvector<Widget*> v; //
Будьте собой
Будьте собой Дифференцируйте себя от больших компаний, будьте дружественнее и доступнееМного маленьких компаний делают ошибку в попытках действовать как большие. Как будто бы они не замечают свой размер. Это как слабость, комплекс, который нужно скрывать, и это слишком
Будьте здоровы, или Чтоб вы сдохли! Как Америка строила революционный сайт медстрахования Евгений Золотов
Будьте здоровы, или Чтоб вы сдохли! Как Америка строила революционный сайт медстрахования Евгений Золотов Опубликовано 29 октября 2013 Даже самые едкие критиканы, кажется, устали считать, сколько раз погас олимпийский факел. Но если вас это всё ещё
4K? Всё ещё слишком рано! Евгений Золотов
4K? Всё ещё слишком рано! Евгений Золотов Опубликовано 06 декабря 2013 Если только вы не обретаетесь на забытом богом острове в Тихом океане (как там «Инмарсат», не тормозит?), то готов ручаться, уже задумывались над тем, как защитить близких от страшной
Не быть слишком доверчивым
Не быть слишком доверчивым Доверие — это страшная вещь в сетях с неправильной настройкой. Как только вы войдете в одну машину, другие машины доверят вам войти в них. Если вам необходима доверительная конфигурация (а абсолютная необходимость возникает лишь в редких
Слишком много кнопок
Слишком много кнопок Да, когда вы откроете программку, шок вам гарантирован. Вся она обвешена панельками с разными кнопками. Одна мысль о том, что придется все это освоить, уже наводит тоску. Скажу по секрету: даже опытные дизайнеры не знают всех функций программы, а