수학(mathematics) 및 컴퓨터 프로그래밍(computer programming)에서, 연산의 순서(order of operations, 또는 연산자 우선 순위(operator precedence))는 주어진 수학적 표현(mathematical expression)을 평가하기 위해 먼저 수행할 절차에 대한 협약을 반영하는 규칙의 모음입니다.
예를 들어, 수학 및 대부분의 컴퓨터 언어에서, 곱셈은 덧셈보다 더 높은 우선 순위를 부여받고, 그것은 현대 대수적 표기법(algebraic notation)의 도입 이래로 이런 방법으로 사용되어 왔습니다. 따라서, 1 + 2 × 3이라는 표현은 (1 + 2) × 3 = 9가 아닌 1 + (2 × 3) = 7의 값을 가지는 것으로 해석됩니다. 16세기와 17세기에 지수가 도입되었을 때, 그것들은 덧셈과 곱셈 모두에 대해 우선 순위가 주어졌고, 밑의 오른쪽에 위첨자로만 놓일 수 있습니다. 따라서 \(3+5^2=28\)이고 \(3 \times 5^2=75\)입니다.
이들 규칙은 표기법의 모호함을 피하면서 표기법을 가능한 한 간략하게 하기 위해 존재합니다. 우선 순위 협약을 덮어쓰거나, 단순히 강조하기를 원할 때 괄호 ( )를 사용할 수 있습니다. 예를 들어, (2 + 3) × 4 = 20은 덧셈이 곱셈보다 우선하도록 하고, \((3+5)^2=64\)는 덧셈이 지수(exponentiation)보다 우선하도록 합니다. 만약 수학 표현식에 여러 쌍의 괄호 (예를 들어 중첩 괄호의 경우)가 필요하면, 혼동을 피하기 위해 [2 × (3 + 4)] − 5 = 9와 같이 괄호를 대괄호 또는 중괄호로 대체할 수 있습니다.
인터넷 밈(Internet memes)은 때때로 분쟁을 일으키고 웹 트래픽을 증가시키는 모호한 표현을 제시합니다. 이들 모호한 표현의 대부분은 연산 순서에 대한 일반적인 합의가 없는 혼합된 나눗셈과 곱셈을 포함하고 있습니다.
Definition
연산의 순서, 즉, 수식에서 연산이 수행되어야 하는 순서는 수학, 과학, 기술, 및 많은 컴퓨터 프로그래밍 언어에서 사용됩니다. 그것은 다음과 같이 표현됩니다:
이것은 표현식을 평가하기 위해, 먼저 괄호 안의 부분-표현식을 평가하고, 하나보다 많은 집합이 있으면 내부에서 외부로 작업한다는 의미입니다. 괄호 안에 있든 없든, 위 목록에서 위에 있는 연산자가 먼저 적용되어야 합니다.
덧셈과 곱셈의 교환법칙과 결합법칙은 임의의 순서로 항을 더하고, 임의의 순서로 인수를 곱하는 것을 허용하지만, 혼합된 연산은 표준 연산의 순서를 따라야 합니다.
일부 문맥에서, 나눗셈을 역수 (곱셈의 역)에 의한 곱셈으로 대체하고 뺄셈을 반대 (덧셈의 역)의 덧셈으로 대체하는 것이 도움이 됩니다. 예를 들어, 컴퓨터 대수에서, 이를 통해 더 적은 수의 이항 연산(binary operations)을 처리할 수 있고, 큰 표현식을 단순화할 때 교환성과 결합성을 더 쉽게 사용할 수 있습니다 (자세한 내용에 대해, 컴퓨터 Computer algebra § Simplification 참조). 따라서 3 ÷ 4 = 3 × 1/4; 다시 말해서, 3과 4의 몫은 3과 1/4의 곱과 같습니다. 역시 3 − 4 = 3 + (−4); 다시 말해서, 3과 4의 차이는 3과 −4의 합과 같습니다. 따라서 1 − 3 + 7은 1 + (−3) + 7의 합으로 생각될 수 있고, 세 개의 피합수(summands)는 임의의 순서로 더할 수 있고, 모든 경우에서 결과가 5를 생성합니다.
제곱근 기호 \(\sqrt{\;}\)는 전통적으로 피제곱근 위에 막대 (괄선이라고 함)로 연장됩니다 (이렇게 하면 피제곱근 주위에 괄호가 필요하지 않습니다). 다른 함수는 모호성을 피하기 위해 입력 주위에 괄호를 사용합니다. 괄호는 만약 입력이 sin x = sin(x) 및 sin π = sin(π)의 경우와 같이 단일 수치 변수 또는 상수이면 생략될 수 있습니다. 때때로 사용되는 또 다른 축약 규칙은 입력이 단항식(monomial)일 때입니다; 따라서, (sin(3)) x가 아니라 sin 3x = sin(3x)이지만, sin x + y = sin(x) + y인데, 왜냐하면 x + y는 단항식이 아니기 때문입니다. 이것은, 어쨌든, 모호하고 특정 맥락 밖에서는 보편적으로 이해되지 않습니다. 일부 계산기와 프로그래밍 언어는 함수 입력 주위에 괄호가 필요하지만, 일부는 필요하지 않습니다.
그룹화의 기호(Symbols of grouping)를 사용하여 일반적인 연산의 순서를 덮어쓸 수 있습니다. 그룹화된 기호는 단일 표현식으로 취급될 수 있습니다. 그룹화의 기호는 결합 법칙과 분배 법칙을 사용하여 제거될 수 있고, 역시 그것들은 그룹화의 기호 안의 표현이 충분히 단순화하여 제거해도 모호함이 발생하지 않으면 제거될 수 있습니다.
Examples
덧셈 전에 곱셈:
\(\quad\displaystyle 1 + 2 \times 3 = 1 + 6 = 7 .\)
괄호친 부분-표현은 먼저 평가됩니다:
\(\quad\displaystyle (1 + 2) \times 3 = 3 \times 3 = 9 .\)
곱셈 전에 지수, 뺄셈 전에 곱셈:
\(\quad\displaystyle 1 - 2 \times 3 ^ 4 = 1 - 2 \times 81 = 1 - 162 = -161 .\)
표현식이 위첨자로 쓸 때, 위첨자는 밑수 위의 위치에 따라 그룹화되는 것으로 고려됩니다:
\(\quad\displaystyle 1+2^{3+4} = 1+2^7 = 1+128 = 129 ,\) 반면에 1 + 2 ^ 3 + 4, 예를 들어, C 프로그램에서, \(\displaystyle 1 + 8 + 4 = 13\)와 동등합니다.
제곱근 기호의 피연산자는 위쪽-막대에 의해 결정됩니다:
\(\quad\displaystyle \sqrt{1 + 3} + 5 = \sqrt 4 + 5 = 2 + 5 = 7.\)
수평 분수선은 그룹화의 기호로도 사용됩니다:
\(\quad\displaystyle \frac{1 + 2}{3 + 4} + 5 = \frac{3}{7} + 5.\)
읽기 쉽도록, 중괄호 { } 또는 대괄호 [ ]와 같은 다른 그룹화 기호는 때때로 괄호 ( )와 함께 사용됩니다. 예를 들어:
\(\quad\displaystyle ( [1 + 2] \div [3 + 4] ) + 5 = (3 \div 7) + 5 \)와 동등합니다.
Special cases
Serial exponentiation
만약 지수(exponentiation)가 위첨자 표기법을 사용하여 쌓인 기호로 표시되며, 보통의 규칙은 위에서 아래로 연산하는 것입니다:
\(\quad a^{b^c} = a^{(b^c)}\)
이는 전형적으로 ((a^b)^c\)와 같지 않습니다. 이 규칙은 \((a^b)^c = a^{bc}\)라는 지수화의 속성이 있기 때문에 유용하므로, 이를 위해 직렬 지수화를 사용할 필요가 없습니다.
어쨌든, 캐럿 (^) 또는 화살표 (↑)와 함께 연산자 표기법을 사용할 때, 공통적인 표준이 없습니다. 예를 들어, Microsoft Excel 및 계산 프로그래밍 언어 MATLAB은 a^b^c를 \((a^b)^c\)로 평가하지만, Google Search 및 Wolfram Alpha는 \(a^{b^c}\)로 평가합니다. 따라서, 4^3^2는 첫 번째 경우에는 4,096으로, 두 번째 경우에는 262,144로 평가됩니다.
Unary minus sign
단항 연산자 − (보통 "빼기(마이너스)"라고 읽음)에 관한 다른 규칙이 있습니다. 쓴 또는 인쇄된 수학에서, \(-3^2\)라는 표현은 \(-(3^2)=-9\)를 의미하는 것으로 해석됩니다.
일부 응용 프로그램과 프로그래밍 언어, 특히 Microsoft Excel, PlanMaker (및 기타 스프레드시트 응용 프로그램), 및 프로그래밍 언어 bc에서, 단항 연산자가 이항 연산자보다 우선 순위가 높습니다. 즉, 단항 빼기가 지수보다 우선 순위가 높으므로, 이들 언어에서 \(-3^2\)는 \((-3)^2=9\)로 해석됩니다. 이것은 이항 빼기 연산자 −에는 적용되지 않습니다; 예를 들어 Microsoft Excel에서 형식 =−2^2, =−(2)^2 및 =0+−2^2는 4를 반환하고, 형식 =0−2^2 및 =−(2^2)는 −4를 반환합니다.
Mixed division and multiplication
일부 학술 문헌에서, 병치로 표시되는 곱셈 (암시적 곱셈(implied multiplication)이라고도 알려져 있음)은 나눗셈보다 우선 순위가 높은 것으로 해석되므로, 1 ÷ 2n은 (1 ÷ 2)n이 아니라 1 ÷ (2n)과 같습니다. 예를 들어, Physical Review 저널의 원고 제출 지침에는 곱셈이 나눗셈보다 우선 순위가 높다고 명시되어 있고, 이는 Landau와 Lifshitz에 의한 Course of Theoretical Physics 및 Feynman Lectures on Physics와 같은 저명한 물리학 교과서에서도 관찰되는 규칙입니다.
이 모호성은 "8÷2(2+2)"와 같은 인터넷 밈에서 종종 악용되며, 두 가지 상충되는 해석이: 8÷[2(2+2)] = 1와 [8÷2](2+2) = 16이 있습니다. "6÷2(1+2)" 방정식도 정확히 같은 방식으로 악명을 얻었으며, 두 가지 해석으로 답은 1과 9를 초래합니다.
나눗셈에 슬래시 기호 '/'를 사용하면 모호성이 발생할 수도 있습니다. Physical Review 제출 지침은 a/b/c 형식의 표현을 피하도록 제안합니다; 대신 (a/b)/c 또는 a/(b/c)를 쓺으로써 모호성을 피할 수 있습니다.
Calculators
다른 계산기는 다른 연산의 순서를 따릅니다. 스택 구현 체인 입력(chain input)이 없는 많은 간단한 계산기는 다른 연산자에 어떤 우선 순위를 부여하지 않고 왼쪽에서 오른쪽으로 작업하여, 보다 정교한 계산기에 의해 제공되는 것과 다른 결과를 제공합니다. 예를 들어, 간단한 계산기에서, 1 + 2 × 3 =를 입력하면 9가 나오고, 반면 더 정교한 계산기는 더 표준적인 우선순위를 사용하므로 1 + 2 × 3 =을 입력하면 7을 산출합니다.
Microsoft Calculator 프로그램은 표준 보기에서 전자를 사용하고 과학 및 프로그래머 보기에서 후자를 사용합니다.
체인 입력에는 피연산자(operands) 2개와 연산자 1개가 필요합니다. 다음 연산자를 누를 때, 표현식이 즉시 평가되고 답은 다음 연산자의 왼쪽 편이 됩니다. 고급 계산기를 사용하면 필요에 따라 그룹화된 전체 표현을 입력할 수 있으며, 사용자가 등호를 사용할 때만 평가합니다.
계산기는 지수를 왼쪽이나 오른쪽으로 결합할 수 있습니다. 예를 들어, a^b^c라는 표현은 TI-92와 "Mathprint mode"에서 TI-30XS MultiView에서 \(a^{(b^c)}\)로 해석되고, 반면 TI-30XII와 "Classic mode"에서 TI-30XS MultiView에서 \((a^b)^c\)로 해석됩니다.
1/2x와 같은 표현은 TI-82와 많은 최신 Casio 계산기에서 1/(2x)로 해석되지만, TI-83와 1996년 이후 출시된 모든 각 TI 계산기와 대수적 표기법을 갖는 모든 Hewlett-Packard 계산기에서도 (1/2)x로 해석됩니다. 암시적 곱셈(implied multiplication)의 본성으로 인해 일부 사용자는 첫 번째 해석을 예상할 수 있지만, 후자는 곱셈과 나눗셈의 우선 순위가 같다는 규칙에 더 가깝습니다.
사용자가 계산기가 표현식을 해석하는 방법을 확신하지 못할 대, 괄호를 사용하여 모호성을 제거할 수 있습니다.
연산의 순서가 필요하지 않은 후위 표기법(postfix notation)이나 전위 표기법(prefix notation)과 달리 이러한 규칙이 없으면 표기상 모호할 수 있는 표준 수학 표기법에서 중위 표기법(infix notation)의 적응으로 인해 연산의 순서가 발생했습니다. 따라서, 올바른 우선 순위로 표현식을 입력하기 위해 스택을 사용하는 역 폴란드 표기법(Reverse Polish notation, 줄여서 RPN)을 사용하는 계산기에는 괄호나 모델별 실행 순서가 필요하지 않습니다.
Programming languages
일부 프로그래밍 언어는 수학에서 공통적으로 사용되는 순서를 따르는 우선 순위 수준을 사용하지만, APL, Smalltalk, Occam, 와 Mary와 같은 다른 프로그래밍 언어에는 연산자 우선 순위 규칙이 없습니다 (APL에서, 평가는 엄격하게 오른쪽에서 왼쪽으로 이루어집니다; Smalltalk에서, 그것은 엄격하게 왼쪽에서 오른쪽으로 이루어집니다).
게다가, 많은 연산자가 결합적이지 않기 때문에, 임의의 단일 수준 안의 순서는 보통 16/4/4가 16/(4/4) = 16가 아니라 (16/4)/4 = 1로 해석되도록 왼쪽에서 오른쪽으로 그룹화함으로써 정의됩니다; 그러한 연산자는 "왼쪽 결합적"이라고 참조됩니다. 예외가 존재합니다; 예를 들어, 목록의 cons 연산에 해당하는 연산자를 갖는 언어는 보통 목록을 오른쪽에서 왼쪽으로 그룹화합니다 ("오른쪽 결합적"), 예를 들어, Haskell에서, 1:2:3:4:[] == 1:(2:(3:(4:[]))) == [1,2,3,4].
C 언어의 창시자, 데니스 리치(Dennis Ritchie)는 C (예를 들어 C++, Perl, 및 PHP와 같이 C에서 그것들의 규칙을 차용한 프로그래밍 언어에서 공유됨)의 우선 순위에 대해, 비트 연산자를 비교 연산자 위로 옮기는 것이 더 좋았을 것이라고 말했습니다. 많은 프로그래머가 이 순서에 익숙해졌지만, Python 및 Ruby와 같은 최근 인기 있는 언어에서는 이 순서가 반대입니다. 많은 C 스타일 언어에서 발견되는 연산자의 상대적 우선 순위 수준은 다음과 같습니다:
예제: (참고: 아래 예에서 '≡'는 "동일함"을 의미하기 위해 사용되고, 예제 표현의 일부로 사용되는 실제 대입 연산자로 해석되지 않습니다.)
- !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)
(Python, Ruby, PARI/GP, 및 다른 유명한 언어에서, A & B == C ≡ (A & B) == C.)
여러 언어로 컴파일되는 Source-to-source compilers는 언어 사이에 다른 연산의 순서 문제를 명시적으로 처리해야 합니다. 예를 들어, Haxe는 순서를 표준화하고 적절한 곳에 괄호를 삽입하여 순서를 시행합니다.
이항 연산자 우선 순위에 대한 소프트웨어 개발자 지식의 정확성은 소스 코드에서 발생 빈도를 밀접하게 따르는 것으로 밝혀져 왔습니다.
Further reading
- Bergman, George Mark (2013-02-21). "Order of arithmetic operations; in particular, the 48/2(9+3) question". Department of Mathematics, University of California. Archived from the original on 2020-05-20. Retrieved 2020-07-22.
- "The Order of Operations". MathSteps: What is it?. Houghton Mifflin Company. 1999. Archived from the original on 2020-07-21. Retrieved 2020-07-22.