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