inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

6.11 콤마 연산자

6-11 질문

해결된 질문

440

이재완

작성한 질문수 28

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에 대입되고, 콤마 연산자가 작동하는 건가요?

 

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

c

답변 1

2

Soobak

안녕하세요, 답변 도우미 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

Export template 안됨

1

30

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

57

3

main 함수에서 왜 int만 선언이 되는걸까요

1

57

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

55

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

138

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

94

3

강의자리ㅛ

1

80

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

114

2

소스파일안에 여러 파일

1

76

2

F5와 F7의 차이

1

79

2

c = TWO * (a+b); 에서 a와 b는?

1

60

2

; 세미콜론을 붙이는 기준에 문의

1

70

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

76

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

61

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

54

2