연산자의 우선순위
연산자의 우선순위(Operator Precedence)는 여러 연산자가 표현식에 있을 때, 어떤 연산이 먼저 수행되는지를 결정하는 규칙입니다. 프로그래밍 언어에서 연산자는 서로 다른 우선순위를 가지고 있으며, 이 우선순위에 따라 연산이 순차적으로 처리됩니다. 우선순위가 높은 연산자는 먼저 수행되며, 우선순위가 같은 연산자는 연산자의 결합 규칙에 따라 처리됩니다.
1. 연산자의 우선순위 규칙
우선순위: 연산자의 우선순위는 연산자가 수행되는 순서를 정의합니다. 우선순위가 높은 연산자는 우선적으로 수행됩니다.
결합 방향: 우선순위가 같은 연산자들 사이의 결합 방향을 정의합니다. 일반적으로 연산자는 왼쪽에서 오른쪽으로 결합(좌측 결합)하며, 일부 연산자는 오른쪽에서 왼쪽으로 결합(우측 결합)합니다.
2. 주요 연산자 우선순위
다음은 C, C++, Java, C#, Python 등에서 공통적으로 사용되는 연산자의 우선순위 목록입니다. 이 목록은 대체로 모든 언어에서 유사하지만, 각 언어마다 일부 차이가 있을 수 있습니다.
연산자 우선순위 표
부모heses: () — 가장 높은 우선순위
단항 연산자:
부정: - (음수), + (양수)
논리 NOT: ! (논리 부정)
증가/감소: ++, -- (전위 형태)
형 변환: (type) (형 변환)
배타적 논리합: ~ (비트 반전)
곱셈, 나눗셈, 나머지:
* (곱셈)
/ (나눗셈)
% (나머지)
덧셈, 뺄셈:
+ (덧셈)
- (뺄셈)
시프트 연산자:
<< (왼쪽 시프트)
>> (오른쪽 시프트)
비교 연산자:
== (같다)
!= (같지 않다)
> (크다)
< (작다)
>= (크거나 같다)
<= (작거나 같다)
논리 연산자:
&& (논리 AND)
|| (논리 OR)
조건 연산자: ?: (삼항 연산자)
할당 연산자:
= (단순 할당)
+=, -=, *=, /=, %= (복합 할당)
후위 연산자:
++ (증가)
-- (감소)
콜 연산자: () (함수 호출)
멤버 접근 연산자:
. (멤버 접근)
-> (포인터를 통한 멤버 접근)
결합 연산자:
[] (배열 접근)
. (구조체 멤버 접근)
-> (구조체 멤버 접근을 위한 포인터)
3. 연산자의 결합 방향
좌측 결합 (Left-to-right): 대부분의 연산자는 좌측에서 우측으로 결합합니다. 예를 들어, a - b - c는 (a - b) - c로 평가됩니다.
우측 결합 (Right-to-left): 일부 연산자는 우측에서 좌측으로 결합합니다. 예를 들어, 대입 연산자 =는 a = b = c로 평가됩니다. 이 경우 b = c가 먼저 평가되고 그 결과가 a에 대입됩니다.
4. 예제
C에서의 우선순위 예제
c
코드 복사
#include <stdio.h>
int main() {
int a = 5;
int b = 2;
int c = 10;
// 연산자 우선순위와 결합 방향을 적용한 예제
int result = a + b * c / b - a % 3; // 곱셈, 나눗셈, 나머지, 덧셈, 뺄셈 순서
// 순서: b * c (10) => 10 / b (5) => 5 % 3 (2) => a + 2 - a (5 + 2 - 5 = 2)
printf("Result: %d\n", result);
// 괄호를 사용하여 우선순위를 명시적으로 지정
int result2 = (a + b) * (c / b) - (a % 3);
// 순서: a + b (7) => c / b (5) => 7 * 5 (35) - (a % 3 (2) = 33)
printf("Result with parentheses: %d\n", result2);
return 0;
}
Python에서의 우선순위 예제
python
코드 복사
a = 5
b = 2
c = 10
# 연산자 우선순위와 결합 방향을 적용한 예제
result = a + b * c / b - a % 3
# 순서: b * c (20) => 20 / b (10.0) => a + 10.0 - a (5 + 10.0 - 5 = 10.0)
print(f"Result: {result}")
# 괄호를 사용하여 우선순위를 명시적으로 지정
result2 = (a + b) * (c / b) - (a % 3)
# 순서: a + b (7) => c / b (5.0) => 7 * 5.0 (35.0) - (a % 3 (2) = 33.0)
print(f"Result with parentheses: {result2}")
5. 결론
연산자의 우선순위는 수식의 평가 순서를 정의하는 중요한 규칙입니다. 우선순위가 높은 연산자가 먼저 평가되며, 동일한 우선순위의 연산자는 결합 방향에 따라 처리됩니다. 괄호를 사용하여 연산의 순서를 명확히 지정할 수 있으며, 이는 코드의 가독성과 정확성을 높이는 데 유용합니다. 각 언어에서 제공하는 연산자 우선순위를 이해하고 적절히 활용하는 것이 중요합니다.