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)처럼 작동했고, 프로그래머는 두 할당이 하나의 표현식의 일환으로 동시에 실행된다고 가정했습니다.
역사
함수 호출을 순차적으로 호출하기 위해 쉼표가 사용되었으나, 마지막 값만 반환되는 것을 무시했습니다. 결과 표현식이 모든 호출의 효과를 결합한다고 가정했지만, 실제로는 첫 번째 호출의 부작용만 중요했고, 반환 값은 잃어버린 상황이었습니다.