시리즈:쉽게 배우는 프로그래밍 입문/C: 두 판 사이의 차이

269번째 줄: 269번째 줄:
</source>
</source>
자,그럼 res의 출력값은?<br>
자,그럼 res의 출력값은?<br>
'4.5요!'라고 말했다면 당신은 훌륭하게 낚이신겁니다.
'4.5요!'라고 말했다면 당신은 훌륭하게 낚이신거다.
여기서 res가 출력하는 값은 4입니다.
여기서 res가 출력하는 값은 4다.
소수형이 아닌 변수끼리 나누면 그 결과를 정수로 인식하도록 되어 있기 때문입니다. 결과를 받는 변수가 소수형이더라도요.
소수형이 아닌 변수끼리 나누면 그 결과를 정수로 인식하도록 되어 있기 때문이다. 결과를 받는 변수가 소수형이더라도.
그래서 우리는 강제 형변환이라는 방법을 쓸 수 있습니다.
그래서 우리는 강제 형변환이라는 방법을 쓸 수 있다.
<source lang="C">
<source lang="C">
int a = 9; int b = 2; double res; //앞의 두개의 변수는 정수형,나머지 하나는 .
int a = 9; int b = 2; double res; //앞의 두개의 변수는 정수형,나머지 하나는 .

2015년 5월 28일 (목) 22:34 판

문서의 내용이 너무 쉬워서 오늘부터 프로그래밍 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.

준비

C언어를 공부할 때는 준비물은 '이론상으론' 단 두 가지만 있으면 된다. 바로 코드를 작성할 텍스트 편집기와, 그 코드를 프로그램으로 만들어주는 컴파일러가 그것이다. 텍스트 편집기는 메모장(윈도), vi(멀티 플랫폼), gedit(리눅스), kate(리눅스), mousepad(리눅스) 등을 일컬으며, 컴파일러는 대표적으로 gcc(멀티 플랫폼)가 있다. 그러나 이 2가지 만으로 프로그래밍을 하는 것은 매우 불편하므로, 보통은 통합개발환경(IDE)을 사용한다. 이건 '텍스트 편집기와 컴파일러와 이것저것 유용한 기능이 들어 있는 프로그램'으로, 프로그래밍을 더욱 편하게 할 수 있게 해 준다. 또한 이것이 입문자에게도 쉬운 방법이기에, 대게 이 방법으로 많이 배운다.

IDE는 윈도우 7이상에서라면 Visual Studio Community를 다운로드 받아 설치하자. 리눅스에서는 이클립스를 이용하자. 다만 이클립스는 원래 JAVA 프로그래밍에 쓰이는 IDE라서 C언어에는 쓸 수 없는데, 이것을 C언어에 사용하기 위해서는 이클립스CDT라는 플러그인이 필요하다. 또한 앞서 언급한 컴파일러인 GCC의 설치도 필요하다. 즉 리눅스에서는 이클립스와 이클립스CDT와 GCC를 모두 설치해야 한다. 설치법은 매우 간단한데, 시냅틱 패키지 관리자를 열고 eclipse와 eclipse-cdt와 gcc를 검색해서 체크를 하고 적용을 눌러주기만 하면 설치된다. 시냅틱 패키지 관리자가 없다면, 터미널을 열고 1. sudo apt-get install gcc 2. sudo apt-get install eclipse 3. sudo apt-get install eclipse-cdt를 입력해주자. 이것만으로 설치가 끝난다.

OS X의 경우에는 Xcode를 다운 받으면 된다. 리눅스와 달리 초반에 터미널을 이용하는 것이 좀 귀찮다. Xcode를 다운 받은 후, 런치패드>>기타 응용프로그램>>터미널 선택 한 후에 xcode-select --install 을 입력한 후에 엔터를 누른다. 그 후에 뭔가 하라는 인스톨은 안하고 별 이상한 것들이 나오는데, 그냥 쭉 내려서 agree를 하면 그때부터 설치하겠냐는 창이 뜬다. 설치를 누르고 기다리고 있으면 사용이 가능해진다. 리눅스에서는 gcc로 컴파일을 하는데 OS X에서는 clang도 사용할 수 있다. 리눅스에서도 clang을 설치하면 사용할 수 있다.

프로젝트 만들기

비주얼 스튜디오

이클립스(CDT)

XCode

당연하지만 Hello, World!

#include <stdio.h>

int main(void)
{
printf("Hello, World!");
return 0;
}

단,중간에 void는 뺄 수 있으며,일반적으로 배울 때는 빼는 편이다. 엄밀히 말하면 차이가 없지는 않으나,초보자 입장에서는 사실상 차이가 없다.

