Листинг 3. Неправильная программа расчета среднего арифметического значения трех чисел.
Ошибка содержится в инструкции
average = number_1 + number_2 + number_3 / 3;Дойдя до этой строки программы, компьютер будет выполнять математические действия в следующем порядке:
- Поделит значение переменной number_3 на 3.
- Сложит значения переменных number_1 и number_2 и прибавит к ним результат деления.
Если вы присвоите каждой переменной значение 100, выведенное на экран среднее арифметическое будет равняться 233.33. Вот правильная запись этой строки инструкций:
average = (number_1 + number_2 + number_3) / 3;Круглые скобки изменяют порядок приоритетов. Просматривая эту строку, компьютер прежде всего выполнит действия в скобках, затем вернется к началу строки и выполнит остальные операции в соответствии с обычным приоритетом операторов, о котором мы только что говорили. Таким образом, в нашей программе будет сперва выполнено сложение трех чисел в скобках, а потом результат поделен на 3 (рис.7). Получился правильный ответ.
Рис.7. Правильная формула расчета среднего арифметического значения
Рис.8. Использование нескольких уровней круглых скобок
Для того чтобы установить нужный порядок выполнения операций, можно использовать несколько уровней скобок (рис.8). Порядок выполнения операций установлен от самых внутренних скобок к наружным.
Рассмотрим пример. Допустим, работник получает оплату в двойном размере за каждый час, проработанный сверх 40-часовой рабочей недели. Полагая, что он работает как минимум 40 часов и, соответственно, получает плату как минимум за 40 рабочих часов, расчет недельного заработка состоит из следующих частей:
где rate — плата за 1 час работы, а hours — общее количество проработанных часов. В этом уравнении надо умножить количество сверхурочных часов на оплату в двойном размере, а затем прибавить полученный результат к обычной недельной оплате. Если вы напишете уравнение без учета приоритета операторов, оно будет выглядеть так:
total = 40 * rate + hours - 40 * rate * 2Допустим теперь, некто проработал 48 часов в неделю, причем его обычный заработок составляет 10 долларов в час. В приведенном уравнении операции будут выполняться в следующем порядке:
Операция | Результат |
40 * rate | |
40 * rate | |
400 * 2 | |
400 + 48 | |
448 – 800 | –352 |
Согласитесь, что получить недельный заработок в размере –352 доллара несколько обидно. Чтобы написать правильное уравнение, используйте скобки: total = (40 * rate) +((hours - 40) * (rate * 2)) Теперь уравнение состоит из двух логических частей (полный текст программы приведен в Листинге4). В первых скобках вычисляется обычная заработная плата, во вторых — оплата сверхурочных. Расчет сверхурочных тоже состоит из двух частей, заключенных в собственные скобки. Си прежде всего выполнит операции во внутренних скобках. Порядок выполнения действий теперь станет таким:
Операция | Результат |
40 * rate | |
hours – 40 | |
rate * 2 | |
8 * 20 | |
400 + 160 |