В математике и компьютерное программирование, порядок операций (или приоритет оператора ) - это набор правил, отражающих соглашения о том, какие процедуры выполнять в первую очередь, чтобы оценить задано математическое выражение.
Например, в математике и большинстве компьютерных языков умножение имеет более высокий приоритет, чем сложение, и так было с момента появления современной алгебраической нотации. Таким образом, выражение 2 + 3 × 4 интерпретируется как имеющее значение 2 + (3 × 4) = 14, а не (2 + 3) × 4 = 20. С введением показателей степени в XVI и XVII веках они имели приоритет как над сложением, так и над умножением и могли быть помещены только как верхний индекс справа от их основания. Таким образом, 3 + 5 = 28 и 3 × 5 = 75.
Эти соглашения существуют для устранения неоднозначности обозначений, позволяя при этом быть как можно более краткими. Там, где желательно переопределить соглашения о приоритете или даже просто подчеркнуть их, можно использовать круглые скобки (), чтобы указать альтернативный порядок операций (или просто усилить порядок операций по умолчанию). Например, (2 + 3) × 4 = 20 заставляет сложение предшествовать умножению, а (3 + 5) = 64 заставляет сложение предшествовать возведению в степень. Если в математическом выражении требуется несколько пар круглых скобок (например, в случае вложенных круглых скобок), круглые скобки могут быть заменены скобками или скобками, чтобы избежать путаницы, как в [ 2 × (3 + 4)] - 5 = 9.
Порядок операций, который используется в математике, науке, технике и многих компьютерных языках программирования, выражается здесь:
Это означает, что если в математическом выражении между двумя операторами появляется часть выражения, оператор, стоящий выше в Приведенный выше список следует применить в первую очередь.
коммутативные и ассоциативные законы сложения и умножения позволяют складывать члены в любом порядке, а множители - в любом порядке, но смешанные операции должны подчиняться стандартному порядку операции.
В некоторых контекстах полезно заменить деление на умножение на обратную величину (мультипликативная обратная величина) и вычитание на добавление противоположной величины (аддитивная обратная величина). Например, в компьютерной алгебре это позволяет обрабатывать меньше бинарных операций и упрощает использование коммутативности и ассоциативности, когда упрощение больших выражений (подробнее см. Компьютерная алгебра § Упрощение ). Таким образом, 3 ÷ 4 = 3 × 1/4; Другими словами, частное 3 и 4 равно произведению 3 и 1/4. Также 3–4 = 3 + (−4); другими словами, разница 3 и 4 равна сумме 3 и −4. Таким образом, 1 - 3 + 7 можно представить как сумму 1 + (−3) + 7, и три слагаемых могут быть добавлены в любом порядке, во всех случаях давая результат 5.
Корневой символ √ традиционно продлевается чертой (vinculum ) над подкоренным выражением (это позволяет избежать использования круглых скобок вокруг подкоренного выражения). Другие функции используют круглые скобки вокруг ввода, чтобы избежать двусмысленности. Скобки можно опустить, если входные данные представляют собой единственную числовую переменную или константу (как в случае sin x = sin (x) и sin π = sin (π). Другое сокращенное соглашение, которое иногда используется, когда вход моном ; таким образом, sin 3x = sin (3x), а не (sin (3)) x, но sin x + y = sin (x) + y, потому что x + y не является мономом. однако это неоднозначно и не повсеместно понимается за пределами определенных контекстов. Некоторые калькуляторы и языки программирования требуют скобок вокруг вводимых функций, некоторые - нет.
Символы группировки могут использоваться для переопределения обычного порядка операций. Сгруппированные символы могут рассматриваться как одно выражение.Символы группировки могут быть удалены с помощью ассоциативного и распределительного законов, а также их можно удалить, если выражение внутри символа группировки достаточно упрощено, поэтому их удаление не вызывает двусмысленности.
Горизонтальная дробная линия также служит символом группировки:
Для удобства чтения часто используются другие символы группировки, такие как фигурные скобки {} или квадратные скобки [] вместе со скобками (). Например:
Мнемоника часто используется, чтобы помочь учащимся запомнить правила, включающие первые буквы слов, представляющие различные операции. В разных странах используются разные мнемонические символы.
Эта мнемоника может вводить в заблуждение, если написана таким образом. Например, неверное толкование любого из приведенных выше правил как означающего «сначала сложение, затем вычитание» приведет к неправильной оценке выражения
При оценке выражения Как указано выше, сложение и вычитание должны выполняться последовательно слева направо, поскольку вычитание является левоассоциативным и считается неассоциативной операцией. Либо работа слева направо, либо обработка вычитания как добавления числа со знаком даст правильный ответ; выполнение вычитания в неправильном порядке приведет к неправильному ответу. Мнемоники не отражают группировку сложения / вычитания или умножения / деления, поэтому их использование может привести к недопониманию.
Подобная двусмысленность существует и в случае последовательного деления, например, выражение a ÷ b ÷ c × d можно читать несколькими способами, но они не всегда могут давать один и тот же ответ.
Традиционно деление считается левоассоциативным. То есть, если в строке несколько делений, порядок вычислений идет слева направо:
Кроме того, математическая привычка комбинировать множители и представлять деление как умножение на обратную величину значительно снижает частоту неоднозначного деления.
Если возведение в степень обозначается составными символами с использованием надстрочной записи, обычное правило - работать сверху вниз:
, что обычно не равно (a).
Однако при использовании обозначения оператора с кареткой (^) или стрелкой (↑) общего стандарта не существует. Например, Microsoft Excel и язык программирования вычислений MATLAB оценивают a ^ b ^ c
как (a), но Google Search и Wolfram Alpha как файл. Таким образом, 4 ^ 3 ^ 2
оценивается как 4,096 в первом случае и как в 262,144 во втором случае.
Существуют разные соглашения относительно унарного оператора - (обычно читается как «минус»). В письменной или печатной математике выражение −3 интерпретируется как значение 0 - (3) = - 9.
В некоторых приложениях и языках программирования, особенно в Microsoft Excel (и других приложениях для работы с электронными таблицами)) и язык программирования bc, унарные операторы имеют более высокий приоритет, чем бинарные операторы, то есть унарный минус имеет более высокий приоритет, чем возведение в степень, поэтому в этих языках −3 будет интерпретироваться как (−3) = 9. Это не относится к бинарному оператору минус -; например, в Microsoft Excel, когда формулы = −2 ^ 2
, = - (2) ^ 2
и = 0 + −2 ^ 2
возвращают 4, формулы = 0−2 ^ 2
и = - (2 ^ 2)
возвращают −4.
Точно так же может быть двусмысленность в использовании символа косой черты / в таких выражениях, как 1 / 2x. Если переписать это выражение как 1 ÷ 2x, а затем интерпретировать символ деления как указание умножения на обратную величину, это станет:
В этой интерпретации 1 ÷ 2x равно (1 ÷ 2) x. Однако в некоторой академической литературе умножение , обозначаемое сопоставлением (также известное как подразумеваемое умножение ), интерпретируется как имеющее более высокий приоритет, чем деление, так что 1 ÷ 2x равно 1 ÷ ( 2x), а не (1 ÷ 2) x. Например, в инструкциях по отправке рукописей для журналов Physical Review указано, что умножение имеет более высокий приоритет, чем деление с косой чертой, и это также является условием, наблюдаемым в известных учебниках физики, таких как Курс изучения физики. Теоретическая физика автора Ландау и Лифшиц и Лекции Фейнмана по физике.
Различные калькуляторы выполняют разный порядок операций. Многие простые калькуляторы без стека реализуют вход по цепочке, работая слева направо без какого-либо приоритета, отдаваемого различным операторам, например, набрав
1 + 2 × 3
, получаем 9,, а более сложные калькуляторы будут использовать более стандартный приоритет, например, набрав
1 + 2 × 3
, получим 7.Программа Microsoft Calculator использует первое в стандартном представлении, а второе - в своем. научные и программистские взгляды.
Цепной ввод предполагает два операнда и оператор. Когда нажимается следующий оператор, выражение немедленно вычисляется, и ответ становится левой рукой следующего оператора. Расширенные калькуляторы позволяют вводить все выражение, сгруппированное по мере необходимости, и вычислять только тогда, когда пользователь использует знак равенства.
Калькуляторы могут связывать экспоненты слева или справа в зависимости от модели или режима оценки. Например, выражение a ^ b ^ c
интерпретируется как a в TI-92 и TI-30XS MultiView в «режиме Mathprint», тогда как он интерпретируется как (a) на TI-30XII и TI-30XS MultiView в «Классическом режиме».
Выражение типа 1 / 2x
интерпретируется как 1 / (2x) в TI-82, а также во многих современных калькуляторах Casio, но как (1/2) x от TI-83 и любого другого калькулятора TI, выпущенного с 1996 года, а также всех калькуляторов Hewlett-Packard с алгебраической записью. Хотя некоторые пользователи могут ожидать первую интерпретацию из-за природы подразумеваемого умножения, последнее больше соответствует стандартному правилу, согласно которому умножение и деление имеют равный приоритет, где 1 / 2x читается как единица. делится на два, а ответ умножается на x.
Когда пользователь не уверен, как калькулятор интерпретирует выражение, рекомендуется использовать круглые скобки, чтобы не было двусмысленности.
Калькуляторы, использующие обратную польскую нотацию (RPN), также известную как постфиксная нотация, используют стек для ввода выражений в правильном порядке приоритета без необходимости круглые скобки или любой, возможно, зависящий от модели порядок выполнения.
Некоторые языки программирования используют уровни приоритета, которые соответствуют порядку, обычно используемому в математике, хотя другие, такие как APL, Smalltalk, Occam и Mary, не имеют правил приоритета operator (в APL, оценка строго справа налево; в Smalltalk и т.д. строго слева направо).
Кроме того, поскольку многие операторы не ассоциативны, порядок в пределах одного уровня обычно определяется группировкой слева направо, так что 16/4/4
интерпретируется как (16/4) / 4 = 1, а не 16 / (4/4) = 16; такие операторы, возможно, ошибочно называют «левоассоциативными». Существуют исключения; например, языки с операторами, соответствующими операции cons над списками, обычно группируют их справа налево ("ассоциативно справа"), например в Haskell, 1: 2: 3: 4: == 1: (2: (3: (4:))) == [1,2,3,4]
.
Создатель языка C сказал о приоритете языка C (разделяемом языками программирования, которые заимствуют эти правила из C, например, C ++, Perl и PHP ), что было бы предпочтительнее переместить побитовые операторы над операторами сравнения. Однако многие программисты привыкли к такому порядку. Относительные уровни приоритета операторов, обнаруженные во многих языках C-стиля, следующие:
1 | () ->. :: | Вызов функции, область действия, доступ к массиву / члену |
2 | ! ~ - + * sizeof type cast ++ - | (большинство) унарных операторов, sizeof и приведение типов (справа налево) |
3 | * /% MOD | Умножение, деление, по модулю |
4 | + - | Сложение и вычитание |
5 | <<>> | Поразрядный сдвиг влево и вправо |
6 | < <=>>= | Сравнения: меньше и больше |
7 | ==! = | Сравнения: равно и не равно |
8 | Побитовое И | |
9 | ^ | Побитовое исключающее ИЛИ (XOR) |
10 | | | Побитовое включительно (нормальный) ИЛИ |
11 | Логическое И | |
12 | || | Логическое ИЛИ |
13 | ? : | Условное выражение (тройное) |
14 | = + = - = * = / =% = = | = ^ = <<=>>= | Операторы присваивания (справа налево) |
15 | , | Оператор-запятая |
Примеры: (Примечание: в приведенных ниже примерах "≡" используется для обозначения "эквивалентно" и не должно интерпретироваться как фактический оператор присваивания, используемый как часть выражения примера.)
! A +! B
≡ (! A) + (! B)
++ A +! B
≡ (++ A) + (! B)
A + B * C
≡ A + (B * C)
A || B C
≡ A || (B C)
A B == C
≡ A (B == C)
A B == C
≡ A (B = = C)
Компиляторы «исходный код», которые компилируются для нескольких языков, должны явно решать проблему разного порядка операций на разных языках. Haxe, например, стандартизирует порядок и обеспечивает его соблюдение путем вставки скобок там, где это уместно.
Было обнаружено, что точность знаний разработчика программного обеспечения о приоритете бинарных операторов тесно связана с частотой их появления в исходный код.