아직 설명하지 않은 것을 포함한 모든 연산자들의 우선순위와 결합 법칩을 아래에 정리해 놓았다 같은행의 연산자는 같은 우선순위를 가지며 각 줄을 따라 우선순위가 낮아진다 예를 들어 *,/,%는 우선순위가 모두 같고 +,-와 같은 이원 연산자보다 우선순위가 높다.()는 함수 호출을 뜻한다.연산자 _>와 . 는 구조체 (structure)의 멤버(member)를 다툴때 사용되는데 sizeof 대상물의 크기 와 함꼐 제 6장에서 다룬다 제 5장에서는 * (포인터의 내용) &(변수의 번지) 그리고 제3장에서는 콤마 연산자를 다룬다

비트 방식 연산자 &,^,|의 우선순위가 ==와 !=바로 아래인것에 주의한다 이것은 다음과 같은 비트 검사 수식에서


if((x & MASK) == 0) ...


바른 결과를 얻기 위해서는 괄호가 모두 사용되야 함을 의미한다


연산자                               연산순서

() [] -> .                         좌에서 우

! ~ ++ -- + - * & (type) size of   우에서 좌

* / %                              좌에서 우

+ -                                좌에서 우

<< >>                              좌에서 우

< <= > >=                          좌에서 우

== !=                              좌에서 우

&                                  좌에서 우

^                                  좌에서 우

|                                  좌에서 우

&&                                 좌에서 우

||                                 좌에서 우

?:                                 우에서 좌

= += -= *= /= %= &= ^= ||= <<= >>= 우에서 좌

,                                  좌에서 우


다른 대부분의 언어에서와 마찬가지로 C도 연산자의 어떤 오퍼랜드가 먼저 계산 되는지 확정되어 있지 않다(&& ?:와 ,는 예외) 예를 들어 다음과 같은 수식에서 


x= f() + g();


f가 g보다 먼저 계산 될수 있고 반대로도 될수있다 그러브로 f나 g가 다른 오퍼랜드의 변수를 변화시키는 경우에는 x의 값이 계산순서에 따라 달라질수 있다.

이와 유사하게 함수에 있어서 인수의 계싼순서도 확정되어 있지 않다 따라서 다음의 문장은


printf("%d %d\n",++n,power(2,n));  /* wrong */


n이 power가 호출되기전에 증가할지 아닌지에 따라 컴파일러마다 결과가 다를수 있다. 그 해결책은 다음과 같이 쓰는것이다


 ++n;

 printf("%d %d\n",n,power(2,n));


함수 호출과 중첩된 지정문,증가 연산자와 감소 연산자는 부작용을 일으킬수 있는데 어떤 변수가 계산 결과가 변활될수 있기 때문이다 이런 부작용은 계산 순서를 잘못 알고 사용한 경우 발생한다  불행한 상황은 다음과 같다


 a[i] = i++;


문자는 첨자 i가 저느이 값인지 새로운 값인지 하는 것이다.

컴파일러는 이것을 각기 다르게 해설할 수있고 그것에 따라 다른 결과를 낳는다 표준(ANSI)에서는 이런 문제를 확정 짓지 않았다. 왜냐하면 최상의 순서는 기계의 구저에 크게 의존하기 때문이다.(표준은 모든 인수에 대한 모든 부속작용이 함수호출이 일어나기 전에 이루어 지도록 규정한다 그러나 위에서의 printf호출에는 도움이 되지 않는다)

계산 순서에 의존하는 프로그램을 작성하는것은 어떤언어에서든 나쁜 프로그래밍 습관이다 따라서 괄호를 잘 활용하는 것이 중요하며 어떤것을 피래야 하는지 알아야 한다


**꺠알팁