Что такое БОДМАС и почему он полезен в программировании?
http://www.easymaths.com/What_on_earth_is_Bodmas.htm :
Как вы думаете, ответ на 2 + 3 х 5?
Это (2 + 3) х 5 = 5 х 5 = 25?
или 2 + (3 х 5) = 2 + 15 = 17?
BODMAS может прийти на помощь и дать нам правила, которым мы должны следовать, чтобы мы всегда получали правильный ответ:
(B) ракетки (O) RERDER (D) Ivision (M) ультипликация (A) Ddition (S) выведение
Согласно BODMAS, умножение всегда должно выполняться перед сложением, поэтому 17 - это правильный ответ в соответствии с BODMAS, а также ответ, который даст ваш калькулятор, если вы введете 2 + 3 x 5.
Почему это полезно в программировании? Понятия не имею, но я предполагаю, что это потому, что вы можете избавиться от некоторых скобок? Я довольно оборонительный программист, поэтому мои строки могут выглядеть так:
result = (((i + 4) - (a + b)) * MAGIC_NUMBER) - ANOTHER_MAGIC_NUMBER;
с BODMAS вы можете сделать это немного яснее:
result = (i + 4 - (a + b)) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER;
Я думаю, что я все еще использовал бы первый вариант - больше скобок, но таким образом мне не нужно изучать еще одно правило, и я столкнулся с меньшим риском забыть его и заставить эти странные трудно отлаживать ошибки?
Просто догадываюсь об этой части, хотя.
Mike Stone EDIT: исправлена математика, как указывает Гай
Другая версия этого (в средней школе) была «Пожалуйста, извините мою дорогую тетю Салли».
- Круглые скобки
- Экспоненты
- умножение
- разделение
- прибавление
- Вычитание
Мнемоническое устройство было полезно в школе, и все еще полезно в программировании сегодня.
Порядок операций в выражении, например:
foo * (bar + baz^2 / foo)
- В Ракетки первый
- O rders (т.е. Powers и квадратные корни и т.д.)
- D IVISION и М ultiplication (слева направо)
- Ddition и S ubtraction (слева направо)
источник: http://www.mathsisfun.com/operation-order-bodmas.html
Когда я узнал об этом в начальной школе (в Канаде), это называлось BEDMAS:
В Ракетки
Е xponents
Д IVISION
М ultiplication ddition S ubtraction
Просто для тех, кто из этой части света ...
Я не совсем уверен, насколько применимо к программированию старая мнемоника BODMAS. Нет никакой гарантии порядка операций между языками, и хотя многие держат стандартные операции в таком порядке, не все делают. Кроме того, есть некоторые языки, в которых порядок операций не так уж и значим (например, диалекты Лисп). В некотором смысле, вам, вероятно, лучше программировать, если вы забудете стандартный порядок и либо используете скобки для всего (например, (a * b) + c), либо специально изучите порядок для каждого языка, на котором вы работаете.
У меня нет полномочий редактировать ответ @Michael Stum , но это не совсем правильно. Он уменьшает
(i + 4) - (a + b)
в
(i + 4 - a + b)
Они не эквивалентны. Лучшее сокращение, которое я могу получить для всего выражения:
((i + 4) - (a + b)) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER;
или
(i + 4 - a - b) * MAGIC_NUMBER - ANOTHER_MAGIC_NUMBER;
Я где-то читал, что особенно в C / C ++ разбиение ваших выражений на маленькие операторы было лучше для оптимизации; поэтому вместо того, чтобы писать чрезвычайно сложные выражения в одну строку, вы кешируете части в переменные и выполняете каждое из них по шагам, а затем собираете их по мере продвижения.
Процедуры оптимизации будут использовать регистры в местах, где у вас были переменные, поэтому это не должно влиять на пространство, но может немного помочь компилятору.