Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ 쉼표 연산자 제대로 이해하기 – 구분자와 연산자의 차이

C/C++에서 쉼표의 두 가지 역할

C/C++ 프로그래밍 언어에서 쉼표(,)는 문맥에 따라 두 가지 방식으로 해석됩니다.

  • 구분자(Separator) — 변수 선언문이나 함수 인자 목록처럼 여러 항목을 나열할 때 항목 사이를 구분하는 역할을 합니다.

  • 연산자(Operator) — 쉼표 연산자(,)는 이항 연산자입니다. 왼쪽 표현식을 먼저 평가한 뒤 그 결과값은 버리고, 오른쪽 표현식의 값만 최종 결과로 반환합니다. 특히 쉼표 연산자는 모든 C/C++ 연산자 중 우선순위가 가장 낮다는 점이 중요합니다.

아래 세 가지 예제 코드를 살펴보고, 각각 어떤 출력이 나올지 직접 예측해 보세요.

예제 1: 변수 선언문에서의 쉼표

#include <stdio.h>
int main(void) {
    char ch = 'a', 'b', 'c';
    printf("%c", ch);
    return 0;
}

실행 결과

이 코드는 컴파일 오류를 발생시킵니다. char ch = 'a', 'b', 'c'에서 쉼표는 연산자가 아니라 구분자로 해석되기 때문입니다. 컴파일러는 쉼표 뒤에 새로운 변수 이름(identifier)이 올 것으로 기대하지만 문자 상수 'b'가 나타나 오류가 발생합니다.

prog.c: In function 'main':
prog.c:5:20: error: expected identifier or '(' before 'b'
char ch = 'a', 'b', 'c';
^~~

예제 2: 대입문에서의 쉼표

#include <stdio.h>
int main(void) {
    char ch;
    ch = 'a','b','c';
    printf("%c", ch);
    return 0;
}

실행 결과

이번에는 a가 출력됩니다. 대입문 오른쪽의 쉼표는 연산자로 동작하기 때문입니다. 하지만 쉼표 연산자의 우선순위는 대입 연산자(=)보다 낮으므로, 실제로는 (ch = 'a'), 'b', 'c'처럼 묶여 해석됩니다. 결국 ch에는 첫 번째 값인 'a'만 대입되고, 나머지 'b''c'는 평가된 후 버려집니다.

a

예제 3: 괄호 안에서의 쉼표 연산자

#include <stdio.h>
int f1() {
    return 43;
}
int f2() {
    return 123;
}
int main(void) {
    int a;
    a = (f1() , f2());
    printf("%d", a);
    return 0;
}

실행 결과

이 코드는 123을 출력합니다. 괄호 안의 쉼표는 명확하게 연산자로 동작하며, 왼쪽 표현식 f1()을 먼저 평가한 후 그 반환값 43은 버리고, 오른쪽 표현식 f2()의 반환값인 123이 최종적으로 변수 a에 대입됩니다.

123

정리

같은 쉼표 하나가 문맥에 따라 전혀 다르게 동작한다는 점이 흥미롭습니다. 변수 선언문에서는 단순한 구분자로, 표현식 내부에서는 “왼쪽을 평가하고 버린 뒤 오른쪽 값을 반환”하는 연산자로 작동합니다. 또한 우선순위가 모든 연산자 중 가장 낮기 때문에, 쉼표 연산자의 결과를 의도대로 활용하려면 예제 3처럼 괄호로 감싸주는 것이 안전합니다.