Порядок выполнения операций

Порядок выполнения операций

     Рассмотрим следующую строку:

butter = 25.0 + 60.0 * n / SCALE;

     В этом операторе имеются операции сложения, умножения и деления. Какая операция будет выполнена первой? Будет ли 25.0 складываться с 60.0, затем результат 85.0 умножаться на n, а произведение делиться на значение константы SCALE? Или 60.0 умножается на n, результат складывается с 25.0, а сумма затем делится на величину SCALE? Или же существует какой-то другой порядок выполнения операций? Пусть переменная n равна 6.0, а константа SCALE - 2.0. Если вы выполните данные операции, используя эти значения, вы найдете, что при первом способе вычисления результат равен 255, а при втором - 192.5. При выполнении данной Си программы на машине реализуется, по-видимому, какой-то другой порядок вычислений, поскольку на деле переменная butter получит значение 205.0.

     Совершенно очевидно, что изменение порядка выполнения действий может приводить к различным результатам, поэтому язык Си нуждается в наборе непротиворечивых правил, указывающих, какое действие осуществлять первым. Язык Си делает это, задавая приоритет той или иной операции. Каждой операции назначается уровень старшинства. Умножение и деление имеют более высокий уровень, чем сложение и вычитание, поэтому они выполняются первыми. Если же две операции имеют один и тот же уровень старшинства, они выполняются в том порядке, в котором присутствуют в операторе. Для большинства операций обычный порядок - слева направо. (Операция = является исключением из этого правила.) Поэтому в операторе

butter = 25.0 + 60.0 * n / SCALE;

порядок операций следующий:

60.0 * n - первое умножение (или, возможно, деление) (если n = 6, то 60.0 * n = 360.0).

360.0/SCALE - второе умножение (или, возможно, деление) и наконец (поскольку SCALE = 2.0):

25.0 + 180.0 - первое сложение (или, возможно, вычитание) дает 205.0.

     Многие программисты предпочитают представлять порядок вычислений с помощью диаграммы специального вида, называемой "правом выражения". Ниже приводится пример такой диаграммы. Диаграмма показывает, как исходное выражение сводится к одному значению.

     Если вы захотите, скажем, чтобы сложение выполнялось перед делением, тогда вы должны делать то же, что и мы в приведенной ниже строке:

hour = (25.0 + 60.0 * n) / SCALE;

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

  

          Рис. 5.3. Деревья выражений, построенные на основе операции и операндов, и порядок вычислении.

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

Таблица 5.1. Операции в порядке уменьшения уровня старшинства

ОПЕРАЦИИ ПОРЯДОК ВЫЧИСЛЕНИЯ
( ) слева направо
-(унарный) слева направо
* / слева направо
+ -(вычитание) слева направо
= слева направо

     Заметим, что два различных по смыслу употребления знака минус имеют разные приоритеты (уровни старшинства). Столбец "порядок вычисления" указывает, как операция связана со своими операндами. Например, унарный знак минус связан с величиной, стоящей справа от него, а при делении левый операнд делится на правый.

Попытаемся применить эти правила на более сложном примере

/* применение правил старшинства */

main( )

{

 int top, score;

top = score = -(2 + 5)*6 + (4 + 3*(2 + 3));

printi("top = %d ", top);

}

     Какое значение будет выведено на печать в результате работы данной программы? Вначале вычислите его сами, а затем выполните программу или прочитайте нижеследующее объяснение, чтобы проверить свой ответ. (Надеемся, что вы получите правильный результат.)

     Итак, выражения, стоящие в скобках, имеют наивысший приоритет. Двигаясь слева направо, встречаем первое выражение скобках (2+5). Вычисляя его, получаем:

top = score = -7*6 + (4 + 3*(2 + 3))

     Следущее выражение в скобках - это (4 + 3*(2 + 3)). Отбрасываем скобки, получаем 4 + 3*(2 + 3). Вот как! Еще одни скобки! Тогда первым шагом является нахождение суммы 2+3. Выражение примет вид:

top = score = -7*6 + (4 + 3*5)

     Мы должны еще завершить вычисление выражения в скобках. По-скольку умножение * имеет приоритет более высокий, чем сложение, выражение теперь выглядит так

