프로그래밍C 개발자, 시스템 프로그래머

C 언어에서 쉼표 연산자(comma operator)의 작동 방식에 대해 설명하세요. 언제 사용하는 것이 의미가 있는지, 개발자가 사용할 때 자주 마주치는 오류는 무엇인지, 어떤 예기치 않은 효과가 있는지 알려주세요.

Hintsage AI 어시스턴트로 면접 통과

답변

C 언어의 쉼표 연산자 ,는 두 개 이상의 표현식을 결합하여 왼쪽에서 오른쪽으로 차례로 계산하고 마지막 표현식의 값을 반환합니다:

int x = (f(), g()); // f()와 g()가 호출되며, x는 g()의 결과

주로 for 루프에서 사용됩니다:

for(int i = 0, j = 10; i < j; ++i, --j) { ... }

유용할 때:

  • 특히 초기화나 증가 시 여러 표현식을 간략하게 작성하려고 할 때.

주의할 점:

  • 쉼표의 우선순위가 매우 낮으므로 복잡한 표현식에서 중요합니다;
  • 문맥 밖에서 사용(예: return 또는 할당 시)하면 예기치 않은 결과를 초래할 수 있습니다;
  • 괄호 없이 사용하면 프로그래머와 컴파일러를 혼란스럽게 할 수 있습니다.

함정 질문

질문: 다음 코드의 출력은 무엇인가요?

int a = 1; int b = (a = 2, a + 3); printf("%d ", b);

답변: "5"가 출력됩니다. 먼저 a=2가 할당되고, 이후 표현식 a+3이 2+3=5로 계산되어 이 값이 변수 b에 할당됩니다.


실수 예시


이야기

C 프로젝트에서 개발자가 return 함수에서 괄호 없이 쉼표 연산자를 사용했습니다:

return x++, y++;

y+1을 반환할 것으로 예상했지만, 실제로 return은 오른쪽 표현식의 결과만 인식하므로 왼쪽의 x++는 별도로 계산됩니다. 이로 인해 사용자의 코드가 혼란스러워졌고, return 결과는 예상했던 것과 달랐습니다.


이야기

for 루프에서 프로그래머가 세미콜론 대신 쉼표를 실수로 사용했습니다:

for(i=0, i<10, i++) ...

프로그램이 컴파일되었지만 루프는 단 한 번만 실행되었습니다. 왜냐하면 for의 조건에서 표현식 i<10, i++는 항상 마지막 표현식(i++)의 값을 반환하며, 루프 계속 조건이 아닌 결과를 반환하기 때문입니다.


이야기

매크로를 작성하는 동안 한 개발자가 다음과 같이 정의했습니다:

#define DO(x, y) x, y int v = DO(f(), g());

두 함수가 호출될 것으로 예상했지만 괄호를 놓치는 바람에 f()만 호출되고 g()의 값은 v에 할당되지 않았습니다. 올바른 사용법: #define DO(x, y) ((x), (y)).