인프런 커뮤니티 질문&답변

이재완님의 프로필 이미지
이재완

작성한 질문수

홍정모의 따라하며 배우는 C언어

6.11 콤마 연산자

6-11 질문

해결된 질문

작성

·

369

2

안녕하세요! 다음 코드를 제 스스로 분석해봤는데, 정확한 분석이 맞는지 헷갈려서 질문드립니다.

(1)

Comma 연산자는 Assignment 연산자보다 서열이 낮은 것으로 알고 있습니다.

1번 예시에서 콤마가 작동하는 시기는 z에 x의 값이 대입되고, y에 값 2가 대입된 뒤인가요?

콤마 연산자는 왼쪽에서 오른쪽으로 계산을 하는데, 이미 대입연산자에 의해 각각 값이 대입된 변수 z와 y를 또 계산한다는 것이 잘 이해되지 않습니다.

이 경우의 콤마 연산자의 계산이란 무엇인지 알려주시면 감사하겠습니다.

 

(2)

1번 예시와 2번 예시의 차이점은 무엇이 먼저 계산되느냐 일까요?

즉 1번 예시에서는 x에 1이 대입되고, 그 값이 다시 x에 대입된 뒤, y에 2가 대입되고, 콤마 연산자가 작동한다면,

2번 예시에서는 x에 1이 대입되고, y에 2가 대입된 뒤, x의 값이 z에 대입되고, 콤마 연산자가 작동하는 건가요?

 

늘 친절한 답변 감사합니다.

답변 1

2

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

우선, , 콤마 연산자와 = 대입 연산자에 대해서 설명드린 후, 코드에 대해서 답변드리도록 하겠습니다.

  • , 콤마 연산자
    : 콤마 연산자는 왼쪽에서 오른쪽으로 표현식을 계산합니다. 그리고 콤마 연산자는 표현식의 결과를 반환하는데, 이 결과는 가장 오른쪽에 있는 표현식의 결과입니다.

  • = 대입 연산자
    : 대입 연산자의 경우, 오른쪽에서 왼쪽으로 표현식이 계산되며, 결과는 왼쪽의 변수에 대입됩니다.

  • 연산자의 우선순위는 , 연산자가 = 연산자보다 낮습니다.


질문(1)
: z = x = 1, y = 2; 는 콤마 연산자를 사용하여 두 개의 대입문을 결합합니다.
이 경우, 첫 번째 대입문 x = 1 이 먼저 계산되고 그 결과값 1z 에 대입됩니다.
, 연산자 오른쪽의 두 번째 대입문 y = 2 가 계산되어 y2 가 저장됩니다.


질문(2)
: 연산자의 우선순위를 좀 더 명확하게 한다는 점에 의미가 있습니다.
1번 코드라인에서는 z = x = 1 이 계산되고, , 연산자 이후의 y = 2 가 계산됩니다.
2번 코드라인에서서도 동일한 순서와 결과를 얻지만, 연산자의 우선순위를 좀 더 명확히 표현합니다.

콤마 연산자는 우선순위가 가장 낮은 연산자 중 하나이기 때문에, 복잡한 표현식에서 콤마 연산자를 사용할 때는 괄호를 적절히 사용하여 연산의 순서를 명확히 해주는 것이 좋습니다.

예를 들어, z = (x = 1, x + 2); 코드 라인의 경우 x = 1x + 2 두 표현식은 콤마 연산자에 의해 연결되며, x = 1 이 먼저 계산되고, 그 다음 x + 2 가 계산됩니다.
그리고, 콤마 연산자의 결과값 x + 2 즉, 3z 에 대입됩니다.

예시 코드와 출력 결과를 첨부드립니다.

#include <stdio.h>

int main()
{

  int x = 0, y = 0, z = 0;

  z = x = 1, y = 2;
  printf("%-25s x = %d, y = %d, z = %d \n", "z = x = 1, y = 2", x, y, z);

  z = (x = 1), (y = 2);
  printf("%-25s x = %d, y = %d, z = %d \n", "z = (x = 1), (y = 2)", x, y, z);

  z = ((x = 1), (y = 2));
  printf("%-25s x = %d, y = %d, z = %d \n", "z = ((x = 1), (y = 2))", x, y, z);

  z = (x = 1, x + 2);
  printf("%-25s x = %d, y = %d, z = %d \n", "z = (x = 1, x + 2)", x, y, z);

  return 0;
}
  • 출력 결과
    image

이재완님의 프로필 이미지
이재완

작성한 질문수

질문하기