C 언어는 절차적 프로그래밍 언어로, 1978년 데니스 리치(Dennis Ritchie)가 벨 연구소에서 개발한 ANSI C 표준을 기반으로 한다. 문법은 어휘(Lexical) 요소와 구문(Syntax) 규칙으로 구성된다.
1. 어휘 요소
| 종류 | 설명 |
|---|---|
| 식별자(Identifier) | 변수, 함수, 배열 등 프로그램 개체의 이름. 알파벳·숫자·언더스코어(_)로 구성되며 첫 글자는 알파벳 또는 언더스코어. |
| 키워드(Keyword) | 언어가 미리 정의한 예약어(예: int, if, while, return 등). 식별자로 사용할 수 없다. |
| 상수(Constant) | 정수(123), 실수(3.14), 문자('A'), 문자열("text"), 널 포인터(NULL) 등. |
| 연산자(Operator) | 산술(+, -, *, /, %), 논리(&&, ` |
| 구분자(Punctuator) | 구문을 구분하는 기호(예: ;, ,, (, ), {, }, [, ]). |
| 주석(Comment) | /* ... */ 형태의 블록 주석과 // 뒤의 라인 주석. 컴파일러는 주석을 무시한다. |
| 공백(Whitespace) | 공백, 탭, 개행 등. 토큰 구분을 위한 용도이며 의미를 갖지 않는다. |
2. 구문 규칙
C 프로그램은 번역 단위(Translation Unit) 로 구성되며, 하나 이상의 외부 선언(External Declaration) 로 이루어진다. 외부 선언은 전역 변수 선언, 함수 선언·정의, 혹은 #include·#define 등 전처리 지시문을 포함한다.
2.1 선언과 정의
- 선언(Declaration): 객체(변수·함수)의 타입과 식별자를 알린다. 예:
extern int count; - 정의(Definition): 실제 저장공간을 할당하거나 함수 본문을 제공한다. 예:
int count = 0;,int add(int a, int b) { return a + b; }
2.2 타입 지정자와 한정자
- 기본 타입:
int,char,float,double,void - 파생 타입: 포인터(
*), 배열([]), 함수(()), 구조체(struct), 공용체(union), 열거형(enum) - 저장 클래스 지정자:
auto,register,static,extern,_Thread_local - 형 한정자:
const,volatile,restrict,_Atomic
2.3 문(statement) 구조
C 문은 크게 선언문, 표현식문, 제어문, 복합문 로 구분된다.
| 구분 | 문법 형식 | 설명 |
|---|---|---|
| 표현식문 | expression ; |
연산·함수 호출 등, 값을 계산하고 결과를 버린다. |
| 조건문 | if ( expression ) statement [ else statement ] |
조건에 따라 분기. |
| 반복문 | while ( expression ) statement do statement while ( expression ) ; for ( init ; cond ; incr ) statement |
반복 실행. |
| 점프문 | break ; continue ; return [ expression ] ; goto identifier ; |
흐름 제어. |
| 복합문 | { declaration-listopt statement-listopt } |
여러 문을 하나의 블록으로 묶는다. |
2.4 표현식(Expression)
표현식은 연산자 우선순위와 결합 규칙에 따라 평가된다. 주요 규칙은 다음과 같다.
- 후위 연산자:
(),[],.,->, postfix++,-- - 전위 연산자:
++,--,+,-,!,~,*(dereference),&(address),sizeof - 산술·비트 연산:
*,/,%→+,-→<<,>>→<,<=,>,>=→==,!= - 논리 연산:
&→^→|→&&→|| - 조건 연산:
?: - 할당 연산:
=,+=,-=등 - 쉼표 연산:
,
2.5 전처리 지시문
#include, #define, #undef, #if, #ifdef, #ifndef, #else, #elif, #endif, #pragma 등은 컴파일 전 단계에서 소스 코드를 변형한다. 전처리기는 텍스트 기반으로 동작한다.
3. 표준 규격
C 언어의 문법은 ISO/IEC 9899 시리즈(일반적으로 “C 표준”)에 정의된다. 주요 버전은 다음과 같다.
| 표준 | 발표 연도 | 특징 |
|---|---|---|
| C89 / C90 | 1989 / 1990 | 최초 ANSI 표준, 함수 원형 선언 도입. |
| C99 | 1999 | 변수 선언의 블록 내 위치 허용, 복합 리터럴, // 주석, long long 타입 등. |
| C11 | 2011 | 멀티스레드 지원(_Thread_local), 정적 분석용 _Static_assert, 원자 연산 등. |
| C17 | 2017 | C11의 수정·버그 수정판, 새로운 기능 추가 없음. |
| C23 (예정) | 2023(초안) | 일부 언어 확장 논의 중. |
4. 구현상의 유의점
- 정수형 크기:
int,short,long등의 정확한 바이트 수는 구현 정의이며,<stdint.h>를 통해 고정 폭 타입(int32_t등)을 사용할 수 있다. - 형 변환: 암시적·명시적 형 변환이 자동으로 이루어지며,
float→int등은 값 손실이 발생할 수 있다. - 포인터 연산: 배열과 포인터는 서로 변환 가능하나, 포인터 연산은 대상 객체의 크기를 고려한다.
- 정의와 선언의 중복: 동일 번역 단위 내에서 같은 식별자에 대한 다중 정의는 오류이며, 선언은 여러 번 허용된다(단, 일관성 유지).
5. 요약
C 언어의 문법은 정형화된 어휘·구문 규칙에 의해 이루어지며, 전처리 단계, 선언·정의, 제어·표현식 문, 그리고 표준 정의에 따라 일관된 구조를 가진다. 이러한 문법은 다양한 하드웨어와 운영체제에서 이식성을 확보하도록 설계되었으며, 이후 표준 개정판을 통해 새로운 기능과 안전성을 지속적으로 보강하고 있다.