C(프로그래밍 언어)

이동: 둘러보기, 검색

개요[편집]

벨 연구소에서 데니스 리치가 OS를 작성하기 위해 만든 언어.

OS를 제어하는 목적으로 만들어진 언어인지라 현대 프로그래밍에서 널리 사용되는 고급언어중에서 실행속도가 가장 빠르다고 알려져 있다. 이런 특성 때문에 임베디드 시스템에서 아직도 널리 쓰이고 있다. 단 스마트폰은 요새 하드웨어의 발전이 하도 빨라서 굳이 이걸 안써도 된다지만 몇년전 피쳐폰 시절만 해도......

사실 왜 C언어 라고 이름을 지었냐면 벨 연구소에서 이전에 만든 프로그래밍 언어가 B언어였다.

왜 아직도 이걸 쓰나[편집]

C언어는 1972년에 만들어진 좆고전 프로그래밍 언어이지만 아직까지 쓰인다.도대체 왜 이런 걸까?

  • C 언어로 작성된 프로그램은 호환성이 좋다.
C언어로 작성된 프로그램은 CPU의 종류와 상관없이 실행이 가능하고 운영체제가 차이난다고 해도 생각보다 덜 하다.
  • 컴파일러 구현이 쉽다.
대학교 과제로도 만들 수 있을 정도로 쉬운 편이기 때문에 위에서 말한 여러 CPU용으로 컴파일러를 만들어두기 좋다. 최근 나오는 CPU 중에 해당되는 C컴파일러가 없는 CPU는 거의 없을 것이다.
  • 그동안 쌓인 코드가 많다.
UNIX 개발용으로 만들었던 언어였던 만큼, UNIX가 대박을 친 이후 UNIX계열 운영체제의 개발언어는 대부분 C가 되었다. MS Windows도 내부 커널 구현에는 C를 사용하고 있을 정도. UNIX계열 OS와 잘 밀착되어 있는 언어기 때문에 이런저런 프로그램 개발에 자주 동원되었고. 이때 쌓인 코드들이 라이브러리가 되어 다시 공급되는 과정을 거쳐 현재의 거대한 코드 집합이 되었다.
  • 하드웨어 친화적이다.
사람 입장에선 좀 귀찮은 일인데. 어셈블리에 가까울 정도로 하드웨어를 세밀하게 관리할 수 있기 때문에 유용하다. 위에서 언급한 대로 UNIX 개발용 언어였기 떄문에 지니는 특성인데. 언뜻 보면 이해하기 힘든 어셈블리 코드 보다 읽기 편하면서도 군더더기가 없어 속도도 보장되는 얼마 없는 언어기 때문에 임베디드 개발 등에서는 아직도 자주 사용된다. 드라이버 개발이나 OS 관련 작업에선 빼놓기 힘들 정도. 무엇보다 이런 쪽으로 개발하는 경우 사용할 수 있는 라이브러리가 대부분 C로 작성되어 있다.
  • 절차지향적 특성을 가짐
※잠깐, 절차 지향적이란?
프로그램이 순서대로 실행되어 흘러간다는 소리다.즉 순서가 있으니 다른 프로그래밍 언어 보다 (학문적으로) 접근하기 쉽다.간단하게 예를 들어보자.


아침에 일어나서 세수를 하고 양치를 했다.그리고 밥을 먹고 똥을 싼다.그 다음 갓수 복장을 한 뒤 컴퓨터 앞에 앉자서 구스위키에 접속한다.[1]

이런 식으로 사람은 기본적으로 순서를 가지는데 일반적으로 우리는 절차지향적에 가깝다.순서대로 일을 진행시키니 말이다.이러한 이유로 타 프로그래밍 언어보다 쉽게 배울 수있다.



