• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

강의 내용 중 연산자의 우선순위

23.07.15 01:44 작성 23.07.15 01:49 수정 조회수 289

1

강의 17:00부분을 보면 어떠한 expression이 있을 때 괄호의 경우 어느것 먼저 계산될지는 c언어 표준에 정해져있지않으므로 컴파일에 따라 결정된다고 설명해주셨습니다.

그런데 구글에 c언어 연산자 우선순위를 검색하면 associativity라고 있는데 연산자 우선순위가 같은 경우 이 방향에 따라서 결정되는거 아닌가요?

괄호 같은 경우 연산자 우선순위가 1순위지만 associativity가 왼쪽에서 오른쪽이므로 여러개 있을경우 왼쪽부터 계산되는거 아닌가요?

제가 잘못이해한걸까요?

감사합니다.

답변 1

답변을 작성해보세요.

1

Soobak님의 프로필

Soobak

2023.07.15

안녕하세요, 답변 도우미 Soobak 입니다.

우선, 수식을 감싸는 괄호 () 는 연산자가 아니라, primary expression 으로 표현식의 계산 순서를 바꿀 수 있는 도구로 사용됩니다.
(강의 5.6 연산자 우선순위와 표현식 트리 에서 설명해주시는 내용이니, 참고해보시면 도움이 되실 것 같습니다.)

따라서, 결합법칙(associativity) 중 왼쪽에서 오른쪽으로의 결합법칙(left-to-right associativity)은 괄호에 대해서는 적용이 되지 않습니다.

예를 들어서, 3 - 2 - 1 에서 - 은 연산자이며, 왼쪽에서 오른쪽으로 결합법칙이 적용되므로, 3 - 2 가 먼저 계산되고, 그 후 1 - 1 이 계산됩니다.
즉, (3 - 2) - 1 과 같이 계산됩니다

하지만, 괄호는 언제나 가장 높은 우선순위를 가지므로, 괄호 내의 모든 식은 다른 모든 연산보다 먼저 적용됩니다.

이 맥락에서, 여러 개의 괄호가 있는 경우, 왼쪽에서 오른쪽으로 계산되는 것이 아니라, 각각의 괄호 내부가 독립적으로 계산되며, 이 계산 순서는 C언어 표준에 정의되어있지 않으므로, 컴파일러에 따라 다르게 적용되는 것으로 이해하시는 것이 적절할 것 같습니다.
다만, ((2 * 3) + 1) 과 같이 괄호가 중첩되어 있는 경우, 가장 안쪽의 괄호부터 먼저 계산됩니다.

또한, 교수님께서 강의에서 설명해주신 증감 연산자의 경우에도 마찬가지 입니다.
다음의 예시 코드에 대해서 x++ 의 계산 순서 자체는 C언어 표준에 정의되어 있지 않습니다.
따라서, 컴파일러에 따라 첫 번째 x++ 가 먼저 계산될 수도 있고, 두 번째 x++ 가 먼저 계산될 수도 있습니다.

int x = 5;
int y = x++ + x++;

 

CJS님의 프로필

CJS

질문자

2023.07.16

감사합니다.

근데 연산자 우선순위를 검색하면 x++가 1순위고 결합법칙이 오른쪽이라고 하는데 이건 뭘까요...?ㅠㅠ

Soobak님의 프로필

Soobak

2023.07.16

안녕하세요, 답변 도우미 Soobak 입니다.
증감 연산자와 다른 연산자들 사이에서 증감 연산자 자체의 우선순위는 1순위가 맞습니다. 검색으로 찾으신 내용은 이 부분에 대한 내용인 것 같습니다.


하지만, 증감 연산자와 다른 증감 연산자,
즉, int y = x++ + x++ 와 같은 경우에 대해서는 우선 순위가 C언어 표준에 정의되어 있지 않습니다.