C 언어의 쉼표 연산자 ,는 두 개 이상의 표현식을 결합하여 왼쪽에서 오른쪽으로 차례로 계산하고 마지막 표현식의 값을 반환합니다:
int x = (f(), g()); // f()와 g()가 호출되며, x는 g()의 결과
주로 for 루프에서 사용됩니다:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
유용할 때:
주의할 점:
질문: 다음 코드의 출력은 무엇인가요?
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)).