본문 바로가기
개발/C, C++

[C/C++] 쉼표 연산자(,)

by 77monkey 개발자 2023. 9. 14.
반응형

쉼표가 연산자라는 것을 알고 계셨나요? 아마 모르신 분들도 많이 있으실 것이라 생각됩니다. 너무 자연스럽게 사용하고 있으시거나 아예 사용하지 않고 계시는 분들도 많으신 걸로 알고 있습니다. 실제로 제가 개발을 할 때 보면 쉼표 연산자는 거의 안 쓰이는 것 같습니다. 하지만 모든 알고 있으면 언젠가는 도움이 되기 때문에 알아봅시다.

 

쉼표 연산자(,)

쉼표 연산자는 여러 표현식을 순차적으로 실행하고 마지막 표현식의 결과를 반환하는 연산자입니다. 그렇기 때문에 변수 선언할 때나 for문에서 자주 사용하는 것 같습니다. 

쉼표 연산자는 아래와 같이 표현할 수 있습니다. 

expression0, expression1, expression2, ..., expressionN;

계속 표현식이 오게 되는데 마지막에 오게 되는 expressionN을 return 하게 됩니다.

 

쉼표 연산자(,) 예시

먼저 변수 선언할 때 사용하는 쉼표 연산자입니다. 이렇게 변수 a와 b를 선언하면 a와 b는 각각 어떤 값이 들어갈까요? 

#include <stdio.h>

int main() {
	int a, b = 77;

	printf("a: %d b: %d\n", a, b);

	return 0;	
}

아마 a와 b에 77이 들어가서 77을 출력할 것이라고 생각하실 수 있는데, 그렇지 않습니다. visual studio code에서 돌려보신 분들은 아시겠지만 빌드가 되지 않습니다. 그 이유는 초기화되지 않은 a 변수를 출력하려고 했기 때문입니다. 즉, a는 쓰레기 값을 가지고 있습니다. 그러면 어떻게 초기화를 해야 할까요? 

#include <stdio.h>

int main() {
	int a = 77, b = 77;

	printf("a: %d b: %d\n", a, b);

	return 0;	
}

바로 이렇게 각각 초기화를 해줘야 합니다. 

저는 그래서 쉼표 연산자로 가끔 놓치는 경우가 생겨서 안 쓰는 경향이 있습니다. 

혹시나 쓰시게 된다면 조심하시길 바랍니다. 특히 포인터 타입으로 선언하실 때 말입니다!

 

다음은 for문에서 사용하는 경우입니다.

#include <stdio.h>

int main() {

	for (int i = 0, j = 0; i < 10 && j < 10; i += 1, j += 5)
		printf("%d + %d = %d\n", i, j, i+j);

	return 0;	
}

출력 결과는 아래와 같습니다.

0 + 0 = 0
1 + 5 = 6

for문은 크게 실수할 일이 없습니다. 예시라서 초기화 부분과 증감 부분에 쉼표 연산자를 모두 썼지만, 초기화 부분만 쓰거나 증감 부분에만 쓰셔도 상관없습니다. 편하실 대로 사용하시면 됩니다. 

 

마지막 예시는 위에서 설명드린 마지막 표현식 반환값을 이용하여 변수를 선언하는 예시입니다. 참고로 코드는 간결하고 쉬운 코드가 최고입니다. 

#include <stdio.h>

int main() {
	int a = 2, b = 3;
	int c = (a, b, 3);

	printf("c %d\n", c);

	return 0;	
}

c의 출력값은 어떻게 될까요? 네, 맞습니다. 3이 됩니다. 그럼 앞에 있는 a, b는 무엇일까요? 표현식 중에 하나입니다. 마지막에 표현식인 3이 반환되어 c에 대입이 되었습니다. 여기에서 한 가지 궁금증이 생기실 수 있습니다. 왜 (a, b, 3) 이렇게 괄호를 썼을까요? 나중에 다룰 내용인데, 바로 연산자 우선순위 때문입니다. 쉼표 연산자의 연산 우선순위는 다른 연산자에 비해서 낮습니다. 그렇기 때문에 대입 연산자(=)보다 쉼표 연산자의 우선순위를 높여주기 위해서 괄호()를 사용했습니다.

매번 강조하지만, 괄호를 사용하는 습관은 정말 좋은 습관입니다. 많이 사용하시길 바랍니다.

 

마무리

쉼표 연산자에 대해서 이 정도 아시면 정말 다 아시는 거라고 말씀 드릴 수 있습니다. 위에서도 말씀드렸다시피 쉼표 연산자를 사용할 때에는 내가 예측한 것과 다르게 동작할 수 있기 때문에 항상 조심하셔야 합니다. 실수 없이 사용하시기를 바라며 이번 포스팅은 마무리 짓겠습니다.

 

반응형

'개발 > C, C++' 카테고리의 다른 글

[C/C++] 캐스팅 연산자  (1) 2023.09.17
[C/C++] sizeof 연산자  (0) 2023.09.15
[C/C++] 삼항 조건 연산자(삼항 연산자)  (0) 2023.09.13
[C/C++] 비트 연산자  (0) 2023.09.11
[C/C++] 논리 연산자  (0) 2023.09.09