구두점

구두점 (Punctuators)

C++ 소스에는 연산자뿐 아니라 {, #, :: 같은 구두점 기호도 있어요. 이 기호들이 어떤 문맥에서 무슨 의미로 쓰이는지 한 번에 정리해둔 페이지예요. 각 기호의 상세는 링크된 페이지에 있고, 여기서는 그 쓰임새를 훑어볼게요.

출처: cppreference

본문

이것들은 C++의 구두점 기호들이에요. 각 기호의 의미는 연결된 페이지에 자세히 설명돼 있어요.

전처리 연산자 (Preprocessing operators)

전처리 연산자는 전처리기에 의해 인식돼요.

#

대체 철자는 %:이에요.

  • 전처리 지시문을 도입해요.
  • 문자열화(stringification)를 위한 전처리 연산자.

##

대체 철자는 %:%:이에요.

  • 토큰 접합(token pasting)을 위한 전처리 연산자.

단일 문자 연산자와 구두점 (Single-character operators and punctuators)

{ and }

대체 철자는 각각 <%, %>이에요.

  • 클래스 정의에서 멤버 지정(member specification)을 구분해요.
  • 열거형 정의에서 열거자 목록을 구분해요.
  • 복합문(compound statement)을 구분해요. 복합문은 다음의 일부일 수 있어요.
    • 함수 정의
    • try 블록
    • 람다 표현식 (since C++11)
  • 초기화자의 집합 초기화(until C++11)/목록 초기화(since C++11) 문법의 일부예요.
  • 네임스페이스 정의에서 네임스페이스 본문을 구분해요.
  • 언어 연결 지정(language linkage specification)에서 선언을 구분해요.
  • requires 표현식에서 요구사항을 구분해요. (since C++20)
  • 복합 요구사항(compound requirement)에서 표현식을 구분해요. (since C++20)
  • export 선언에서 선언을 구분해요. (since C++20)

[ and ]

대체 철자는 각각 <:, :>이에요.

  • 첨자(subscript) 연산자; 연산자 오버로딩에서 operator[]의 일부.
  • 선언이나 type-id(예: new 표현식)의 배열 declarator 일부.
  • 연산자 오버로딩(할당 함수)의 new[] 연산자 일부.
  • delete 표현식과 연산자 오버로딩(해제 함수)의 delete[] 연산자 일부.
  • 람다 표현식에서 캡처를 구분해요. (since C++11)
  • 속성 지정자에서 속성을 구분해요. (since C++11)
  • 구조적 바인딩 선언에서 식별자 목록을 구분해요. (since C++17)
  • 팩 인덱싱(pack indexing)에서 인덱스를 나타내는 변환 상수 표현식을 구분해요. (since C++26)

( and )

  • 표현식에서 그룹화를 나타내요.
  • 함수 호출 연산자; 연산자 오버로딩에서 operator()의 일부.
  • 함수형 타입 캐스트에서 표현식/초기화자를 구분해요.
  • static_cast, const_cast, reinterpret_cast, dynamic_cast에서 표현식을 구분해요.
  • 다음 연산자의 피연산자를 구분해요.
    • typeid
    • sizeof
    • sizeof... (since C++11)
    • alignof (since C++11)
    • noexcept (since C++11)
  • placement new 표현식에서 placement 인자를 구분해요.
  • new 표현식에서 type-id를 선택적으로 구분해요.
  • new 표현식에서 초기화자를 구분해요.
  • C 스타일 캐스트에서 type-id를 구분해요.
  • 선언이나 type-id에서 그룹화를 나타내요.
  • 다음에서 매개변수 목록을 구분해요.
    • 함수 declarator(선언이나 type-id에서)
    • 람다 표현식 (since C++11)
    • 사용자 정의 추론 가이드(user-defined deduction guide) (since C++17)
    • requires 표현식 (since C++20)
  • 초기화자의 직접 초기화(direct-initialization) 문법의 일부예요.
  • asm 선언에서 문자열 리터럴을 구분해요.
  • 멤버 초기화자 목록에서 베이스나 멤버의 초기화자를 구분해요.
  • 선택문/반복문의 제어절(controlling clause)을 구분해요. 다음을 포함해요.
    • if (consteval if 제외) (since C++23)
    • switch
    • while
    • do-while
    • for
    • 범위 기반 for (since C++11)
  • handler에서 매개변수 선언을 구분해요.
  • 함수형 매크로 정의에서 매크로 매개변수를 구분해요.
  • 함수형 매크로 호출에서 매크로 인자를 구분하거나, 쉼표가 인자 구분자로 해석되지 않게 해요.
  • defined, __has_include(since C++17), __has_cpp_attribute(since C++20) 전처리 연산자의 일부.
  • static_assert 선언에서 피연산자를 구분해요. (since C++11)
  • 다음 지정자의 피연산자를 구분해요.
    • decltype
    • noexcept (since C++11)
    • alignas (since C++11)
    • explicit (since C++20)
  • 속성에서 속성 인자를 구분해요. (since C++11)
  • decltype(auto) 지정자의 일부. (since C++14)
  • 폴드 표현식(fold expression)을 구분해요. (since C++17)
  • 가변 매크로 정의에서 __VA_OPT__ 대체의 일부. (since C++20)

;

  • 다음의 끝을 나타내요.
    • 문(statement)
    • 선언 또는 멤버 선언
    • 모듈 선언, import 선언, 전역 모듈 조각 도입부, 비공개 모듈 조각 도입부 (since C++20)
    • 요구사항(requirement) (since C++20)
  • for 문의 조건과 문을 분리해요.

:

  • 조건 연산자의 일부.
  • 레이블 선언의 일부.
  • 클래스 정의의 base-clause에서 베이스 클래스를 도입해요.
  • 멤버 지정에서 접근 지정자(access specifier)의 일부.
  • 비트 필드 멤버 선언에서 폭(width)을 도입해요.
  • 생성자 정의에서 멤버 초기화자 목록을 도입해요.
  • 범위 기반 for 문에서 item-declaration과 range-initializer를 분리해요. (since C++11)
  • 열거형 선언의 enum-base에서 기본 타입을 도입해요. (since C++11)
  • 속성 지정자에서 속성 네임스페이스와 속성 목록을 분리해요. (since C++17)
  • 모듈 파티션의 모듈 선언/import 선언에서 모듈 파티션 이름을 도입해요. (since C++20)
  • 비공개 모듈 조각 도입부(module :private;)의 일부. (since C++20)

?

  • 조건 연산자의 일부.

.

  • 멤버 접근 연산자.
  • 집합 초기화에서 지정자(designator)를 도입해요. (since C++20)
  • 모듈 이름이나 모듈 파티션 이름의 일부. (since C++20)

~

대체 철자는 compl이에요.

  • 단항 보수 연산자(비트별 not 연산자); 연산자 오버로딩에서 operator~의 일부.
  • 소멸자나 유사 소멸자(pseudo-destructor)를 이름 붙이는 식별자 표현식의 일부.

!

대체 철자는 not이에요.

  • 논리 not 연산자; 연산자 오버로딩에서 operator!의 일부.
  • consteval if 문의 일부. (since C++23)

+

  • 단항 plus 연산자; 연산자 오버로딩에서 operator+의 일부.
  • 이항 plus 연산자; 연산자 오버로딩에서 operator+의 일부.

-

  • 단항 minus 연산자; 연산자 오버로딩에서 operator-의 일부.
  • 이항 minus 연산자; 연산자 오버로딩에서 operator-의 일부.

*

  • 간접 참조 연산자; 연산자 오버로딩에서 operator*의 일부.
  • 곱셈 연산자; 연산자 오버로딩에서 operator*의 일부.
  • declarator나 type-id에서 포인터 연산자 또는 멤버 포인터 연산자의 일부.
  • 람다 캡처 목록에서 *this의 일부(현재 객체를 복사로 캡처). (since C++17)

/

  • 나눗셈 연산자; 연산자 오버로딩에서 operator/의 일부.

%

  • 나머지 연산자; 연산자 오버로딩에서 operator%의 일부.

^

대체 철자는 xor이에요.

  • 비트별 xor 연산자; 연산자 오버로딩에서 operator^의 일부.

&

대체 철자는 bitand이에요.

  • 주소(address-of) 연산자; 연산자 오버로딩에서 operator&의 일부.
  • 비트별 and 연산자; 연산자 오버로딩에서 operator&의 일부.
  • declarator나 type-id에서 lvalue 참조 연산자.
  • 람다 캡처에서 참조 캡처를 나타내요. (since C++11)
  • 멤버 함수 선언의 ref-qualifier. (since C++11)

|

대체 철자는 bitor이에요.

  • 비트별 or 연산자; 연산자 오버로딩에서 operator|의 일부.

=

  • 단순 할당 연산자; 연산자 오버로딩에서 operator=의 일부로, 특수 멤버 함수(복사 할당 연산자, 이동 할당 연산자(since C++11))일 수 있어요.
  • 초기화자의 복사 초기화·집합 초기화(until C++11)/복사 목록 초기화(since C++11) 문법의 일부.
  • 함수 선언에서 기본 인자(default argument)를 도입해요.
  • 템플릿 매개변수 목록에서 기본 템플릿 인자를 도입해요.
  • 네임스페이스 별칭 정의에서 별칭과 별칭 대상 네임스페이스를 분리해요.
  • 열거형 정의에서 열거자의 값을 도입해요.
  • 순수 가상 함수 선언의 pure-specifier의 일부.
  • 람다 캡처에서 캡처 기본값을 나타내요(복사 캡처). (since C++11)
  • 함수 정의에서 defaulted 정의(=default;)나 deleted 정의(=delete;)의 일부. (since C++11)
  • 타입 별칭 선언에서 별칭과 별칭 대상 타입을 분리해요. (since C++11)
  • 개념 정의에서 개념 이름과 제약 표현식을 분리해요. (since C++20)

<

  • less-than 연산자; 연산자 오버로딩에서 operator<의 일부.
  • 템플릿 인자 목록의 시작을 나타내요.
  • 다음에서 템플릿 매개변수 목록의 시작을 나타내요.
    • 템플릿 선언
    • 부분 특수화
    • 람다 표현식 (since C++20)
  • 템플릿 특수화 선언에서 template<>의 일부.
  • 다음에서 헤더 이름을 도입해요.
    • #include 지시문
    • __has_include 전처리 표현식 (since C++17)
    • import 선언 (since C++20)

>

  • greater-than 연산자; 연산자 오버로딩에서 operator>의 일부.
  • static_cast, const_cast, reinterpret_cast, dynamic_cast에서 type-id의 끝을 나타내요.
  • 템플릿 인자 목록의 끝을 나타내요.
  • 다음에서 템플릿 매개변수 목록의 끝을 나타내요.
    • 템플릿 선언
    • 부분 특수화
    • 람다 표현식 (since C++20)
  • 템플릿 특수화 선언에서 template<>의 일부.
  • 다음에서 헤더 이름의 끝을 나타내요.
    • #include 지시문
    • __has_include 전처리 표현식 (since C++17)
    • import 선언 (since C++20)

,

  • 쉼표(comma) 연산자; 연산자 오버로딩에서 operator,의 일부.
  • 다음에서 목록 구분자.
    • 선언의 declarator 목록
    • 초기화의 초기화자 목록
    • placement new의 placement 인자 목록
    • 함수 호출 표현식의 인자 목록
    • 열거형 선언의 열거자 목록
    • 클래스 선언의 베이스 클래스 목록
    • 생성자 정의의 멤버 초기화자 목록
    • 함수 매개변수 목록
    • 템플릿 매개변수 목록
    • 템플릿 인자 목록
    • 람다 캡처 목록 (since C++11)
    • 속성 목록 (since C++11)
    • using-선언의 declarator 목록 (since C++17)
    • 구조적 바인딩 선언의 식별자 목록 (since C++17)
    • 다인자 첨자 표현식의 인자 목록 (since C++23)
    • 함수형 매크로 정의의 매크로 매개변수 목록
    • 함수형 매크로 호출의 매크로 인자 목록(인자의 괄호 사이에 있지 않은 경우)
  • static_assert 선언에서 인자를 분리해요. (since C++11)

다중 문자 연산자와 구두점 (Multi-character operators and punctuators)

[: and :] (since C++26)

  • 스플라이스 지정자(splice specifier)를 구분해요.

^^ (since C++26)

  • 반영(reflection) 연산자.

...

  • 함수 declarator나 람다 표현식(since C++11), 사용자 정의 추론 가이드(since C++17)의 매개변수 목록에서 가변 인자 함수를 나타내요.
  • handler에서 catch-all handler를 나타내요.
  • 매크로 정의에서 가변 매크로를 나타내요. (since C++11)
  • 팩 선언과 팩 확장을 나타내요. (since C++11)
  • 팩 인덱싱 표현식과 지정자에서. (since C++26)

::

  • 다음에서 스코프 해석 연산자.
    • 정규화된 이름
    • 멤버 포인터 선언
    • new/delete 표현식에서 전역 할당·해제 함수만 탐색하도록 나타낼 때
  • 속성에서 속성 스코프를 나타내요. (since C++11)
  • 중첩 네임스페이스 정의의 일부. (since C++17)

.*

  • 멤버 포인터 접근 연산자.

->

  • 멤버 접근 연산자; 연산자 오버로딩에서 operator->의 일부.
  • 함수 declarator나 람다 표현식에서 후행 반환 타입(trailing return type)을 도입해요. (since C++11)
  • 사용자 정의 추론 가이드에서 결과 타입을 도입해요. (since C++17)
  • 복합 요구사항에서 반환 타입 요구사항을 도입해요. (since C++20)

->*

  • 멤버 포인터 접근 연산자; 연산자 오버로딩에서 operator->*의 일부.

+=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator+=의 일부.

-=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator-=의 일부.

*=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator*=의 일부.

/=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator/=의 일부.

%=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator%=의 일부.

^=

대체 철자는 xor_eq이에요.

  • 복합 할당 연산자; 연산자 오버로딩에서 operator^=의 일부.

&=

대체 철자는 and_eq이에요.

  • 복합 할당 연산자; 연산자 오버로딩에서 operator&=의 일부.

|=

대체 철자는 or_eq이에요.

  • 복합 할당 연산자; 연산자 오버로딩에서 operator|=의 일부.

==

  • 동등(equality) 연산자; 연산자 오버로딩에서 operator==의 일부.

!=

대체 철자는 not_eq이에요.

  • 부등(inequality) 연산자; 연산자 오버로딩에서 operator!=의 일부.

<=

  • 작거나 같은 연산자; 연산자 오버로딩에서 operator<=의 일부.

>=

  • 크거나 같은 연산자; 연산자 오버로딩에서 operator>=의 일부.

<=> (since C++20)

  • 삼중 비교(우주선, spaceship) 연산자; 연산자 오버로딩에서 operator<=>의 일부.

&&

대체 철자는 and이에요.

  • 논리 and 연산자; 연산자 오버로딩에서 operator&&의 일부.
  • declarator나 type-id에서 rvalue 참조 연산자. (since C++11)
  • 멤버 함수 선언의 ref-qualifier. (since C++11)

||

대체 철자는 or이에요.

  • 논리 or 연산자; 연산자 오버로딩에서 operator||의 일부.

<<

  • 비트 시프트 연산자; 연산자 오버로딩에서 operator<<의 일부(비트 연산자 또는 스트림 삽입 연산자).

>>

  • 비트 시프트 연산자; 연산자 오버로딩에서 operator>>의 일부(비트 연산자 또는 스트림 추출 연산자).

<<=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator<<=의 일부.

>>=

  • 복합 할당 연산자; 연산자 오버로딩에서 operator>>=의 일부.

++

  • 증가 연산자; 연산자 오버로딩에서 operator++의 일부.

--

  • 감소 연산자; 연산자 오버로딩에서 operator--의 일부.

참고 (References)

  • C++23 표준(ISO/IEC 14882:2024): 5.12 Operators and punctuators [lex.operators]
  • C++20 표준(ISO/IEC 14882:2020): 5.12 Operators and punctuators [lex.operators]
  • C++17 표준(ISO/IEC 14882:2017): 5.12 Operators and punctuators [lex.operators]
  • C++14 표준(ISO/IEC 14882:2014): 2.13 Operators and punctuators [lex.operators]
  • C++11 표준(ISO/IEC 14882:2011): 2.13 Operators and punctuators [lex.operators]
  • C++03 표준(ISO/IEC 14882:2003): 2.12 Operators and punctuators [lex.operators]
  • C++98 표준(ISO/IEC 14882:1998): 2.12 Operators and punctuators [lex.operators]

더 알아보기