우선순위와 결합 규칙
10 - 4 - 3은 3일까, 9일까?
우선순위 규칙
사이에 낀 b는 누구와 먼저 묶일까
연산자마다 먼저 계산되는 차례인 우선순위가 있습니다. 나란히 놓인 두 연산자는 우선순위가 높은 쪽을 먼저 계산합니다. 이것이 연산자 우선순위 규칙(operator precedence rules)입니다. *가 +보다 높으므로 b는 *와 먼저 묶입니다.
2강에서는 이 규칙을 문법으로 적는 법을 봤고, 여기서는 규칙 자체를 봅니다.
우선순위의 순서
높은 것부터 다섯 단
일반적인 순서입니다. 괄호가 가장 높고 덧셈과 뺄셈이 가장 낮습니다. 그래서 a + b * c에서는 b * c를 먼저 계산하고, 그 결과에 a를 더합니다.
**는 거듭제곱 기호입니다. 2 ** 3은 2를 세 번 곱한 8입니다. 이 연산자가 없는 언어도 있습니다.
결합 규칙
순위가 같으면 방향으로 정합니다
우선순위가 같은 연산자가 나란히 있으면 어느 방향부터 계산할지를 정합니다. 이것이 연산자 결합 규칙(operator associativity rules)입니다. 보통은 왼쪽부터라서 답은 3입니다.
숫자 10, 4, 3은 예시입니다.
예외
오른쪽부터 묶는 경우
거듭제곱은 오른쪽부터 묶습니다. APL이라는 언어는 더 특이합니다. 모든 연산자의 우선순위가 같고, 모두 오른쪽부터 묶습니다. 그래서 3 × 4 + 5가 APL에서는 27입니다.
숫자는 예시입니다. Fortran에서는 단항 연산자도 오른쪽부터 묶는 경우가 있습니다.
괄호
괄호는 규칙을 이깁니다
어느 언어에서나 괄호 안의 식을 먼저 계산합니다. 우선순위와 결합 규칙이 정한 순서를 바꾸고 싶으면 괄호로 묶으면 됩니다.
1편에서 본 3 + 4 * 5입니다.
규칙이 필요 없는 언어
Scheme은 괄호만 씁니다
Scheme과 Common Lisp에서는 산술 연산이 모두 서브프로그램 호출이고, 연산자를 맨 앞에 씁니다. 괄호가 겹친 모양이 곧 계산 순서라서 우선순위 규칙도 결합 규칙도 필요 없습니다.
서브프로그램은 함수처럼 이름을 붙여 부르는 코드 묶음입니다.
다음 편