컴파일하기

프로젝트 만들기

비주얼 스튜디오

이클립스(CDT)

XCode

변수

변수가 뭔가요?

변수명으로 사용할 수 없는 이름들?

자료형

정수형

소숫점 이하가 없는 정수. 깔끔하게 떨어지며, 연산도 간결하기 때문에 정수형 연산은 CPU에서 그렇게 연산 능력을 소모하지는 않는다. 각 자료형 앞에 unsigned 키워드를 붙이는 것으로 부호가 없는 형식을 쓸 수 있다. 그러나 unsigned는 비교 연산 등에서 익숙한 프로그래머가 아니면 틀리기 쉽기 때문에 이해가 완벽하지 않다면 줄이는 것이 좋다.

  • char
    character, 즉 문자 하나를 나타낼 수 있다는 뜻에서 온 자료형[1]이다. 길이는 1바이트, 즉 8비트로 가장 짧은 자료형이다. 부호가 있는 경우 -128부터 127까지, 부호가 없는 경우 0부터 255까지 나타낼 수 있다.
    short
    short integer. 짧은 정수형이란 뜻으로, 일반적인 컴파일러에서는 2바이트(16비트)로 처리된다. 부호가 있는 경우 -32768부터 32767까지, 부호가 없는 경우 0부터 65535까지 나타낼 수 있다.
    int
    integer. 정수형의 대표주자로, 가장 널리 쓰이는 자료형이다. 일반적인 컴파일러에서는 4바이트(32비트)[2]로 처리된다. 부호가 있는 경우 -2147483648부터 2147483647까지, 부호가 없는 경우 0부터 4294967297까지 나타낼 수 있다.
  • long
    long integer. 긴 정수형이란 뜻이다. long의 경우는 다소 복잡한데,
    1. 32비트 환경의 컴파일러에서는 일반적으로 int형과 동일하게 4바이트(32비트)로 할당된다.
    2. 64비트 환경의 컴파일러에서는 컴파일러에 따라 4바이트, 또는 8바이트(64비트)를 할당한다. 8바이트를 할당하는 경우 범위는 부호가 있는 경우 -9223372036854775808부터 9223372036854775807, 부호가 없는 경우 0부터 18446744073709551615까지 나타낼 수 있다.
실수형(부동소수점형)

실수형. 부동소수점이란 뜻은 부동(浮動), 즉 소숫점이 떠서 다닌단 뜻이다. 움직이지 않는단 뜻이 아니다! 일반적으로 실수를 나타낼때 쓰는데, 부동소수점이란 표현을 사용하는 이유는 표현 원리 자체가 지수 형태([가수]×2[지수]) 형태이기 때문이다. 제대로 구조를 뜯으면 꽤 복잡하기 때문에 CPU에도 부담이 많이 가고, 표현법상 정확도 한계가 있기 때문에 가능하면 줄이는게[3] 좋기는 하다.

  • float
    (single-precision) floating point. 단정도 부동소수점이란 뜻으로, 4바이트(32비트) 길이를 갖는다. 부호 비트로 1비트, 지수 비트로 8비트(-128 ~ 127), 가수 비트로 23비트(0 ~ 8388608)를 가진다.
    double
    double-precision floating point. 배정도 부동소수점이란 뜻으로, 단정도의 2배 길이, 즉 8바이트(64비트) 길이를 갖는다. 부호 비트로 1비트, 지수 비트로 11비트(-1024 ~ 1023), 가수 비트로 52비트(0 ~ 4503599627370496)를 가진다.
부호없는 자료형?

배열

printf가 뭐죠?

형식

Printf

printf(const char *format, ...);

서식 문자

포맷 스트링 의미 / 출력 방식
%c 문자
%d 부호있는 10진수
%u 부호없는 10진수
%o 부호있는 8진수
%x, %X 부호없는 16진수 (x는 소문자, X는 대문자)
%s 문자열
%p 포인터 주소
%% %

사용 예

