우선순위, 결합방향, 피연산자 평가 순서

MySprtlty·2022년 10월 8일
0

C

목록 보기
30/37

🏷️우선순위 (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()가 먼저 평가될 것 같지만(먼저 호출될 것 같지만), 실제로는 다음과 같은 케이스가 모두 가능하다.
      1. foo() -> bar() -> baz()
      2. foo() -> baz() -> bar()
      3. bar() -> foo() -> baz()
      4. bar() -> baz() -> foo()
      5. baz() -> foo() -> bar()
      6. baz() -> bar() -> foo()
    • 단, 언제나 /연산이 우선순위가 높기에 먼저 수행된다.
    • 즉, 피연산자 baz()와 bar()이 먼저 평가(여기서는 호출)됐을지라도, +를 수행할 수 없다.

0개의 댓글