구두점
구두점 (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에서 표현식을 구분해요.- 다음 연산자의 피연산자를 구분해요.
typeidsizeofsizeof...(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)switchwhiledo-whilefor- 범위 기반 for (since C++11)
- handler에서 매개변수 선언을 구분해요.
- 함수형 매크로 정의에서 매크로 매개변수를 구분해요.
- 함수형 매크로 호출에서 매크로 인자를 구분하거나, 쉼표가 인자 구분자로 해석되지 않게 해요.
defined,__has_include(since C++17),__has_cpp_attribute(since C++20) 전처리 연산자의 일부.static_assert선언에서 피연산자를 구분해요. (since C++11)- 다음 지정자의 피연산자를 구분해요.
decltypenoexcept(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]
더 알아보기
- 대체 표현 (Alternative representations) — 특정 연산자의 대체 철자
- C documentation for Punctuation