표현식
표현식 (Expressions) (refch12)
표현식은 값을 만들어내는 식이에요. 연산자와 피연산자로 구성되고, 타입과 우선순위 규칙에 따라 값이 정해져요. 이 장에서는 파스칼 표현식과 연산자 우선순위를 다뤄요.
본문
표현식은 할당문이나 조건 검사에서 나타나요. 표현식은 연산자(operator)와 피연산자(operand) 두 구성 요소로 만들어져요.
대부분의 연산자는 이항(binary)이라 피연산자 두 개가 필요하고, 항상 피연산자 사이에 와요. 예를 들어 X/Y처럼요. 일부 연산자는 단항(unary)이라 피연산자 하나만 필요하고, 항상 피연산자 앞에 와요. -X처럼요.
표현식은 특정 타입의 값으로 풀려요. 결과 타입은 표현식 안 값들의 타입과 연산자가 결정해요. 여러 피연산자를 쓸 때는 표 12.1의 우선순위 규칙이 적용돼요.
표 12.1: 연산자 우선순위
| 연산자 | 우선순위 | 범주 |
|---|---|---|
| Not, 단항 +, 단항 -, @, ** | Highest (first) | 단항 연산자, 거듭제곱 |
| *, /, div, mod, and, shl, shr, as, <<, >> | Second | 곱셈 연산자 |
| +, -, or, xor, >< | Third | 덧셈 연산자 |
| =, <>, <, >, <=, >=, in, is | Lowest (Last) | 관계 연산자 |
우선순위를 정할 때 컴파일러는 다음 규칙을 써요.
-
우선순위가 다른 연산 사이에서는 피연산자가 더 높은 우선순위의 연산자에 속해요. 예를 들어
5*3+7에서 곱셈이 덧셈보다 우선순위가 높으므로 먼저 계산돼요. 결과는 22가 돼요. -
표현식에 괄호가 있으면 괄호 안이 먼저 계산돼요. 그래서
5*(3+7)은 50이 돼요. -
그 외에는 같은 우선순위의 이항 연산자가 왼쪽 결합(left-associative)이에요.
5 * 3 div 7은 2로 계산돼요(0이 아니에요).
Remark — 같은 우선순위의 표현식을 평가하는 순서는 왼쪽에서 오른쪽이 보장되지 않아요. 어떤 부분식이 먼저 평가될지 가정하면 안 돼요. 컴파일러는 최적화 규칙에 따라 먼저 평가할 부분식을 정해요. 예를 들어 다음에서
a := g(3) + f(2);
f(2)가 g(3)보다 먼저 실행될 수도 있어요. 이 동작은 델파이나 터보 파스칼과는 확실히 달라요. 어떤 표현식을 반드시 먼저 실행해야 한다면 임시 결과를 써서 문장을 나눠야 해요.
e1 := g(3);
a := e1 + f(2);
이 동작의 주목할 예외는 불리언 표현식의 평가예요. 단락(short-circuit) 불리언 평가가 켜져 있으면(기본값) 컴파일러는 왼쪽에서 오른쪽으로 평가하되 우선순위는 여전히 존중해요. 즉 같은 우선순위 구간에서는 왼쪽 피연산자가 항상 오른쪽보다 먼저 평가돼요.
그래서 다음 예시는
True or True and False
True or (True and False)와 같으므로 True로 평가돼요.