top = score = -7*6 + (4 + 15)

имеем

top = score = -7*6 + 19.

     Что же дальше? Если вы предполагаете, что нужно найти произведение 7*6, то вы ошибаетесь. Заметим, что унарный минус (изменение знака) имеет более высокий приоритет, чем умножение *. Поэтому сначала число 7 заменяется на -7, а затем -7 умножается на 6. Строка примет вид:

top = score = -42 + 19

после этого в результате сложения получим

toр  = score = -23

     Затем переменной score присваивается значение -23, и, наконец, переменная top получает то же значение -23. Напомним, что операция = выполняется справа налево.

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

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

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

3.2.2 Порядок вычисления

Из книги C++ автора Хилл Мюррей

3.2.2 Порядок вычисления Порядок вычисления подвыражений в выражении неопределен. Напримерint i = 1; v[i] = i++;может вычисляться или как v[1]=1, или как v[2]=1. При отсутствии ограничений на порядок вычисления выражения может генерироваться более хороший код. Было бы замечательно, если


Порядок слов

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

Порядок слов Можно указывать не только расстояние между словами, но и их порядок.Слова следуют в определенном порядке на нужном расстоянииЕсли вы точно знаете не только расстояние, но и порядок слов запроса, в котором они должны быть приведены на интересных вам


Порядок выполнения операторов

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Порядок выполнения операторов В сложных выражениях операторы выполняются в следующем порядке:1. ( ).2. not.3. *, /, div, mod, and, shl, shr, as.4. +, –, or, xor.5. =, <>, <, >, <=, >=, in,


Порядок выполнения операторов 

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

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


Отмена выполнения операций перекрывающегося ввода/вывода

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

Отмена выполнения операций перекрывающегося ввода/вывода Булевская функция CancelIO позволяет отменить выполнение незавершенных операций перекрывающегося ввода/вывода, связанных с указанным дескриптором (у этой функции имеется всего лишь один параметр). Отменяется


Порядок импорта

Из книги Технология XSLT автора Валиков Алексей Николаевич

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


Приоритет и порядок выполнения

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

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


Невидимый порядок

Из книги Как спроектировать современный сайт автора Вин Чои

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


4.4. Хитрости выполнения файловых операций

Из книги Windows Vista. Трюки и эффекты автора Зозуля Юрий

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


12.8. Команды выполнения математических операций

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

12.8. Команды выполнения математических операций factorРазложение целого числа на простые множители.bash$ factor 2741727417: 3 13 19 37 bcBash не в состоянии выполнять действия над числами с плавающей запятой и не содержит многих важных математических функций. К счастью существует


Оптимальный порядок

Из книги CSS3 для веб-дизайнеров автора Сидерхолм Дэн

Оптимальный порядок Используя браузерные префиксы, важно не забывать о порядке, в котором перечисляются свойства. Можно заметить, что в предыдущем примере сначала написаны префиксные свойства, за которыми следует беспрефиксное свойство.Зачем ставить подлинное


1.2.1. Порядок выполнения инструкций

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

1.2.1. Порядок выполнения инструкций По умолчанию инструкции программы выполняются одна за другой, последовательно. В программеint main(){readIn();sort();compact();print();return 0;}первой будет выполнена инструкция readIn(), за ней sort(), compact() и наконец print().Однако представим себе ситуацию, когда


Барьеры и порядок выполнения

Из книги Разработка ядра Linux автора Лав Роберт

Барьеры и порядок выполнения В случае, когда необходимо иметь дело с синхронизацией между разными процессорами или разными аппаратными устройствами, иногда возникает требование, чтобы чтение памяти (load) или запись в память (save) выполнялись в том же порядке, как это


Порядок выполнения операций процессором

Из книги Человеческий фактор. Успешные проекты и команды автора Листер Тимоти

Порядок выполнения операций процессором Вспомните из материала главы 9, "Средства синхронизации в ядре", что для различных аппаратных платформ процессоры в разной степени изменяют порядок выполнения программных инструкций. Для некоторых процессоров порядок выполнения