C 언어는 고유의 소스코드 구성 요소로 구성된다. 입문 단계에서 흔히들 제시하는 Hello, world! 출력 예제를 보자.
/* Hello, world! 라는 문자열을 화면에 표시하는 코드다 */
#include
int main()
{
printf(“Hello, world!\n”);
return 0;
}
이 예제에서
/* Hello, world! 라는 문자열을 화면에 표시하는 코드다 */ 는 주석으로 프로그램 코드에 대한 해설을 붙이는 요소다.
#nclude 는 외부 루틴을 파일에 포함시켜 컴파일시 참조하라는 지시어다.
int main() 에서 int는 리턴 타입을 지시하고, main()은 함수명을 지시한다.
{ } 는 블럭으로 함수 본체를 이룬다.
printf()는 명령문이고
return 0; 은 리턴 값으로 int가 리턴 타입이므로 return하는 값은 0이다.
우선 주석은 /* */사이에 두기도 하고 // 로 붙이기도 한다. /* */는 여러 줄에 걸쳐서 주석을 달때 쓰이고, // 는 한줄 주석에 편리하다. 컴파일시 어휘분석 단계에서 제거가 된다. 주석은 프로그램 실행에 어떠한 영향도 안주는 요소라서 컴파일 과정에서는 제거된다. 프로그램 작성시에는 프로그래머들에게 인사이트를 전달하는데, 특히 정형화된 형태로 주석을 규칙화해서 달아두면 프로젝트 진행시나, 10년이 지나 다시 볼때 프로그램 소스코드 이해가 쉽게 되는 장점이 있어 적절하게 주석을 이용해야 한다.
#include 는 전처리 구문으로, C에 포함되어 있는 라이브러리 루틴인 stdio.h 를 인클루드하라는 지시어다. stdio.h를 인클루드하면 printf()라는 화면 표시용 함수를 쓸수 있게 된다. 다른 파일도 인클루드 지시가 가능하다. 이처리는 컴파일시 전처리기가 담당한다.
int main()에서 int는 함수명 앞에 오면 함수가 궁극적으로 리턴할 리턴 타입을 명시하는 것이다. C 표준에서는 보통 main() 함수가 리턴하는 타입을 지정하도록 하는데, 0을 리턴하면 함수가 오류없이 끝났다는 표시를 할 수 있다. main() 함수가 아닌 다른 부속 함수인 경우, 변수에 함수의 리턴값을 대입해서 쓰기도 한다. 예를 들면 double sumAandB(double a, double b) { return a + b; } 처럼 정의하고 소스코드 어딘가에서 double sum = sumAandB(0.1 + 0.2); 처럼 호출하면 sum에서 리턴한 값이 대입되는 원리다.
main()은 모든 C 프로그램 소스코드가 정의해야 할 함수다. 실행이 될때 진입지점이 되는 함수로, 대다수의 경우 C 언어 프로그램은 반드시 main() 함수가 정의되어 있게 된다.
{ } 는 블럭 지정으로 함수 본체의 범위를 지정한 것이다. 이 안에서 지정된 코드는 함수명으로 온 함수의 실행 유효 범위 안에서 실행된다. 이는 프로그램 실행시 스택에 지정되는 인자들이나 지역변수들의 실행 스코프와도 연관되는데 차츰 설명하겠다.
return 0; 은 함수의 리턴 값으로 0을 리턴하겠다는 명시다. main() 함수의 리턴 타입을 정수형인 int 로 정의해두었으므로 return 값도 이 정의를 따라 정수 0을 반환하는 것으로 작성되었다. 때로는 0아닌 정수를 리턴함으로써 오류 처리를 하기도 한다.
이러한 기본 구조에 따라 C 언어는 구성되며 조금씩 확장된 문법 요소들이 더 올 수 있다.