카테고리 없음

연산자의 우선순위

안테 2024. 4. 22. 20:54

연산자의 우선순위(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. 결론
연산자의 우선순위는 수식의 평가 순서를 정의하는 중요한 규칙입니다. 우선순위가 높은 연산자가 먼저 평가되며, 동일한 우선순위의 연산자는 결합 방향에 따라 처리됩니다. 괄호를 사용하여 연산의 순서를 명확히 지정할 수 있으며, 이는 코드의 가독성과 정확성을 높이는 데 유용합니다. 각 언어에서 제공하는 연산자 우선순위를 이해하고 적절히 활용하는 것이 중요합니다.