(+)분류 : 가져온 문서/오메가
C 언어란 AT&T 벨 연구소에서 만든 B언어를 개량한 언어로 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어이다. 절차 지향적으로 주로 쓰인다. 켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 리치가 이것을 개선하여 C언어가 탄생했다.
1. 기본 문법 ✎ ⊖
다음과 같이 변수를 정의한다.
변수는 기본적으로 정적할당방식을 사용하고 자료형을 반드시 기재해주어야 한다.
예를 들어,
이라 정의하면 32비트 정수형 변수 num이 메모리에 할당된다.
함수를 선언 후 정의하는 것은 다음과 같다.
단순히 함수를 선언만 하려면
라고 치면 된다. 단, main( ) 함수는 자체적으로 선언된 함수이므로 반드시 정의만 허용된다.
함수의 정의와 선언에 대한 예는 다음과 같다.
type_name var_name;
변수는 기본적으로 정적할당방식을 사용하고 자료형을 반드시 기재해주어야 한다.
예를 들어,
int num;
이라 정의하면 32비트 정수형 변수 num이 메모리에 할당된다.
함수를 선언 후 정의하는 것은 다음과 같다.
return_type_name func_name(param_types param_names)
{
/* function body */
}
단순히 함수를 선언만 하려면
return_type_name func_name(param_types param_names);
라고 치면 된다. 단, main( ) 함수는 자체적으로 선언된 함수이므로 반드시 정의만 허용된다.
함수의 정의와 선언에 대한 예는 다음과 같다.
void run();
void run()
{
printf("Running...rn");
}
float sqrt(float x)
{
/* input the code to get square root */
return r;
}
2. 자료형 ✎ ⊖
기본 자료형은 아래와 같다.
자료형 별 크기는 컴파일러마다 차이를 보인다. 참고로 연산자 sizeof는 변수나 상수, 자료형의 메모리 크기를 계산해서 반환하는데, 이를 이용하면 자료형의 바이트 크기를 확인할 수 있다.(1) unsigned를 정수 자료형의 앞에 첨가하면 0 이상의 값만 표시되며, 그 범위가 두 배로 늘어난다. 예를 들어 unsigned int라고 입력한다.
C 언어는 아스키 코드를 사용해 문자를 표현한다. 따라서 변수에 원하는 문자의 아스키 코드를 넣고 %c로 출력하면 지정된 문자가 나타난다.(2)
상수는 literal(리터럴) 상수와 symbolic(심볼릭) 상수가 있으며, 자료형을 근거로 표현된다. 변수와는 다르게 초기화 후 재정의가 불가능하다. 리터럴 상수는 이름이 없는 상수이며, 여러 자료형을 기반하여 상수를 표현할 수 있다. 아래는 여러 자료형의 상수를 표현할 수 있도록 정의된 접미사들이다. 이 접미사들은 대소문자를 구별하지 않는다.
심볼릭 상수는 이름을 가진 상수이다. 매크로 상수와 const 키의 두 가지 표현법이 존재한다.
자료형 | 크기 |
char | 1 byte |
short | 2 byte |
int | 4 byte |
long | 4 byte |
long long | 8 byte |
자료형 | 크기 |
float | 4 byte |
double | 8 byte |
long double | 8 byte 이상 |
자료형 별 크기는 컴파일러마다 차이를 보인다. 참고로 연산자 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 키의 두 가지 표현법이 존재한다.
3. 예시 ✎ ⊖
다음 간단한 코드가 무엇을 의미하는지 생각해 보자.
먼저 첫 줄부터 살펴보자. 첫 줄은
라고 쓰여 있다. C 계열 언어(C, C++, Java, C#) 전반에 걸쳐 #키워드 구문은 전처리기(preprocessor)에게 특정 명령을 내리는 구문이다. #include는 해당 소스 파일을 인클루드(3)하라는 명령이다. 표준 C 언어 규약으로 꺾쇠괄호(<>) 안에 파일명이 있다면 정해진 인클루드 디렉터리(include directory)에서 그 파일을 찾아 인클루드하고, 따옴표("") 안에 파일명이 있다면 로컬 디렉터리(local directory)에서 그 파일을 찾아 인클루드한다. 여기서는 표준 C 헤더인 stdio.h(std = standard, io = Input/Output)를 인클루드하라는 것이다.
세번째 줄에
라고 나와 있다. 매개변수가 있어야 할 곳에 void 키워드가 있는데, 이는 매개변수가 없음을 명시적으로 드러내는 것이다.(4) 반환값은 32비트 정수형인데 이는 표준 C 언어의 규약이다. 반환값은 일반적으로 0인 경우 정상 종료, -1인 경우 비정상 종료를 의미한다.
이제 main( ) 함수 내부의 본문이다. 처음에 나온 문장은
인데 이것은 앞에서 다루었으므로 설명을 생략한다. 그 다음은
이라 나와 있다. printf( ) 함수는 매개변수로 받은 내용을 출력한다. 여기서 n은 라인 피드(line feed, LF)라고 부르는데, 출력문이 다음 줄로 넘어가도록 지시한다. Windows에서는 키보드의 엔터 키를 누르면 라인 피드와 캐리지 리턴(carrige return, CR; r)이 같이 입력되는 반면, Mac OS에서는 엔터 키를 누르면
라인 피드만 입력된다.(5) 다음으로
가 나오는데, 이때 중요한 점은 num이 아니라 &num이 매개변수에 입력된다는 것이다. 이러한 이유는 scanf( ) 함수는 입력되는 숫자를 10진수로 인식하여(%d, d = decimal) num에 입력해야 하는데 num의 주소를 모르므로 num의 주소를 받는 것이다. 이러면 num에 제대로 입력된다. 그 다음 다시
이 나온다. %x는 16진수(heXadecimal)을 의미한다. 보통 프로그래머들은 16진수 표현에서 0x129A23과 같은 표현을 좋아하므로 %#x를 써서 앞에 0x가 붙도록 지시한다. 여기서 %d, %x와 같은 것들을 서식문자라 부르는데, 이에 대해 간단히 정리하면 다음과 같다.
마지막으로
가 나오는데, 이는 main( ) 함수를 호출한 상위함수에 0을 반환한다. 이는 정상적인 종료를 의미하며, 상위함수는 리소스를 정리하고 OS에 종료 신호를 보내 OS가 종료시키도록 한다.
#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가 종료시키도록 한다.
4. 관련 언어 ✎ ⊖
C언어는 직접적으로 혹은 간접적으로 이후의 언어들에 영향을 주었다. C# 언어, D 언어, Go, JAVA, 자바스크립트, Perl, PHP, Python 등이 있는데, 각각에 따라 영향을 받은 정도는 크게 다르다.
C++ 언어와 Objective-C는 C의 확장적 언어라고 볼 수 있는데, 객체지향 언어로서 이용된다. Python의 expression들은 C와 자바와 유사점을 가지며, 파이썬 코드를 C언어로 컴파일하는 Cython을 이용할 수도 있다.
C++ 언어와 Objective-C는 C의 확장적 언어라고 볼 수 있는데, 객체지향 언어로서 이용된다. Python의 expression들은 C와 자바와 유사점을 가지며, 파이썬 코드를 C언어로 컴파일하는 Cython을 이용할 수도 있다.