출처 - http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=714
이 강좌에서는 C/C++ 에서 사용하는 연산자의 우선 순위와 결합 법칙에 대하여 알아보도록 하겠습니다.

 
 
1. 연산자 우선 순위
 
    "연산자 우선 순위(priority)"란 데이터에 일정한 연산을 수행하기 위해 사용한 연산자들의 처리 순서를
    말합니다. 우리가 흔히 수학에서 적용하는 "곱셈과 덧셈이 섞여있는 연산을 할때에는 곱셈 먼저 한다"
    라는 규칙처럼 프로그램에서 연산자에 대한 처리 순서를 정의해 놓은 규칙입니다.
 
    C/C++ 언어에서 제공하는 연산자들에 대한 연산자 우선순위는 3번 항목을 참고하시기 바랍니다.
 
 
2. 연산 방향
 
    연산자 우선순위가 다른 연산을 할때는 어떤것부터 연산을 할것인지가 명확하기 때문에 문제가
    발생하지 않습니다. 하지만, 곱셈과 나눗셈처럼 연산자 우선순위가 같은 경우, 어떤것을 먼저
    할것인지에 따라서 결과값이 달라질수도 있습니다.
 
    예를들어, C/C++ 언어에서는 정수형이라는 데이터형이 제공됩니다. 정수형 데이터를 다룰때에는
    연산에 대한 결과값이 정수값으로만 처리되기 때문에 아래와 같은 상황이 발생할수 있습니다. 
 
    int data = 2 * 3 / 4;
 
    위 수식에서는 곱셈과 나눗셈이 같이 사용되었기 때문에 연산자 우선순위가 동일합니다. 이 경우,
    곱셈을 먼저 처리한다면 결국 아래와 같은 수식이 되고 data 변수에는 1 이 저장됩니다.
 
    int data = ( 2 * 3 ) / 4;
                 = 6 / 4;
                 = 1;  // 정수형 연산을 하기 때문에 소숫점 이하는 버립니다.
 
    반대로 나눗셈을 먼저 처리한다면 결국 아래와 같은 수식이 되고 data 변수에는 0 이 저장됩니다.
 
    int data =  2 * ( 3 / 4 );
                 = 2 * 0;  // 3/4 는 0.75이고 정수형으로 처리되기 때문에 소숫점이하는 버려서 0 이 됩니다.
                 = 0; 
 
    따라서 연산자 우선순위가 같은 두 연산자를 처리할때에 왼쪽에서 오른쪽으로 처리하는지 또는
    오른쪽에서 왼쪽으로 처리하는지에 따라 결과가 달라지기 때문에 연산 방향이라는 규칙이 하나더
    제공되게 됩니다. 각 연산자 별로 연산자 우선순위가 동일한 연산자들에 대해서는 3번 항목에서
    볼수 있는것처럼 연산방향이 명시되어 있습니다.
 
 
3. 연산자 우선순위 표
 
    아래는 C/C++ 에서 사용하는 연산자 우선순위입니다. 이 연산자 우선순위 표를 다 암기하실 필요는
    없지만, 자주 사용하는 연산자들은 기억해 두시는게 좋습니다.
   

순위

종류

연산자

 연산 방향  

1

 괄호, 배열, 구조체  ( )  .  [ ]  ->  ::

좌→우

2

 단항 연산자  *(간접)  &(주소)  !  -  ++  --  +(부호)  -(부호)  sizeof  new  delete

우→좌

3

 구조체 결합연산자  .*  ->*

좌→우

4

 승제 연산자  *  /  %

좌→우

5

 가감 연산자  +  -

좌→우

6

 시프트(Shift) 연산자    <<  >>

좌→우

7

 비교 연산자  <  <=  >  >=

좌→우

8

 등가 연산자  ==  !=

좌→우

9

 비트 연산자 AND  &

좌→우

10

 비트 연산자 XOR  ^

좌→우

11

 비트 연산자 OR  |

좌→우

12

 논리 연산자 AND  &&

좌→우

13

 논리 연산자 OR  ||

좌→우

14

 조건 연산자  ?:

우→좌

15

 대입 연산자  =  *=  /=  +=  -=  %=  <<=  >>=  &=  ^=  |=

우→좌

16

 나열 연산자  ,

좌→우

 
 
4. 간단한 연산자 우선순위 예제
 
    3번 항목의 연산자 우선 순위 표를 참고하여 아래의 코드를 살펴보도록 하겠습니다.
    ( 해당 라인에서 연산자 우선순위가 가장 높은 연산식은 붉은색으로 표시했습니다. )
 
    int data = 5, result = 0;
 
    result = 3 + 10 * ( 2 + 3 ) / 5 % --data;
    //          3 + 10 * ( 2 + 3 ) / 5 % --data;
    //          3 + 10 *      5      / 5 % --data;
    //          3 + 10 *      5      / 5 %    4;
    //          3 +        50         / 5 %    4;
    //          3 +              10        %    4;
    //          3 +                   2;
    //          5 

+ Recent posts