C 언어란 AT&T 벨 연구소에서 만든 B언어를 개량한 언어로 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어이다. 절차 지향적으로 주로 쓰인다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 리치가 이것을 개선하여 C언어가 탄생했다.
자료형 별 크기는 컴파일러마다 차이를 보인다. 참고로 연산자 sizeof는 변수나 상수, 자료형의 메모리 크기를 계산해서 반환하는데, 이를 이용하면 자료형의 바이트 크기를 확인할 수 있다.(1) unsigned를 정수 자료형의 앞에 첨가하면 0 이상의 값만 표시되며, 그 범위가 두 배로 늘어난다. 예를 들어 unsigned int라고 입력한다.
C 언어는 아스키 코드를 사용해 문자를 표현한다. 따라서 변수에 원하는 문자의 아스키 코드를 넣고 %c로 출력하면 지정된 문자가 나타난다.(2)
상수는 literal(리터럴) 상수와 symbolic(심볼릭) 상수가 있으며, 자료형을 근거로 표현된다. 변수와는 다르게 초기화 후 재정의가 불가능하다. 리터럴 상수는 이름이 없는 상수이며, 여러 자료형을 기반하여 상수를 표현할 수 있다. 아래는 여러 자료형의 상수를 표현할 수 있도록 정의된 접미사들이다. 이 접미사들은 대소문자를 구별하지 않는다.
접미사
자료형
예시
U
unsigned int
unsigned int a = 2036U
L
long
long a = 1359L
UL
unsigned long
unsigned long a = 4321UL
LL
long long
long long a = 3423LL
ULL
unsigned long long
unsigned long long a = 6842ULL
심볼릭 상수는 이름을 가진 상수이다. 매크로 상수와 const 키의 두 가지 표현법이 존재한다.
#include <stdio.h>
int main(void)
{
int num;
printf("10진수 정수를 입력하세요.n");
scanf("%d",&num);
printf("16진수로 표현하면 %x입니다.n", num);
return 0;
}
먼저 첫 줄부터 살펴보자. 첫 줄은
#include <stdio.h>
라고 쓰여 있다. C 계열 언어(C, C++, Java, C#) 전반에 걸쳐 #키워드 구문은 전처리기(preprocessor)에게 특정 명령을 내리는 구문이다. #include는 해당 소스 파일을 인클루드(3)하라는 명령이다. 표준 C 언어 규약으로 꺾쇠괄호(<>) 안에 파일명이 있다면 정해진 인클루드 디렉터리(include directory)에서 그 파일을 찾아 인클루드하고, 따옴표("") 안에 파일명이 있다면 로컬 디렉터리(local directory)에서 그 파일을 찾아 인클루드한다. 여기서는 표준 C 헤더인 stdio.h(std = standard, io = Input/Output)를 인클루드하라는 것이다.
세번째 줄에
int main(void)
라고 나와 있다. 매개변수가 있어야 할 곳에 void 키워드가 있는데, 이는 매개변수가 없음을 명시적으로 드러내는 것이다.(4) 반환값은 32비트 정수형인데 이는 표준 C 언어의 규약이다. 반환값은 일반적으로 0인 경우 정상 종료, -1인 경우 비정상 종료를 의미한다.
이제 main( ) 함수 내부의 본문이다. 처음에 나온 문장은
int num;
인데 이것은 앞에서 다루었으므로 설명을 생략한다. 그 다음은
printf("10진수 정수를 입력하세요.n");
이라 나와 있다. printf( ) 함수는 매개변수로 받은 내용을 출력한다. 여기서 n은 라인 피드(line feed, LF)라고 부르는데, 출력문이 다음 줄로 넘어가도록 지시한다. Windows에서는 키보드의 엔터 키를 누르면 라인 피드와 캐리지 리턴(carrige return, CR; r)이 같이 입력되는 반면, Mac OS에서는 엔터 키를 누르면 라인 피드만 입력된다.(5) 다음으로
scanf("%d", &num);
가 나오는데, 이때 중요한 점은 num이 아니라 &num이 매개변수에 입력된다는 것이다. 이러한 이유는 scanf( ) 함수는 입력되는 숫자를 10진수로 인식하여(%d, d = decimal) num에 입력해야 하는데 num의 주소를 모르므로 num의 주소를 받는 것이다. 이러면 num에 제대로 입력된다. 그 다음 다시
printf("16진수로 표현하면 %x입니다.n", num);
이 나온다. %x는 16진수(heXadecimal)을 의미한다. 보통 프로그래머들은 16진수 표현에서 0x129A23과 같은 표현을 좋아하므로 %#x를 써서 앞에 0x가 붙도록 지시한다. 여기서 %d, %x와 같은 것들을 서식문자라 부르는데, 이에 대해 간단히 정리하면 다음과 같다.
/*
%c : 단일 문자. Character
%s : 문자열. String
%d : 10진수 32비트 정수. Decimal
%ld : 10진수 64비트 정수. Long Decimal
%lld :
%o : 8진수 32비트 정수. Octal (보통 프로그래머들은 일부러 %#o를 써서 숫자 앞에 0이 붙도록 한다.)
%x, %X : 16진수 32비트 정수. heXadecimal (보통 프로그래머들은 일부러 %#x를 써서 숫자 앞에 0x가 붙도록 한다.)
%u : 10진수 32비트 '부호가 없는' 정수. Unsigned decimal
%f : 32비트 단일 정밀도 실수. Float
%lf : 64비트 복수 정밀도 실수. Long Float
%e, %E : 지수 표기법. Exp (%E도 같은 표현. 단, 출력시 e냐 E냐의 차이일 뿐이다.)
%g, %G : 소수점 이하의 자릿수에 따라 %f와 %e/%E 중 자동 선택.
%p : 포인터가 가리키는 변수의 주소.
%% : 퍼센트 표현.
*/
/*
%3d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력.
%03d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력. 비어 있는 곳은 0으로 채움.
%-3d : 3자리 칸을 만들어 왼쪽 정렬로 숫자 출력.
%+3d : 3자리 칸을 만들어 오른쪽 정렬로 숫자 출력. 이때 부호 표기.
*/
마지막으로
return 0;
가 나오는데, 이는 main( ) 함수를 호출한 상위함수에 0을 반환한다. 이는 정상적인 종료를 의미하며, 상위함수는 리소스를 정리하고 OS에 종료 신호를 보내 OS가 종료시키도록 한다.
이 문서의 내용 중 전체 또는 일부는 오메가에서 가져왔으며 CC BY-NC-SA 3.0에 따라 이용할 수 있습니다.
(1) 예를 들면 printf("%d", sizeof(자료형))(2) 예시로, int asc2=65 이후 printf("%c", asc2)를 입력한다.(3) #include는 컴파일 이전에 전처리기가 #include 구문이 있는 자리에 해당 파일을 복사한다는 의미이다.(4) 아무것도 없으면 암시적으로 없음을 알린다고 한다.(5) 캐리지 리턴을 입력하려면 리턴 키를 눌러야 한다.