프로그래밍Middle Backend 개발자

C 언어에서 쉼표 연산자(comma operator)의 작동 방식에 대해 설명해 주세요. 언제 사용이 정당화되며, 계산 순서에 대한 모호한 이해로 인해 어떤 예기치 않은 부작용이 발생할 수 있나요?

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

답변.

C에서 쉼표(,) 연산자는 여러 표현식을 결합할 수 있게 하며, 결과는 마지막 표현식의 값이 됩니다.

예:

int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // 먼저 a를 증가시키고, 다음에 b를 증가시키고, a + b를 더합니다.

사용법:

  • 여러 작업을 수행해야 하는 for 루프의 헤더에서 자주 사용됩니다.
  • 때때로 매크로와 복잡한 표현식에서 표현식을 결합하는 데 사용됩니다.

세부사항:

  • 쉼표 연산자는 이진 연산자 중 가장 낮은 우선 순위를 가집니다.
  • 초기화 목록, 인수 목록 및 열거형에서 쉼표는 연산자가 아닙니다! 여기서는 구분자입니다.
  • 쉼표 연산자의 표현식은 왼쪽에서 오른쪽으로 계산됩니다.

루프 예:

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

함정 질문.

함수 인수 목록에서 쉼표를 연산자와 구분자로서의 차이가 무엇인가요?

일반적인 오류: 어디에서든 쉼표는 연산자이며 항상 표현식을 결합한다고 생각됩니다.

정답: 쉼표는 초기화 목록, 인수 및 배열 요소 외부에서만 연산자입니다. 예:

int x = (1, 2); // x == 2, 여기서는 연산자 void foo(int a, int b) { ... } // 여기서는 구분자

쉼표는 괄호 내에서만 연산자로 작용하며, 나머지 경우에는 단순한 구분자입니다.

주제에 대한 세부 사항을 모른 탓으로 인한 실제 오류 예시.


역사

do { ... } while (0) 내에서 즉각적인 연산을 위해 쉼표 연산자가 사용된 매크로로 인해 if (a) MACRO(); else ...와 같은 코드에서 매크로의 구문 오류로 이어졌습니다.


역사

쉼표 연산자의 우선 순위와 할당 우선 순위 간의 혼동으로 인해 표현식 a = b, c = d;(a = b), (c = d)처럼 작동했고, 프로그래머는 두 할당이 하나의 표현식의 일환으로 동시에 실행된다고 가정했습니다.


역사

함수 호출을 순차적으로 호출하기 위해 쉼표가 사용되었으나, 마지막 값만 반환되는 것을 무시했습니다. 결과 표현식이 모든 호출의 효과를 결합한다고 가정했지만, 실제로는 첫 번째 호출의 부작용만 중요했고, 반환 값은 잃어버린 상황이었습니다.