3.12 연산의 방향과 우선순위
산술 연산식에서 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선 처리된다는 것을 우리는 이미 알고 있다. 그러면 다른 연산자들의 경우는 어떨까? 예를 들어 다음과 같은 연산식에서 && 연산자가 먼저 처리될까? 아니면 >, < 연산자가 먼저 처리될까?
x > 0 && y < 0
연산자는 우선순위가 정해져 있다. &&보다는 >, <가 우선순위가 높기 때문에 x > 0과 y < 0이 먼저 처리되므로 &&는 x > 0과 y < 0의 산출값을 가지고 연산하게 된다.
우선순위 피라미드 (위쪽이 먼저 실행됨)
graph TD
P1["1. 단항 연산자 (+, -, ++, --, !)"] --- P2["2. 산술 연산자 (*, /, % -> +, -)"]
P2 --- P3["3. 비교 연산자 (>, <, >=, <=, ==, !=)"]
P3 --- P4["4. 논리 연산자 (&&, ||)"]
P4 --- P5["5. 대입 연산자 (=, +=, -=)"]
style P1 fill:#ff9,stroke:#333
style P2 fill:#cfc,stroke:#333
style P3 fill:#ccf,stroke:#333
style P4 fill:#fcc,stroke:#333
style P5 fill:#eee,stroke:#333
그러면 우선순위가 같은 연산자들끼리는 어떤 순서로 처리될까? 이 경우는 연산의 방향에 따라 달라진다. 대부분의 연산자는 왼쪽에서부터 오른쪽으로(->) 연산을 수행한다. 예를 들어 다음 연산식을 보자.
100 * 2 / 3 % 5
*, /, %는 같은 우선순위를 갖고 있다. 이 연산자들은 연산 방향이 왼쪽에서 오른쪽으로 수행된다. 따라서 100 * 2가 제일 먼저 연산되어 200이 산출되고, 그 다음 200 / 3이 연산되어 66이 산출된다. 그 다음으로 66 % 5가 연산되어 결과값 1이 나온다.
하지만 대입 연산자(=, +=, -=, …)는 오른쪽에서 왼쪽(<-)으로 연산을 수행한다.
a = b = c = 5;
위 연산식은 c = 5, b = c, a = b 순서로 실행된다. 따라서 실행되고 난 후에는 a, b, c의 값이 모두 5가 된다. 이와 같이 연산자는 우선순위 및 연산 방향이 정해져 있기 때문에 복잡한 연산식에서는 주의가 필요하다.
위 표를 숙지했다 하더라도 여러 가지 연산자들이 섞여 있다면 어느 연산자가 먼저 처리될지 매우 혼란스러울 것이다. 그래서 먼저 처리해야 할 연산을 괄호()로 묶는 것을 추천한다. 괄호()는 최우선순위를 가지기 때문이다.
int var1 = 1;
int var2 = 3;
int var3 = 2;
int result = var1 + var2 * var3; // 1 + (3 * 2) = 7
int result = (var1 + var2) * var3; // (1 + 3) * 2 = 8