연산자 우선 순위
한 수식에 여러 개의 연산자를 사용하는 경우에 연산자들의 우선순위를 고려하지 않을 수 없다. 연산자 우선순위를 정리하면 다음과 같다.
- 괄호, 배열, 구조체, 공용체멤버를 나타내는 지시자 (), [], ->, . 은 우선순위가 가장 높다.
- 한 개의 피연산자를 갖는 단항연산자(!, ++, -- 등)이 그 다음으로 우선순위가 높다.
- 그 다음은 산술 연산자 (+, - *, /, %)이다.
- 쉬프트연산자와 비교연산자는 비트연산자보다 연산순위가 높다.
- 맨 하위에 대입연산자와 콤마(,)연산자가 있다.
[표 1] 연산자 우선 순위와 결합 방향
순위
|
연산자
|
결합 방향
|
1
|
( ) [ ] -> .
|
⇒
|
2
|
! ~ ++ -- - + (cast) *(pointer) &(addr) sizeof
|
⇐
|
3
|
* / %
|
⇒
|
4
|
+ -
|
⇒
|
5
|
<< >>
|
⇒
|
6
|
< <= > >=
|
⇒
|
7
|
== !=
|
⇒
|
8
|
&
|
⇒
|
9
|
^
|
⇒
|
10
|
|
|
⇒
|
11
|
&&
|
⇒
|
12
|
||
|
⇒
|
13
|
?:
|
⇐
|
14
|
= += -= *= /= %= ^= |= <<= >>=
|
⇐
|
15
|
,
|
⇒
|
연산자 우선 순위와 결합 방향을 고려하여 프로그래밍하는 것은 프로그래머의 몫이며 프로그래밍은 가독성(간결성)과 효율(길이) 측면에서 고민하게 되는 경우가 자주 발생한다. 한 수식에 부득이하게 연산자를 여러 개를 써야 한다면 괄호 등을 적극 활용하여 우선 순위를 명확히 하는 것이 좋다.
연산자 결합 방향
한 수식에서 동일한 우선순위를 가진 연산자들이 연속적으로 나타나 있으면 연산자의 결합 방향을 고려하여야 한다. 대부분의 연산자들은 왼쪽에서 오른쪽으로 결합을 한다. 하지만 반대로 오른쪽에서 왼쪽으로 결합하는 연산자가 있다.
- 단항연산자, 형변환연산자, sizeof등은 오른쪽에서 왼쪽으로 결합한다.
- 조건 연산자 (?) 는 오른쪽에서 왼쪽으로 결합한다.
- 대입 연산자는 오른쪽에서 왼쪽으로 결합한다.
[표 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; |
와 같이 두 줄로 나누어 쓰는 것이 더 나아보일 수도 있다. 이는 전적으로 작성자의 성향에 달려있다고 할 수 있다.
댓글 없음:
댓글 쓰기