소스
#include <stdio.h>
int main(void)
{
printf("%d\n\r",10);
printf("%o\n\r",10);
printf("%x\n\r",14);
printf("%X\n\r",14);
printf("%c\n\r",'a');
printf("%c\n\r",96);
printf("%s\n\r","hello world);
return 0;
}
결과

10

12

e

E

a

a

hello world

= 입력 형식

C언어로 계산을 하자 연산자

산술연산자

  • *(곱하기)
  • /(나누기)
  • +(더하기)
  • -(빼기)
  • %(나머지)

단항연산자

  • ++(1증가)
  • --(1감소)

논리연산자

  • ==(같다)
  • !=(다르다)
  • < <= > >=(대소비교)
  • && (그리고)
  • || (또는)
  • !(Not)

비트논리연산자

  • <<
  • >>
  • &
  • |

주의점

int a = 9; int b = 2; double res; //앞의 두개의 변수는 정수형,나머지 하나는 .
res = a/b;
printf("res = %f",res);

자,그럼 res의 출력값은?
'4.5요!'라고 말했다면 당신은 훌륭하게 낚이신거다. 여기서 res가 출력하는 값은 4다. 소수형이 아닌 변수끼리 나누면 그 결과를 정수로 인식하도록 되어 있기 때문이다. 결과를 받는 변수가 소수형이더라도. 그래서 우리는 강제 형변환이라는 방법을 쓸 수 있다.

int a = 9; int b = 2; double res; //앞의 두개의 변수는 정수형,나머지 하나는 .
res = (double) a/b;
printf("res = %f",res);

키워드

auto break case char const continue default do double else enum extern float for goto if inline int long register restrict return short signed sizeof static struct switch typedef union unsigned void volatile while _Bool _Complex _Imaginary

C언어에서 이미 용도가 정해져 있어 변수와 함수의 이름으로 사용할 수 없다. C99표준 기준이다.

조건문

조건문은 조건에 따라 두 가지 혹은 그 이상의 실행 경로를 실행할 수 있게 하는 것을 말한다. C언어에는 조건문으로 두 경로 중 하나를 선택하는 if-else문과 여러경로 중 하나를 선택하는 switch문이 있다.

if-else문

if (조건)
{
내용 1
}
else
{
내용 2
}

조건의 내용이 참이면 내용 1을, 거짓이면 내용 2를 실행한다.

else는 없어도 된다. 예를 들어,

if (조건)
{
내용 1
}

조건이 참이면 내용 1을 실행하고 거짓이면 실행하지 않고 넘어간다.

if (a >= 0)
{
    printf("%d", a);
}
else
{
    printf("%d", -1 * a);
}

만약 a가 0 이상이라면 그대로 출력하고 미만이라면 -1을 곱해서 출력하라는 의미이다. 또한, {}를 생략해도 된다.

if (a >= 0)
    printf("%d", a);
else
    printf("%d", -1 * a);

즉, 이렇게 써도 된다. 하지만 {}를 생략할 경우 코드 한 줄만 if-else문의 범위에 들어가진다.

if (a >= 0)
    printf("%d", a);
else
    a = -1 * a;
printf("%d", a);

이렇게 작성하면, 조건이 거짓일때 a = -1 * a;만을 실행하고 빠져나온 다음 printf("%d", a);를 실행한다. 조건이 참일때는 printf("%d", a);를 실행한 다음 빠져나온 다음 밑의 printf("%d", a);를 실행하게 된다. 이렇게 꼬일 수도 있으니 {}를 생략할 때에는 가독성을 위해 들여쓰기를 생활화하자.

if-else문을 중첩해서 사용할 수도 있다.

if (조건 1)
{
내용 1
}
else
{
    if (조건 2)
    {
    내용 2
    }
    else
    {
    내용 3
    }
}

이 경우, 조건 1이 참이면 내용 1을 실행한다. 거짓이면 안으로 들어가고, 조건 2가 참이면 내용 2를, 거짓이면 내용 3을 실행한다.

if (조건 1)
{
내용 1
}
else if (조건 2)
{
내용 2
}
else
{
내용 3
}

{}를 생략해서 이렇게 작성할 수도 있다.

switch문

반복문

반복문은 특정 부분을 반복해서 실행하는 것을 말한다.

C언어에는 while문, for문, do-while문이 있다.

while문

while (조건문)
{
문장
}

while문을 만나면 먼저 조건문을 검사한다. 조건문의 내용이 참이면 문장을 실행하고, 거짓이면 실행하지 않고 넘어간다. 문장의 내용을 모두 실행한 뒤에 다시 조건문을 검사한다. 계속 반복하다가 조건문이 거짓이 되면 빠져나온다.

for문

for (초기식; 조건식; 변환식)
{
문장
}

for문을 만나면 먼저 초기식을 실행한다. 조건식이 참이면 문장을 실행하고 거짓이면 실행하지 않고 넘어간다. 문장을 실행한 뒤, 변환식을 실행한 다음 조건식을 검사하고 참이면 실행, 거짓이면 넘어가기를 조건식이 거짓이 될 때까지 반복한다. 식들은 생략할 수 있지만 세미콜론은 생략할 수 없다.

for (초기식; ; 변환식)
{
문장
}

조건식을 생략하면 이런 모습이 된다. 모든 식을 다 비우는 경우는 자동으로 무한 루프가 된다.[4]

for ( ; ; )
{
// Infinite loops
}

BASIC 등 여타 언어의 for문보다 덜 직관적이라고 생각할 수 있는데, 오히려 논리적으로 간명하고 확장성이 뛰어난 면이 있다. 예를 들어 ‘1/1 + 1/2 + … + 1/N이 100을 넘는 최초의 N’과 같은 것을 찾을 수 있다.

머릿속에서 다음 코드와 같다고 생각해도 된다.

초기식
while (조건식)
{
문장
변환식
}

do-while문

do{
문장
}while (조건식);

while문과 유사하지만 조건식을 먼저 검사하지 않고 중괄호 안의 내용을 먼저 검사한 뒤에 조건식을 검사한다.그러나 최초 한번은 반드시 실행되는 만큼 그리 권장하지는 않는다.

break

현재 실행하고 있는 반복문을 빠져나온다. 반복문이 여러개 중첩되어 있으면 가장 가까운 반복문을 하나 빠져나온다.

while (true)
{
내용 1
while (true)
{
내용 2
break;
}
}

내용 1을 실행한 다음 while문 안으로 들어가 내용 2를 실행, 바로 빠져나와 다시 내용 1을 실행, 내용 2를 실행을 무한 반복한다.

함수

매개변수

Call By Value
Call By Reference

포인터 고비

동적할당

구조체

공용체

열거형

파일 입출력

헤더파일, 소스파일

고급 과정

전처리기

#define

#define은 특정한 문자(이름)를 찾아 다른 형태(토큰)로 바꾼다. 두 줄 이상으로 작성하고 싶을 때에는 '\' 를 이용하면 된다.

#define 이름 토큰

작성

#define Int_Max 2147483647
int max = Int_Max;

결과

int max = 2147483647;

함수와 비슷한 형태로 작성하면 함수같이 사용할 수도 있다.

#define 이름(인자) 토큰

작성

#define Sum(X, Y) X + Y
int sum = Sum(1, 2);

X나 Y가 아니라 다른 것을 사용해도 상관없다. 수도 상관없다.

결과

int sum = 1 + 2;
#undef

#define으로 정의된 매크로를 무효화한다.

작성

#define PI 3.141592
int pi = PI;
#undef PI
int pi = PI;

결과

int pi = 3.141592;
int pi = PI;

int pi = PI; 부분에서 오류를 뱉어낸다. #undef로 무효화된 매크로는 그 밑으로 더 이상 작동하지 않는다. 사용 위치에 주의할 필요가 있다.

#include

특정 파일의 내용을 가져와서 포함시킨다.

#include <stdio.h>
int main(void)
{
printf("Hello, World!");
return 0;
}

위 소스 코드에서, #include <stdio.h>의 위치에 stdio.h 헤더파일의 내용이 옮겨진다. printf함수는 stdio.h 헤더파일 내에 선언되어 있는 함수이다.

#include <헤더파일>
#include "헤더파일"

이렇게 두 가지 모양으로 쓸 수 있는데, <>는 컴파일러에 지정되어 있는 폴더에서 헤더파일을 찾고, ""는 소스 코드 파일이 있는 폴더에서 헤더파일을 찾는다.

#if
#elif
#else
#endif
#ifndef
#ifdef
#error
##
#pragma

컴파일러에게 명령을 전달한다.

#pragma 명령

컴파일러마다 다르니 자세한 것은 추가바람

각주

  1. 문자를 나타낸다고 했지만 사실은 정수형의 일종으로 그저 1바이트만큼의 숫자를 나타낼 수 있는 형식이다.
  2. 32비트 컴퓨터 시절부터 컴파일러가 4바이트(32비트)로 처리했으며, 이 전통은 호환성 때문에 64비트 컴퓨터까지 이어저, 64비트 컴퓨터에서 컴파일러를 돌리더라도 8바이트가 아니라 4바이트로 할당하게 된다.
  3. 하지만 나중에 그래픽스 분야에 들어가면 GPU를 활용하고, GPU는 부동소수점 연산에 특화되어 있기 때문에 싫어도 이걸 쓸 수 밖에 없게 된다.
  4. 보통 많이 쓰는 while(1)의 경우 컴파일러가 최적화해주지 않으면 1을 비교하면서 돌아버리기 때문에 비교 연산이 전혀 없이 순수하게 루프만 도는 for (;;)를 선호하는 사람들도 있다.

틀:쉽게 배우는 프로그래밍 입문