C 언어에서 연산자 우선순위(operator precedence)는 표현식 내에서 항들이 어떻게 묶이는지를 결정하고, 표현식이 평가되는 순서를 정합니다. 모든 연산자의 우선순위가 같은 것은 아니며, 예를 들어 곱셈 연산자는 덧셈 연산자보다 높은 우선순위를 가집니다.
예를 들어 x = 7 + 3 * 2;라는 코드에서 x에는 20이 아니라 13이 할당됩니다. 곱셈 연산자(*)가 덧셈 연산자(+)보다 우선순위가 높기 때문에 먼저 3 * 2가 계산된 후, 그 결과에 7이 더해지기 때문입니다.
아래 표에서는 우선순위가 가장 높은 연산자가 맨 위에, 가장 낮은 연산자가 맨 아래에 정렬되어 있습니다. 하나의 표현식 안에서는 우선순위가 높은 연산자부터 먼저 평가됩니다.
| 분류 | 연산자 | 결합 방향 |
|---|---|---|
| 후위(Postfix) | () [] -> . ++ -- | 왼쪽 → 오른쪽 |
| 단항(Unary) | + - ! ~ ++ -- (type) * & sizeof | 오른쪽 → 왼쪽 |
| 곱셈(Multiplicative) | * / % | 왼쪽 → 오른쪽 |
| 덧셈(Additive) | + - | 왼쪽 → 오른쪽 |
| 시프트(Shift) | << >> | 왼쪽 → 오른쪽 |
| 관계(Relational) | < <= > >= | 왼쪽 → 오른쪽 |
| 동등(Equality) | == != | 왼쪽 → 오른쪽 |
| 비트 AND | & | 왼쪽 → 오른쪽 |
| 비트 XOR | ^ | 왼쪽 → 오른쪽 |
| 비트 OR | | | 왼쪽 → 오른쪽 |
| 논리 AND | && | 왼쪽 → 오른쪽 |
| 논리 OR | || | 왼쪽 → 오른쪽 |
| 조건부(Conditional) | ?: | 오른쪽 → 왼쪽 |
| 대입(Assignment) | = += -= *= /= %=>>= <<= &= ^= |= | 오른쪽 → 왼쪽 |
| 쉼표(Comma) | , | 왼쪽 → 오른쪽 |
예제 코드
#include <stdio.h>
main() {
int a = 20;
int b = 10;
int c = 15;
int d = 5;
int e;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
printf("Value of (a + b) * c / d is : %d\n", e );
e = ((a + b) * c) / d; // (30 * 15 ) / 5
printf("Value of ((a + b) * c) / d is : %d\n" , e );
e = (a + b) * (c / d); // (30) * (15/5)
printf("Value of (a + b) * (c / d) is : %d\n", e );
e = a + (b * c) / d; // 20 + (150/5)
printf("Value of a + (b * c) / d is : %d\n" , e );
return 0;
}실행 결과
Value of (a + b) * c / d is : 90 Value of ((a + b) * c) / d is : 90 Value of (a + b) * (c / d) is : 90 Value of a + (b * c) / d is : 50
참고 사항
위 예제에서 볼 수 있듯이, 괄호의 위치에 따라 계산 순서가 달라지면 결과값도 달라질 수 있습니다. 연산자 우선순위를 매번 기억하기 어렵다면 괄호 ()를 사용하여 계산 순서를 명시적으로 지정하는 것이 좋습니다. 괄호는 모든 연산자 중 가장 높은 우선순위를 가지므로, 코드의 의도를 명확히 하고 실수를 줄일 수 있습니다.