3.12 연산의 방향과 우선순위

산술 연산식에서 덧셈(+), 뺄셈(-) 연산자보다는 곱셈(*), 나눗셈(/) 연산자가 우선 처리된다는 것을 우리는 이미 알고 있다. 그러면 다른 연산자들의 경우는 어떨까? 예를 들어 다음과 같은 연산식에서 && 연산자가 먼저 처리될까? 아니면 >, < 연산자가 먼저 처리될까?

x > 0 && y < 0

연산자는 우선순위가 정해져 있다. &&보다는 >, <가 우선순위가 높기 때문에 x > 0y < 0이 먼저 처리되므로 &&x > 0y < 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
서브목차