C언어를 배우고 다른 고급언어(자바/C#등)로 넘어가면 근본적인 이해도가 달라지게 된다. 겉으론 클래스로 포장되어 있지만 안에 돌아가는 구조를 쉽게 파악할 수가 있다.그러니깐 다른 프로그래밍 언어역시 C와 끊을 수 없는 관계이다.

연산자[편집]

연산자란 C언어에 있어서 계산하기 위한 방식에 대해서 설명하는 것이다.그러니깐 수학으로 치자면 덧셈/뺄셈/나눗셈/곱셈 등등 이런 걸 여기서는 연산자라고 규정한다.

연산자에서의 우선순위[편집]

수학을 해봤으면 기본적으로 덧셈과 뺄셈 그리고 곱하기가 있는 혼합계산이 존재한다고 생각해보자 덧셈 및 뺄셈을 먼저하지 않고 곱셈부터 먼저 처리하고 계산하는걸 다들 수학시간에 졸지않고 했다면 알 것이다.C언어에서의 연산자 역시 먼저 계산해야할 우선순위가 있다.

이래도 뭔소린지 모르겠으면 직접 한번 보자![편집]

연산자 의미 비고 예시 계산 방향
= 오른쪽에 있는 값을 왼쪽에 대입 일반 수학과 개념이 비슷함. 다만 같다의 의미는 절대 아님. i = 10
+ 왼쪽과 오른쪽에 있는 것을 더함. 일반적으로 알고 있는 개념과 같음. i = 3 + 5
- 왼쪽에 있는 값에서 오른쪽에 있는 값을 뺌. 일반적으로 알고 있는 개념과 같음. i = 5 - 3
* 왼쪽과 오른쪽에 있는 값을 곱함. 일반적으로 알고 있는 개념과 같음. i = 10 * 8
/ 왼쪽과 오른쪽에 있는 값을 나눔. 일반적으로 알고 있는 개념과 같음. i = 8 * 2
 % 왼쪽과 오른쪽에 있는 값을 나누고 나머지를 반환한다. 기본적으로 나눗셈과 같은 의미이나 나머지 반환에 주목. i = 7 % 3
++i 값에 1을 먼저 증가 시킨 후 계산을 진행한다.(선 증가,후 연산) 이 부분은 헷갈리기 쉬우니 조심하는게 좋음.참고로 "++"이 1 증감을 뜻하지 i만큼 증감이 아님. val = ++i;
i++ 계산을 다 끝낸 후 1을 증가 시킨다.(선 연산,후 증가) 헷갈리기 쉬우니 조심하는게 좋음.참고로 "--"이 1 감소를 뜻하지 i만큼 감소가 아님. val = i++;
--i 값에 1을 먼저 감소 시킨 후 계산을 진행한다.(선 증가,후 연산) 헷갈리기 쉬우니 조심하는게 좋음.참고로 "--"이 1 감소를 뜻하지 i만큼 감소가 아님. val = --i;
i-- 계산을 다 끝낸 후 1을 감소 시킨다.(선 연산,후 증가) 헷갈리기 쉬우니 조심하는게 좋음."--"이 1 감소를 뜻하지 i만큼 감소가 아님. val = i--;
< 크기 비교 일반적으로 알고 있는 개념과 같음. i < j
> 크기 비교 일반적으로 알고 있는 개념과 같음. i > j
== 비교할 두 대상이 같은지 물어보는 연산자이다. 가끔 = 이 두개라고 같다고 보는 병신이 있음. i == j
 != 비교할 두 대상이 같지 않은지 물어보는 연산자이다. 대충 넘기다가 방심해서 의미 잊어먹을 수도 있으니 참고해두는게 좋음. i != j
<= 크기 비교 일반적으로 알고 있는 개념과 같음. i <= j
>= 크기 비교 일반적으로 알고 있는 개념과 같음. i >= j
&& 비교할 두 대상이 모두 참이면 연산결과를 TRUE(참)로 반환. 논리 AND와 같다고 보면 된다. i && j
| | 비교할 두 대상이 둘 중 하나라도 참이면 연산결과를 TRUE(참)로 반환. 논리 OR과 같다고 보면 된다. i | | j
 ! 피연산자가 '참'이면 '거짓', '거짓'이면 '참'으로 반환. 그냥 청개구리 같은 놈[2]이라고 보면 됨. 논리 NOT과 같다고 보면 된다.  !i
& 비트 단위 AND 대상을 나타내는 2진수의 같은 자리끼리 AND를 연산한다. i & j
| 비트 단위 OR 대상을 나타내는 2진수의 같은 자리끼리 OR를 연산한다. i | j
^ 비트 단위 XOR 대상을 나타내는 2진수의 같은 자리끼리 XOR를 연산한다. i ^ j
~ 비트 단위 NOT 대상을 나타내는 2진수의 각 자리를 1은 0으로, 0은 1으로 변환한다. 즉, 각각의 자리마다 NOT을 계산한다. ~i
<< 비트 왼쪽 이동 비트를 각각 뒤의 수에 해당하는 자리수만큼 왼쪽(자리수를 올린다고 생각하면 됨)으로 이동한다. 단 변수로 할당된 주소범위 안에서만 이동하며, 왼쪽을 넘어가는 수는 자르고 오른쪽은 0으로 채운다. a<<b
>> 비트 오른쪽 이동 비트를 각각 뒤의 수에 해당하는 자리수만큼 오른쪽(자리수를 내린다고 생각하면 됨)으로 이동한다. 단 변수로 할당된 주소범위 안에서만 이동하며, 왼쪽은 0으로 채우고 오른쪽은 자른다. a>>b

비트 단위 연산자는 컴퓨터의 문자, 숫자를 비롯한 모든 저장값이 2진수라는 걸 알아야 이해가 가능하다. 2진수의 각 자리 숫자나 자리수에 대한 연산이기 때문이다.

과제[편집]


공과대학들에서는 컴공/전산계열이 아니어도 커리큘럼에 포함되는 경우가 있을 정도로 널리 교육되고 있는 언어이며 학기초에 C언어로 과제를 작성하는것을 물어보는 글이 여러 관련 커뮤니티에 올라오는것은 연례행사급.


여기에 서술하는 과제는 주로 공과대학에 속하는 과가 C언어를 공부한다면 거의 필수적으로 나오는 문제들이다.물론 여기에 있는걸 다 믿어라는건 아니고 참고하면 C언어를 공부하는데 어느정도 도움이 될지도 모른다.사실 내용도 부실해서 별 도움 안된다.

기초[편집]

별 찍기[편집]

사실상 필수요소로 나오는 과제.가장 기초적인건 다음과 같다.


*
**
***
****
*****

물론 답은 간단하다.while문을 이용하여도 되고 for문을 이용하여 저렇게 출력하는게 가능하다.답은 아래와 같다.

<source lang="c">

  1. include <stdio.h>

main() {

   int a,b;
       
       for(a=0;a<5;a++)
       {
           for(b=0;b<=a;b++)
               {
               printf("*");
               }
           printf("\n");
       }

} </source>

사실 여기까진 정말 기초정도에 불과하고 저기에서 조금 응용하여 삼각형/사각형/피라미드/파스칼의 삼각형 등등 바리에이션이 엄청 많다.

중급[편집]

마방진[편집]

오목[편집]

같이보기[편집]


  1. 기승전갓수
  2. 반대로 이야기하는 놈