2015년 5월 26일 화요일

C/C++ 연산자의 우선 순위와 결합 방향

연산자 우선 순위

 한 수식에 여러 개의 연산자를 사용하는 경우에 연산자들의 우선순위를 고려하지 않을 수 없다. 연산자 우선순위를 정리하면 다음과 같다.
  1. 괄호, 배열, 구조체, 공용체멤버를 나타내는 지시자 (), [], ->, . 은 우선순위가 가장 높다.
  2. 한 개의 피연산자를 갖는 단항연산자(!, ++, -- 등)이 그 다음으로 우선순위가 높다.
  3. 그 다음은 산술 연산자 (+, - *, /, %)이다.
  4. 쉬프트연산자와 비교연산자는 비트연산자보다 연산순위가 높다.
  5. 맨 하위에 대입연산자와 콤마(,)연산자가 있다.

[표 1] 연산자 우선 순위와 결합 방향
순위
연산자
결합 방향
1
( ) [ ] -> .
2
! ~ ++ -- - + (cast) *(pointer) &(addr) sizeof
3
* / %
4
+ -
5
<< >>
6
< <= > >=
7
== !=
8
&
9
^
10
|
11
&&
12
||
13
?:
14
= += -= *= /= %= ^= |= <<= >>=
15
,

연산자 우선 순위와 결합 방향을 고려하여 프로그래밍하는 것은 프로그래머의 몫이며 프로그래밍은 가독성(간결성)과 효율(길이) 측면에서 고민하게 되는 경우가 자주 발생한다. 한 수식에 부득이하게 연산자를 여러 개를 써야 한다면 괄호 등을 적극 활용하여 우선 순위를 명확히 하는 것이 좋다.

연산자 결합 방향

 한 수식에서 동일한 우선순위를 가진 연산자들이 연속적으로 나타나 있으면 연산자의 결합 방향을 고려하여야 한다. 대부분의 연산자들은 왼쪽에서 오른쪽으로 결합을 한다. 하지만 반대로 오른쪽에서 왼쪽으로 결합하는 연산자가 있다.
  1. 단항연산자, 형변환연산자, sizeof등은 오른쪽에서 왼쪽으로 결합한다.
  2. 조건 연산자 (?) 는 오른쪽에서 왼쪽으로 결합한다.
  3. 대입 연산자는 오른쪽에서 왼쪽으로 결합한다.

[표 2] 연산자 결합 방향 예시
수식
결합 결과
a = x +y - z
a = (x + y) - z
a = x * y / z
a = (x * y) / z
a = x && y || z
a = (x && y) || z
a = y+= z
a = (y+= z)
a = *x++
a = *(x++)

예를 들어서 sA=sY+=sZ 와 같은 표현식은 내부적으로 정해진 결합 순서에 의해서 오른쪽에서 왼쪽으로 결합하겠지만 프로그래머가 아예

sA = (sY += sZ);

와 같이 괄호를 명시하든가 더 가독성을 높이려면

sY += sZ;
sA = sY;

와 같이 두 줄로 나누어 쓰는 것이 더 나아보일 수도 있다. 이는 전적으로 작성자의 성향에 달려있다고 할 수 있다.


댓글 없음:

댓글 쓰기