구두점

구두점 (Punctuation)

C 소스 코드를 이루는 문자 하나하나가 어떤 역할을 하는지 정리해 둔 페이지예요. {, [, #, ; 같은 부호들이 문법의 어느 부분에서 어떤 의미로 쓰이는지를 알면 코드를 읽을 때 훨씬 수월해져요. 각 기호의 자세한 설명은 링크된 페이지에 있어요.

출처: cppreference

본문

이것들은 C의 구두점 기호들이에요. 각 기호의 의미는 링크된 페이지에 자세히 나와 있어요.

{ }

  • 구조체나 공용체 정의에서 struct-declaration-list를 구분해요.
  • 열거형 정의에서 enumerator 목록을 구분해요.
  • 복합문(compound statement)을 구분해요. 복합문은 함수 정의의 일부일 수 있어요.
  • 초기화에서 초기화자들을 구분해요.

[ ]

  • 첨자 연산자예요.
  • 선언이나 type-id의 배열 선언자의 일부예요.
  • 초기화에서 배열 원소에 대한 지정자(designator)를 도입해요. (since C99)
  • 속성 지정자에서 속성들을 구분해요. (since C23)

#

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

##

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

( )

  • 표현식에서 그룹화를 나타내요.
  • 함수 호출 연산자예요.
  • sizeof, _Alignof(since C11), typeof·typeof_unqual(since C23) 표현식에서 피연산자를 구분해요.
  • 명시적 캐스트에서 type-id를 구분해요.
  • 복합 리터럴에서 type-id를 구분해요. (since C99)
  • 선언이나 type-id에서 그룹화를 나타내요.
  • 함수 선언자(선언이나 type-id에서)에서 매개변수 목록을 구분해요.
  • if, switch, while, do-while, for 문에서 제어 절을 구분해요.
  • 함수형 매크로 정의에서 매크로 매개변수를 구분해요.
  • 함수형 매크로 호출에서 매크로 인자를 구분하거나, 콤마가 인자 구분자로 해석되는 것을 막아요.
  • defined, __has_include, __has_embed, 또는 __has_c_attribute(since C23) 전처리 연산자의 일부예요.
  • 제네릭 선택 표현식의 일부예요. (since C11)
  • _Atomic 타입 지정자에서 type-id를 구분해요. (since C11)
  • 정적 단언(static assertion) 선언에서 피연산자들을 구분해요. (since C11)
  • _Alignas 지정자에서 피연산자를 구분해요. (since C11)
  • 속성에서 속성 인자들을 구분해요. (since C23)
  • 비트-정밀 정수 타입 이름(_BitInt(N))에서 크기를 구분해요. (since C23)
  • 가변 인자 매크로 정의에서 __VA_OPT__ 치환의 일부예요. (since C23)
  • #embed 지시문과 __has_embed 전처리 표현식에 쓰이는 전처리 매개변수에서 매개변수 절을 구분해요. (since C23)

;

다음의 끝을 나타내요.

  • 문(statement) (for 문의 init-statement 포함)

  • 선언 또는 struct-declaration-list

  • for 문의 두 번째와 세 번째 절을 분리해요.

:

  • 조건 연산자의 일부예요.
  • 레이블 선언의 일부예요.
  • 비트 필드 멤버 선언에서 너비를 도입해요.
  • 열거형의 기본 타입(underlying type)을 지정하는 enum base를 도입해요. (since C23)
  • 제네릭 연관(association)에서 type-id 또는 default와 선택된 표현식을 구분해요. (since C11)

...

  • 함수 선언자의 매개변수 목록에서 가변 인자 함수(variadic function)임을 나타내요.
  • 매크로 정의에서 가변 인자 매크로임을 나타내요. (since C99)

?

::

  • 속성에서 속성 범위를 나타내요. (since C23)
  • 전처리 접두 매개변수(#embed__has_embed가 사용)에서 범위를 나타내요. (since C23)

.

->

~

  • 단항 보수 연산자(비트 not 연산자라고도 해요)예요.

!

  • 논리 not 연산자예요.

+

  • 단항 더하기 연산자예요.
  • 이항 더하기 연산자예요.

-

  • 단항 빼기 연산자예요.
  • 이항 빼기 연산자예요.

*

  • 간접(역참조) 연산자예요.
  • 곱셈 연산자예요.
  • 선언자 또는 type-id에서 포인터 연산자예요.
  • 함수 선언에서 가변 길이 배열 선언자의 길이를 위한 자리 표시자예요. (since C99)

/

  • 나눗셈 연산자예요.

%

  • 모듈로 연산자예요.

^

  • 비트 xor 연산자예요.

&

|

  • 비트 or 연산자예요.

=

  • 단순 할당 연산자예요.
  • 초기화에서 객체와 초기화자 목록을 구분해요.
  • 열거형 정의에서 열거 상수의 값을 도입해요.

+=

  • 복합 할당 연산자예요.

-=

  • 복합 할당 연산자예요.

*=

  • 복합 할당 연산자예요.

/=

  • 복합 할당 연산자예요.

%=

  • 복합 할당 연산자예요.

^=

  • 복합 할당 연산자예요.

&=

  • 복합 할당 연산자예요.

|=

  • 복합 할당 연산자예요.

==

  • 동등(equality) 연산자예요.

!=

  • 부등(inequality) 연산자예요.

<

  • 보다 작음(less-than) 연산자예요.
  • 다음에서 헤더 이름을 도입해요.
    • #include 지시문
    • __has_include 전처리 표현식 (since C23)
    • #embed 지시문 (since C23)
    • __has_embed 전처리 표현식 (since C23)
    • #pragma 지시문 내부의 구현-정의 위치

>

  • 보다 큼(greater-than) 연산자예요.
  • 다음에서 헤더 이름의 끝을 나타내요.
    • #include 지시문
    • __has_include 전처리 표현식 (since C23)
    • #embed 지시문 (since C23)
    • __has_embed 전처리 표현식 (since C23)
    • #pragma 지시문 내부의 구현-정의 위치

<=

  • 보다 작거나 같음(less-than-or-equal-to) 연산자예요.

>=

  • 보다 크거나 같음(greater-than-or-equal-to) 연산자예요.

&&

  • 논리 and 연산자예요.

||

  • 논리 or 연산자예요.

<<

  • 비트 시프트 연산자예요.

>>

  • 비트 시프트 연산자예요.

<<=

  • 복합 할당 연산자예요.

>>=

  • 복합 할당 연산자예요.

++

  • 증가 연산자예요.

--

  • 감소 연산자예요.

,

  • 콤마 연산자예요.
  • 다음에서 목록 구분자예요.
    • 선언의 선언자 목록
    • 초기화의 초기화자 목록 (복합 리터럴 포함, since C99)
    • 함수 호출 표현식의 인자 목록
    • enum 선언의 enumerator 목록
    • 함수 매개변수 목록
    • 함수형 매크로 정의의 매크로 매개변수 목록
    • 함수형 매크로 호출의 매크로 인자 목록 (안쪽 괄호 사이에 있지 않은 경우)
    • 제네릭 선택 표현식의 제네릭 연관 목록 (since C11)
    • 속성 목록 (since C23)
  • 정적 단언 선언에서 인자들을 분리해요. (since C11)
  • 제네릭 선택 표현식에서 제어 표현식과 제네릭 연관 목록을 분리해요. (since C11)

더 알아보기