🏷️우선순위 (precedence)
- 다른 종류의 연산자가 하나의 수식 안에 있을 때, 먼저 평가되어야 할 연산자 순서를 뜻한다.
- 🔍ex)
10 + 6 / 2
/
가 +
보다 우선순위가 높다.
- 따라서 당연히
/
가 먼저 평가되고, +
가 평가된다.
- 우선순위는 괄호 연산자(
()
)로 제어할 수 있다.
🏷️결합방향
- 다른 종류의 연산자가 반드시 다른 우선순위를 가질 필요는 없다.
- 같은 우선순위를 갖는 연산자가 나오는 수식에서, 연산이 이루어지는 방향을 뜻한다.
- 🔍ex)
1 + 3 - 4
+
와 -
는 우선순위가 같다.
(1 + 3) - 4
로 결합될 수도 있고, 1 + (3 - 4)
로 결합될 수도 있다.
- 결합 방향에 따라 오버플로우 유무가 결정될 수도 있기에, 이를 이해하는 것이 중요하다.
- 결합방향 또한 괄호 연산자(
()
)로 제어할 수 있다.
🏷️피연산자 평가 순서
- 연산을 수행할 때, 각 피연산자가 평가되는 순서를 뜻한다.
- 표준은 피연산자 평가 순서를 정의하지 않는다.
- 이는 표준이 각자 알아서 최적의 순서로 평가할 수 있도록 배려해준 것이다.
- 우선순위나 결합방향만 위반하지 않는다면, 피연산자 평가 순서가 어떻게 되든 상관이 없다.
- 🔍ex)
foo() / bar() + baz()
int foo(void), bar(void), baz(void);
라고 가정한다.
- 우선순위를 고려하면,
(foo() / bar()) + baz()
과 같다. (괄호 연산자 추가)
- foo()가 먼저 평가될 것 같지만(먼저 호출될 것 같지만), 실제로는 다음과 같은 케이스가 모두 가능하다.
- foo() -> bar() -> baz()
- foo() -> baz() -> bar()
- bar() -> foo() -> baz()
- bar() -> baz() -> foo()
- baz() -> foo() -> bar()
- baz() -> bar() -> foo()
- 단, 언제나
/
연산이 우선순위가 높기에 먼저 수행된다.
- 즉, 피연산자 baz()와 bar()이 먼저 평가(여기서는 호출)됐을지라도,
+
를 수행할 수 없다.