•  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

C언어 (r1) (복원)


비로그인 상태입니다. 편집한 내용을 저장하면 지금 접속한 IP가 기록됩니다.



[[분류:가져온 문서/오메가]]
'''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]])]