*******************************
*******TC를 설치 하기**********
*******************************

쓴 사람 : 조경민
쓴 날짜 : 1998/07/12


[0]. 쓰게된 이야기

C를 처음 공부하려는 사람은 처음에 무척 당황하게 된다.

그 이유는 책을 사서 봐도 책에 있는 예제를 어떻게 해야 실행을 해야

할지도 몰라 당황하게 되기 때문이다. ( 당황을 안한다면 대단한것임 )


지금 이 강좌는 다음과 같은 에제를 제대로 실행할수 있는 능력을

기르는 강좌이다. ( 예제를 보면 알겠지만 이 강좌의 수준이 얼마나

왕 초보인지 감이 잡 힐것이다. )


   #include <stdio.h>

   void main()
   {
        printf("Hello World!!!\n");
   }


만일 이 것을 TC에서 온전히 실행 할 수 있는 사람이라면 이 강좌를

읽을 필요가 없다. 그런 사람들은 읽지 말아주길 권한다.


[1]. TC를 설치 하자

먼저 TC/BC둘중 하나를 구해야 한다. ( 볼랜드사에서 만든 언어인 TC,

Turbo-C의 다음 버전 제품들이 BC,Bolland-C이다. 물론 TC2.0은 C만

할수 있는 제품이고(압축본으로 1장이면 된다.) 권하고 싶은 제품은

많이 쓰는 TC++3.1이다. ++이 붙은것은 C++을 지원하기 때문이다.

이것 역시 TC++3.1과 TC++3.1 For Windows 두가지로 나뉘는데 후자는

윈도우 개발 환경에서 돌리게 된다. 내가 권하고 싶은것은 단지 C를 공부

하려는 사람이라면 TC++3.1이다. 줄여서 TC3.1또는 TC라고 부르겠다.



TC를 C루트에다 설치하게 되면 다음과 같은 하위 디렉토리가 만들어지며

각 디렉토리에 파일들이 들어가게 된다.



C:\TC\
    |
    +- BIN             : 컴파일러(TCC.EXE)와 통합환경(TC.EXE)등이 있는 곳
    |                    중요한곳중 하나이며 TC를 가동하기위해 TC.EXE를 실행
    +- LIB             : 프로그램을 짜기위한 함수 묶음인 라이브러리가 있
    |                    는 곳이다. 중요한 곳
    +- INCLUDE         : 함수들의 이름만 모아놓은 라이브러리 헤더파일들이
    |                    있는 곳, 역시 중요한곳
    +- BGI             : 확장자가 bgi와 chr이 있는 곳으로 그래픽 프로그램짤때
    |                    각각 BGI는 그래픽디바이스를 CHR은 폰트를 정하는데 쓴다.
    +- CLASSLIB        : TC++에서 지원하는 새로운 라이브러리 모음이 있는 곳
    |                    새로 생긴 C++라이브러리 들이다.
    +- DOC             : 제품에 대한 설명및 여러 관련 문서가 있는 곳이다.

                         물론 영문이다.


    < TC 서브 디렉토리 환경 >

물론 깔끔한 프로그래밍 환경을 구축하기 위해 하나의 새로운 부 디렉토리를

만들수 있다. C:\TC\WORK 라는 디렉토리 처럼 마음대로 작업 디렉토리를 만들

면 된다.



[2]. 커맨드라인에서 컴파일 하기

BIN 디렉토리 안에 있는 여러 실행 프로그램중에 미리 알아 두면 편한 여러 가지

가 있다.


  TC.EXE              : 프로그래밍을 위한 에디트와 프로젝팅,및 컴파일을 할수
                        있도록 도와주는 IDE이다. (integrated  Development Editor)
                        소위 통합 개발 환경이라고 불린다.
  TCC.EXE             : 실제 TC의 컴파일러이다. 컴파일러는 TC.EXE에서 제작한
                        (물론 다른 에디터를 사용해도 무관) 소스 파일을 컴파일러
                        를 통하여 Object 파일로 바꾸는 일을 한다. .obj 생성하는일
  TLINK.EXE           : Object 파일을 실제 실행가능한 EXE나 COM으로 변환해주는
                        일을 하는 것으로 이런 작업을 링킹이라고 하며 이 작업을 하는
                        것을 링커(linker)라고 한다.
  TLIB.EXE            : .lib 라이브러리 파일을 생성또는 병합 관리 해주는 프로그램
  MAKE.EXE            : .mak라는 컴파일용 코드를 이용하여 여러 소스 코드를 컴파일
                        하는 프로그램  다시 컴파일을 할때 일일히 컴파일하지 않아도
                        되므로 유용하다.

  컴파일을 하는 것은 커맨드라인 (프롬프트상)에서 하는 것과 IDE의 도움을 받아서

  하는 경우로 나뉠수 있다. 커맨드 라인에서 컴파일을 하게 되면 TCC.EXE를 직접 실행

  시켜서 해야 한다. 아래는 간단한 그 예이다.

    소스 파일 hello.cpp  : 소스파일은 이미 만들어진 상태이다. IDE를 이용하든 다른
                           에디터를 사용하든 상관없다.

   #include <stdio.h>    
  
   void main()
   {
        printf("Hello World\n");
   }


   커맨드 라인에서 컴파일을 한다.
  
   C:\TC\BIN>TCC hello.cpp
   Turbo C++ Version 3.00 Copyright (c) 1992 Borland International
   hello.cpp:
   Turbo Link  Version 5.0 Copyright (c) 1992 Borland International

        Available memory 4069136

   만일 이렇게 했는데 안된다면 ( 라이브러리와 인클루드 디렉토리가 안맞으면 )

   C:\TC\BIN\>TCC -Lc:\tc\lib -Ic:\tc\include hello.cpp

   이렇게 하면 hello.cpp 이외에 hello.obj라는 것이 생기게되고 TCC.EXE가 이일을

   하게 된다. 그리고 곧바로 이 obj파일을 TCC.EXE는 TLINK를 불러 EXE로 실행가능

   한 파일로 바꾸어 주게 된다.

   결국에는 hello.cpp와 hello.obj, hello.exe가 생기게 된 것이다.

   obj만 만들고 싶으면 다음처럼 한다.

   C:\TC\BIN>TCC -c hello.cpp

   hello.obj 가 생성된다. 그리고 이 obj파일을 EXE로 만들고 싶으면

   C:\TC\BIN>TCC hello.obj
   Turbo C++ Version 3.00 Copyright (c) 1992 Borland International
   Turbo Link  Version 5.0 Copyright (c) 1992 Borland International

        Available memory 4069136

   곧바로 TCC는 TLINK를 불러서 EXE를 만들게 된다.
  
   만일 소스 파일이 여러개라면  

   C:\TC\BIN>TCC hello.cpp src2.cpp src3.cpp ....

   이렇게 한다.

   이때 주의할점은 exe로 생성은 하나가 되는데 hello.exe로 나온다는 것이다.

   그리고 나중에 일이겠지만 그래픽 라이브러리나 자기 라이브러리를 포함
  
   하려 할때에는

   C:\TC\BIN>TCC hello.cpp graphics.lib

   이렇게 하면 된다. 이렇게 되면 나중에 만들어지는 hello.exe는 필요시
  
   graphics.lib의 내용을 포함하게 된다.

   C:\TC\BIN>TCC hello.cpp graphics.lib mylib.lib

   물론 lib화일이 아닌 목적 화일인 obj도 포함이 가능하다.

   C:\TC\BIN>TCC hello.cpp src1.cpp

   hello.obj와 src1.obj 를 만들고 hello.exe를 만들게 된다.

   위의 과정을 불리해서 하면

   C:\TC\BIN>TCC -c src1.cpp   => src1.obj

   C:\TC\BIN>TCC hello.cpp src1.obj => hello.obj을 만들고 hello.exe는
                                       src1.obj을 포함한다.

   [3]. 라이브러리 화일을 만들어 보자

   간단하게 라이브러리를 만드는것을 알아보고 나중에 깊이 알아보자

   TLIB.EXE를 이용해서 .lib를 생성할수 있다. 먼저 lib가 되기 위한
  
   .obj파일이 있어야 한다. 또는 이미 만들어진 .lib도 가능하다.

   다음은 src1.obj을 mylib.lib로 만드는 것이다.

   C:\TC\BIN>TLIB mylib.lib +src1.obj

   만일 src3.obj까지 있다면      
  
   C:\TC\BIN>TLIB mylib.lib +src1.obj +src2.obj +src3.obj

      
   [4]. IDE에서 TC.EXE로 컴파일 하기

   물론 커맨드 라인에서 컴파일이 가능하나 조금 번거로워 보인다.

   따라서 우리는 이제부터는 TC.EXE를 실행 시켜서 여기서 에디트와
  
   프로젝팅 , 컴파일링을 모두 하게 된다. ( 이것이 통합 개발환경이

   만들어진 이유의 가장 큰 것이다. )

   먼저 TC.EXE를 실행시킨다.

   C:\TC\BIN>TC

   그러면 화면에 깔끔한 디자인의 TC 모양이 나오게 된다.

   다른것은 나중에 한다 치더라도 INCLUDE와 LIBRURY디렉토리는 꼭

   확인해 보아야 한다.

   먼저 F10을 눌러서 TC 주메뉴로 이동을 한다. 커서를 움직여서

   Options/Directories...    

   로 이동을 한다.

   여기에서 다음과 같이 바꾼다.

   Include Directories
     C:\TC\INCLUDE             : 인쿨르드할 디렉토리를 정한다.

   Library Directories
     C:\TC\LIB                 : 라이브러리 디렉토리를 정한다.

   Output Directory
     C:\TC\WORK                : 자신이 작업할 디렉토리를 정한다.

   Source Directories
                               : 안적어도 된다.

  
   여기까지 한다면 기본적인 준비는 끝이 난것이다.

   이제 실제 Hello World를 한번 찍어 보는 프로그램을 코딩할 시간이다.

   먼저 F10을 눌러서 주 메뉴를 간다.

   File/New

   를 선택해서 새파일을 연다 TC는 기본적으로 새파일의 디폴트 이름으로

   noname00.cpp를 쓴다. 만일 또 새파일을 해본다면 noname01.cpp를 열것이다.

   물론 이미 이파일이 존재한다면 열기가 되는 것이고 만일 이 파일이 없

   다면 새로 새로운 파일을 만든다.

   이제 noname00.cpp 안에서 다음을 기입해본다. 이런 기입하는 작업을

   코드한다. 코딩한다로 한다.

   ............ noname00.cpp ............  

   #include <stdio.h>

   void main()
   {
        printf("Hello World!!!\n");
   }
  
  
   [5]. 알아두면 좋은 기본적인 TC Editor 명령어


   <F5> 에디트 창이 넘 좁아 보이면 이것을  눌러서 확대/축소 할수 있다.

   <F6> 윈도우 창을 바꾸는 일을 한다.

   <Ctrl+F1> 도움을 원하는 문구에서 누르면 그에 해당하는 도움말이 뜬다.

        예>   printf("Hello World!!!\n");
              ~~~~~~
             커서를 줄처진 곳에서 컨트롤+F1을 누르면 printf에 대한 도움
             말이 뜬다.

   블럭 지정및 블럭 복사/지우기

   <Shift+커서> 기본적인 윈도우에서의 블럭 잡기와 동일한 일을 한다.
    
   TC2.0 사용자를 위해서 TC3.1에서는 그 당시의 블럭 잡기를 호한한다.

   <Ctrl+K 다음 B> 블럭 시작
   <Ctrl+K 다음 K> 블럭 끝
    
   <Ctrl+Y> 현재 한줄 삭제
   <Ctrl+K 다음 Y> 블럭 삭제
   <Ctrl+K 다음 V> 블럭의 내용을 현재 커서로 Move를 한다. 원래 블럭내용은 Cut
   <Ctrl+K 다음 C> 블럭의 내용을 현재 커서로 Copy 한다.

   <Shift+Del> 블럭 Cut
   <Shift+Ins> 블럭 Paste

   실행및 디버깅을 위한 명령어

   <Ctrl+F9> 실행을 한다.

   디버깅 관련
  
   <F7> 은 Main안을 한 줄 한줄 지나간다.

   <F8> 은 Step over라고 해서 함수를 만나면 그 함수로 까지 들어간다.

  
   [6] 실행해서 EXE를 만들어 보자

   자 이제 알아야 할 만한 명령어도 알았다. 이미 코드는 다 되었다.

   이제 이 파일의 이름을 바꾸자 F10을 눌러서 주메뉴에서

   File/Save As

   를 하여 이름을 새로 정해주고 저장을 하자

   이제 Ctrl+F9 을 하여 실행을 해보자

   화면에 다음과 같은 문장이 나오면 모든것이 완벽하게 끝난 것이다.

   Hello World!!!
  
   자. 이제 어떤가? TC3.1을 이용해서 간단하게 프로그램을 짜보았다.

   아직 printf나 main, include 같은 이상한 명령어는 접어 두고서라도

   자신감이 생길 것이다. C언어는 자신감으로 시작하는 것이다.
  
   이 자신감으로 함께 C언어의 깊은 곳까지 함께 공부하도록 하자

   ========================================================================

                                                         By 조경민
                                                         Dated 98/07/12
                                                             오후 05:44

  
  

안녕~ 경민이지 ^^; 온라인으로 쓰고 있으니까..
오타나 잘못된 점이 있어도 양해 바란다~~
그럼 시작~^^;

음... 이제 C를 가동시킬줄 아니까~
간단하게 C에서 쓸수 있는 자료형에 대해서 알아 보드라구..^^;
물론 이것두 완전히 처음 보는 사람을 위주로 하기 때문에
아주 쉽게 쓸꺼야~ 그럼...
변수라는건 수현이 말대루 임의의 값을 넣을수 있는 방과 같아
마치 수학에서 함수 y=f(x) 같은것에서 x 말이야.
x의 값이 변함에 때라서 f(x)의 값이 달라지잖아
어쨋든 이 x같이 임의로 변할수 있는 방을 C에서는 여러가지
크기로 미리 정의해 놨는데 대표적으로 다음같은것이 있어

. int형 : integer 즉 정수형이야
. char형: character 음 하나의 문자를 넣을수 있는 방

이런게 있어 .... 물론 float이나 double이라는 것으로해서
정수를 나타내기 힘든 소수점있는 실수를 표현하기 위해 만든것
두 있고. ( float은 부동소수점, double이 고정소수점이구 ...
그냥 지금은 그렇다구 듣구^^; 차차... 얘기 할께 )

먼저 젤 중요하고 젤 쉬운 int 먼저 보자구
뭐.. 정수형, 문자형, 실수형. 말은 이렇게 정했지만 실제로
이 구분은 아까 말했듯이 크기에 따라서 구분한것이거든
이 변수가 실제 메모리에 잡고 있는 크기 말이지 ....
바이트라는 크기를 단위로 하고 있어
( 바이트byte는 8개의 bit의 묶음으로 되어 있구 bit는 단지
  0과 1을 나타낼수 있는 가장 작은 단위 이지 )
바이트는 8개의 비트이니까 나타낼수 있는 크기가 2의 8승
즉 256으로 제한되어 있어
근데 지금 보고 있는 이 int형은 2 바이트 이거든
2 바이트는 2의 16승 까지 나타내지
그니까 65536가지의 수를 나타낼수 있어 즉 0~65535 까지지
그런데 int는 정수라구 했지? 정수는 마이너스도 표현할수
있어야 하잖아 그래서 그 2바이트의 공간중에 젤 왼편에
자리하는 하나의 비트를 부호 비트로 놓았어
---------------------------
| * |  |  |  |  |  |  |  |  .....
---------------------------
*표 있는데가 부호 비트거든.... 물론 이 막대는 16칸이지
보통 1일때를 -로 보고 0일때를 + 양수로 보고 있어
그니까 결국 나타낼수 있는 int형의 수 범위는
  int의 표현범위 :  -32,768 ~ 32,767
이게 되는 거고, 물론 니가 음수를 쓰기 싫으면 음수로
쓰기 위해 쓰는 부호비트를 무시하고 모두 양수로 쓸수
있어 int 앞에 unsinged 즉 '부호 없는' 을 붙여주면돼
이러면 아까 말한 0~65,535 까지 표현이 가능해

백번 말하면 무슨 소용~! 한번 예제를 보드라구 흐...

< int형 예제 >

#include <stdio.h>

void main()
{
      int a;
      a = 10;
      printf(" value = %d", a );
}

물론 컴파일은 TC.EXE안에서 코드를 써 놓고 Ctrl+F9 또는
F10눌러서 Build 에서 Build All을 하면 돼고,
커맨드라인에서는 tcc 예제이름.cpp
* 예제이름은 위 코딩 한 파일 이름 testint.cpp 이면
  tcc testint.cpp 이겠지?
이렇게 해서 실행해 보면 다음처럼 나와

  value = 10

어때? 간단하지? 아직 #include <stdio.h>를 모르는 사람은
printf라는 출력 함수를 쓰기 위해선 꼭 맨 위에다가 써야
한다고 생각하고, 글구 printf()는 출력 함수라는 정도만
알아둬
main이라는 건 프로그램의 본체 함수라는 것도 알아야 겠지?
컴퓨터는 이 프로그램을 실행하기 위해서 main이라는 함수를
찾아가서 main 함수 안의 내용 { , } 블럭 안의 내용의 줄을
한줄 한줄.. 이해해 가면서 실행을 하거든
main 함수 안의 첫줄 int a; 라고 썼지?
이건 미리 시작하기 전에 임의로 값을 넣을 방을 정하는 거야
호텔방 예약하는거랑 똑같아~
int형으로 a라는 방을 예약한거야 내가 언제든지 그곳에
값을 넣고 뺄수 있게 말야 물론 크기는 아까 말한데로
2바이트의 크기겠지? 고롬 고롬 ^_^
근데 재미있는 ( 중요한건 아냐 ) 사실은 이 호텔방을^^
예약하구선 들어가 보잖아? (= a방의 내용을 보면 )
그 전에 쓰던 사람이 방안을 어지럽히고 가서 지저분하다는
거야... 니가 그니까 다 정리해야 겠지?
그래서 변수를 선언하면 ( = 호텔방을 예약받으면 )
변수를 초기화 해주는것이 중요해 ( = 호텔방 정리하기 )
그래서 바로 아랫줄에서 a = 10; 이라고 방을 정리한거야
참 끝에 ; 이 다 달라 붙었지? C에서는 모든 명령어의 한
단위는 ;로 끝나게 되어 있어
;을 붙이는것은 정말 중요한 거니까 숙지해야해
땀을 흘려야 한다는 소리지 ^_^;  <-- 여기두 붙잖아~^^;;
그리곤 printf (" value = %d ", a ); 라는 것으로
화면에 출력을 하게 되는데, 아직 prinf는 모르니까 대충
하자구 ^^; 역시 하나의 명령이니까 printf() 끝에 ;이 붙고
printf는 " " 사이의 문장을 출력하는 역활을 한다고 보면돼
그니까 value = %d 인데.. %d는 쉼표 다음의 정수 변수의
값을 받아 와서 적어주는 일을 해 ( 어렵지? ^^; )
%d 에서 d 는 decimal 이라구 해서 십진수 정수를 의미해 ^_^

와 .. 많이두 했다 ? 그치? 오늘은 이정도로 하자구 ^^;
별로 중요한 얘기는 없었는데 int형 쓰는 법에 대해선
적어도 잘 알아야 될꺼야 쓸데가 많을 테니까 ^_^
그럼 오늘도 열심히 C 공부를 하길 바라구 질문 있으면
언제나 무러봐~ ( 안 아프게 ^^; )
참 다음 번에는 char형을 쓰는 법에 대해서 또 보자구 ^_^
==========================================================
                                        Written By NeRi
                                        1998/07/14
                                        가치하는 C 스터디


역시 온라인으로 씁니다.
그럼 시작하죠

저번에는 int형에 대해서 알아 보았습니다.
이번에는 그 다음으로 char형에 대해서 알아고보
간단하게 float과 double형에 대해서 알아보도록하죠

먼저 char형은 하나의 문자를 넣을 공간이 필요할때 습니다.
다음처럼 하면 a라는 문자가 변수ch에 들어가게 되죠

char ch = 'a';

자 그럼 보죠. 이미 int형 선언과 쓰는 법을 봤으니까 기본적인
자료형 선언및 초기화에대해서 알았다고 봅니다.
먼저 char ch를 함으로 써 선언을 한것이고 ch = 'a'를 하여
초기화를 한것입니다. C에선 선언및 초기화를 한번에 할수 있죠
따라서 위의 한 문장은 아래의 두 문장과 완전히 같습니다.

char ch;
ch = 'a';

'a'라는 것이 좀 이상해 보이죠?
안이상하다면 이 강좌를 읽을 수준을 넘어섰다는 거죠 ^_^
자... 처음부터 차근 차근 생각해 봅시다. 저번 강좌에서
int형, char형 , float,double형이든 이렇게 나눈것은
무엇을 기준으로 했다고 했나요?

기억이 난다면 아마도 그 자료형의 크기에 따라서 구분했다고
답할것입니다.^^ 그렇습니다. int형은 저번 시간에 말했듯이
2Byte 크기를 갖는 자료형이었습니다. 그럼 char형은?
1Byte 랍니다.

int형 자료의 크기 = 2Byte
char형 자료의 크기 = 1Byte

자.. 그런데 컴퓨터는 원래 0,1밖에 이해할줄 모릅니다.
a라는 문자를 이해할수가 없는거죠 원래부터...
그럼.. 임의로 어떤 수치에 대해서 a라고 정의하면 돼겠죠?
그럼 그 임의의 수에 대해선 컴퓨터가 a라고 보겠죠
그런생각으로 나온것이 ASCII라는 것입니다. 아스키 코드표이죠
^_^
ASCII :정보 교환용 미국 표준 부호
(American Standard Code for Information Interchange)
이 ASCII코드는 모두 0에서 255까지 256가지가 있습니다.
그럼 a는 실제로 아스키값으로 뭐가 될까요?
97이라는 코드값으로 정해져 있답니다. 그리고 A대문자 는 65
이고요 그러니까 아스키코드상에 a-z는 65~영문자만큼^^;
( 죄송.. 온라인이라.. a는 97이죠 ^^ 97~영문자만큼^^; )
A-Z는 65~영문자만큼^^: 이겠네요....
그리고 C에선 ''사이에 하나의 문자를 놓으면 문자를 의미하고
아스키값으로 변한다고 보면 돼요
그럼 'a'는 97 이라는 값이 돼겠네요
실제로 그런가 한번 보죠?

#include <stdio.h>

void main()
{
      char ch = 'a';
      printf("%c",ch);
      printf("\n %d",ch);
}

자 실행을 하면 다음과 같이 나옵니다.
a
97

음 역시 printf안에 있는 \n과 %d,%c가 걸리네요
먼저 설명하죠 %c를 쓰면 쉼표 다음 변수의 값을 문자로 찍으라
라는 것이고요. %d는 저번에 보았듯이 정수를 찍으라라는 것입니다.
사실 char형은 1Byte가 들어갈수 있는 방이기 때문에
표현 가능한 수치는 0에서 255까지 256개까지 입니다.
씨에서는 char가 문자하나 표현가능하다고 해서 이를 문자다
라고 보면 큰코다치죠 ^^: 강조했듯이 C에서 자료형 구분은
쓰이는 의미보다는 자리잡는 메모리 크기에 중점을 두었습니다.
즉 따지고 보면 char인 ch에 들어간 'a'라는 놈도 내용을 본다면
숫자인 97이 들어간거죠
컴퓨터에겐 문자란것이 없으니깐요 ^_^
참 이번 기회에 printf를 숙지해 보죠!
간단하게 ^_^;

예제로 훌렁 넘기는 printf() 문법
--------------------------------

printf("Hello");     // Hello를 찍습니다.
pritnf("%d",10);     // %d는 쉼표다음의 10을 정수로써 찍습니다.
printf("%d",a );     // %d에 a라는 변수에 있는 값을 정수로 찍음
printf("내 나이는 %d랍니다.",a);  // 만일 int a = 21; 있다면
  =>  내 나이는 21랍니다.

printf("%c",97);    // %c는 쉼표 다음 값을 아스키문자로 보고
                     // 그에 상응하는 문자를 찍습니다.
=>  a               // ascii값 97은 'a' 를 의미합니다.

printf("%c",'a');   // %c자리에 'a'즉 ascii 97값을 문자로 찍습니다.
=>  a

printf("%c",a);     // a변수에 있는 값을 %c자리에 문자로써 찍음
                     // 만일 char a = 97; 이었다면
                     // ascii값 97은 'a'의미하므로
=>  a               // a가 출력됩니다.

printf("한줄 \n 두줄");  // \n 은 printf안에서 다음줄로 커서를
                          // 내립니다.
=> 한줄
    두줄

printf("내 나이 %d 나의 별명은 %c",21,'A');
// %플래그가 많으면 처음 %d는 바로 다음 쉼표의 값을 취하고
// 다음 플래그 %c는 그 다음 쉼표의 값을 취합니다.
=> 내 나이 21 나의 별명은 A


이것으로 printf에 대한 얘기는 줄이죠.. 나중에도 시간이 있으니까^^
자 그럼.. char에 대해 어느정도 감이 잡힙니까?
이 정도 되면 의문이 생기는 사람들이 있습니다.
<의문> 그럼 문자열에 대해선 어떻개 하죠?

좋은 지적입니다. ^_^; ( 땀 찔끔~)
간단히 말해서 C언어에서는 문자열을 기록/읽기위한 자료형은
지원하지 않습니다. ( 베이직을 하셨던 분은 A$ = 'abc'가떠오르겠네요)
놀랐습니까? ^_^;
그러나 문자열이라는 것도 결국 보면 문자들의 일련의 집합 즉
문자 배열이죠... 따라서 C에서는 특별히 따로 문자열 자료형을 두지
않고 문자배열로써 처리를 하게 됩니다. 불행하게도 이번 강좌는
배열까지 나가지 않는 관계로 다음 코드만 보여 줌으로써 마음을
달래줍니다.^^:

#include <stdio,h>

void main()
{
     char str[12] = "Hello Wordl!";
     printf("%s",str);
}

출력은
Hello World!

적어도 C에서도 문자열을 다룰수 있다고 확신은 할수 있게 되었
습니다. ^_^
[]은 배열에 관련된 키워드이랍니다. printf안의 %s 플래그는
문자열을 출력하는 플래그이고요 물론 지금이것을 알필요는
전혀 없겠죠? ^_^ 그냥 그렇구나 하고 넘어가면 그만입니다.

^^; 이젠 float형이나 double형에대해 간단히 보죠
float형은 부동 소수점이라고 해서 말그대로 소수점 표현하는
. 점이 떠다닙니다(?) 크기는 32bits 즉 4바이트를 차지합니다.
물론 맨 앞의 비트는 부호비트로 쓰기 때문에
-3.4 * (10^38) to 3.4 * (10^+38)
의 크기를 갖죠 .. ^^; ( 어렵당 )
그리고 double은 고정 소수점이라고해서 소수점위치가 변하지
않습니다. 그리고 크기는 64bit 즉 8바이트를 갖습니다.
따라서 ( 물론 앞 비트는 부호비트 입니다. ) 부호비트를 뺀
비트의 조합으로 나타낼수 있는 수의 표현 범위는
-1.7 * (10^308) to 1.7 * (10^308)
가 되죠..
넘 어렵죠?
그냥 float이나 double이나 소수점 표현하는데 쓴다고 생각합
시다. 그리고 double은 float보다 좀더 큰 수를 표현 할수
있다고요
물론 앞 비트를 부호비트로 안 쓴다면 더 큰 수를 나타낼수
있습니다. ( 물론 양수만가능하죠 )
그럴때는 unsinged라는 부호없는 이라는 키워드를 붙이면 됩니다.
unsigned float ft = 2398.23
이렇게 쓸수 있죠
signed라는 키워드도 있는데 부호있는이라는 것입니다.
그러나 이것은 생각할 필요 없죠 부호결정 키워드인 unsinged/signed
같은 것을 안 쓰고 생략한다면 C는 signed로 default( 기본사양)로
보고 하니깐요
int a; 나 char ch; ... double dl;  float ft;
위의 것들은 모두들 signed입니다.
참 아까 빠트린것이 있군요 char형도 결국 숫자가 들어간다고
했습니다. 그 숫자의 범위는 역시 signed로 했을때는 앞비트가
부호 비트이기 때문에 -128 ~ 127 까지 이죠

와 오늘도 많이 했군요!! 우리는 대단한 사람들입니다 ^_^
자 다음번에는 변수에 대해 좀더 생각해 보는 시간을 갖죠
서로 다른 자료형간의 자료 이동이 가능할까 하는 것
또는 변수 선언시 붙을 수 있는 또 다른 키워드 들인
static/auto 라는 것도 보죠 ^_^ ( 어려워 질꺼 같은데 ^^; )
되도록이면 쉽게 강좌 하도록 노력하겠습니다.
다음번에는 온라인으로 안할께요~ 기대하세요~
^_^
그럼 존 하루되세요~
==================================================================
                                          Written By Jo.K.M
                                          1998/07/014


  강좌 : C 진짜 첨인데 #3 자료형
_.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-.

안녕하세요 neri입니다. 이번에는 세번째 시간이군요 저번에 TC를 설치하는법과

int형과 char형에 대해서 배웠습니다. 이번에는 이런 자료형에 대해서 어떻게

쓰는가에 대해서 알아 보도록 하겠습니다.

물론 이 강좌는 C를 첨 시작하는 사람을 위주로 했기 때문에 깊이 파고 들라고

어려운 말을 하지는 안습니다. 어려운말을 듣고 싶으신분은 다른 더 좋은 강좌를

찾아 주세요 ^_^

자료형이라는 것은 크기로 구분이 된 공간이라고 했습니다. 이곳에다가 자신이

마음대로 값을 넣을 수 있는데요.  이 자료형을 선언 하는 곳에 따라서 그 변수의

성격이 달라 지게 됩니다.

<< 변수를 선언하는 곳에 따라서 >

#include <stdio.h>

int  grobal;

void main()
{
      int local;
      local = 3;
      grobal = 1;

      printf("%d %d",grobal,local);
}

출력물
1 3

자.... 출력물이 왜 이렇게 나오는가에 대해선 코드를 잘 보시면 알수 있을거

같은데요 어때요? 가능한가요? ( 이 강좌는 엄청 수준이 낮기 때문에 그래도

집고 넘어갑니다. )

*코딩 : 확장자가 C, CPP인 텍스트 파일에 명령어등을 기입하는 것을 Coding

         한다.(코딩) 라고 하고 이렇게 된 것을 Code 라고 합니다. 특히 프로

         그램 소스파일의 내용을 소스 코드라구 합니다. (Source Code)

  먼저 이 소스코드를 다 코딩한다음에 TC에서 Ctrl+F9 즉 실행을 하게 되면

  TC의 컴파일 러는 소스 코드를 분석하고 obj파일 즉 목적화일이라는 것을

  만들게 됩니다.

   그리고 곧바로 이 목적화일을 바탕으로 tlink.exe는 EXE형식의 실행 가능한

  파일을 만들어 줍니다. 이때 TLINK로 실행 가능한 파일을 만드는 과정을 링크

  한다(LINK)라고 하고 이런 링크를 해주는 프로그램을 링커(Linker)라고 합니다.

  이제 본래 얘기를 하죠 ^^

  어쨋든 실행을 하게되면 소스 코드를 컴파일러가 분석을하게 됩니다. 물론 이

  소스코드의 맨 위에서 부터 아래까지 쭉 분석을 하게 되지요.

  그런데 #define같은것으로 C에서 미리 정의해둔 값이나 라벨같은것의 주소(위치)

  등을 미리 알아보고 실제 코드의 분석을 하게 됩니다. 즉 전자의 것을 pass 1

  이라고 하고 후자의 실제 코드 분석을 pass 2라고 보면 됩니다.

  실제 컴파일 하는 동안 뜨는 박스에 잘 보면 2 pass 라는 것을 보시게 될껍니다.

   어쨋든, 프로그램이 실행 되기 위해선 대충 다음과 같은 과정을 거칩니다.

        먼저 전역 부분에 설정되 있는것을 분석한다.

        main 함수의 내용을 분석한다.

   자 전역 부분이라는 말은 { } 이 블럭 밖았에 존재하는 것입니다.

#include <stdio.h>

int  grobal;

  이 부분이 전역에 해당합니다. #include <> 라는 것은 헤더파일이라는 것을

  포함 하기위해서 쓰는 것인데 TC에서는 기본적으로 많은 헤더 파일이라는 것을

제공하고 있습니다.

C:\TC\INCLUDE 에 가서 보면 확장자가 H 인 파일들이 많은데 그중 stdio.h 라는

것을 열어 보면 많은 내용이 있을 겁니다. 그리고 거기서 잘 찾아 보면

int     _Cdecl printf(const char *__format, ...);

즉, printf라는 함수를 쓰기 위해선 이 함수의 형태(원형)가 정의된 stdio.h을

포함해야 한다는 거지요... 물론 저기 위의 있는 _Cdecl 이나 .const *같은것은

생각 하지 말구요

자 그런데 문제가 있죠?? 어떤 함수가 어디에 포함되는 것인지 어떻게 알아!!

라는 것!

만일 clrscr()함수가  어떤 헤더파일을 포함해야 하는지 모를때는

clrscr() 에 커서를 놓고 Ctrl+F1을 누르면 #include <conio.h> 가 보일껏입니다.

그럼 아하.. 그럼 전역 부에다가

#include <conio.h>

를 쓰면 되겠구나... 할수 있죠. clrscr() 이 뭐냐구요? Clear Screen 즉 화면을

다시 깨끗히 지우는 거지요 ^_^

#include <conio.h>

void main()
{
      clrscr();
}

이렇게 쓰면 되고요 ^_^

괜히 얘기가많이 길어 지는군요 어쨋든 전역 부분의 #include 얘기는 이것으로

마치고요

어떤 사람은 #include <????> 이것과 #include "????"의 차이점을 자꾸 캐묻는

데요 ( 사실 캐묻는 사람 없습니다. ;_; 누가 물어주~~ 크크크)

그냥 차이점은 없습니다. 단지 <> 안에 넣는다면 시스템 헤더 파일을 포함한다는

얘기이고요 기본적으로 헤더파일이 존재하는 곳을 정해놓은 INCLUDE 부분에서

찾아 보죠 그리고 ""로 해주면 사용자 헤더 파일 포함이라고 해서 사용자가 임의로

만든 헤더 파일을 포함한다는 얘기가 되네요 물론 이 것은 그 파일을 찾을때 현재

디렉토리를 기준으로 합니다 그럼 다른 얘기로 ^^;

그럼 이제

#include <stdio.h>

int  grobal;     <----- 이부분

물론 int형에 대해서 나오는 군요 2바이트 int형으로 grobal이라는 변수를

만들었군요 물론 더이상 할말은 없습니다. 그러나 이 변수가 생긴 부분이

전역 부분이기 때문에 이 변수를 부를때는 전역 int로 grobal 이라는 변수를 만

들었다 라고 말합니다. 전역이라는 특성상 이 변수는 이 파일 어느 곳에서나

참조가 가능합니다.

자 다음으로 넘어가서

void main()
{
      int local;
      local = 3;
      grobal = 1;

      printf("%d %d",grobal,local);
}

이런 부분이 있네요 void main() 도 물론 C에선 함수입니다. 즉 { }을 싸고 잇는

무시기()
{
   :
}

이런 식으로 되어 있으면 열에 열이면 다 함수입니다.

C에서 함수라는 것은 명령문 문장들이 나열되어 있는 명령 덩어리 입니다.

만일 a()라는 함수에서 b()라는 함수를 호출 한다면 b()함수를 부른 곳에서

실행이 b()의 명령문들로 넘어갑니다. b()의 명령문들을 다 실행한다음 다시

a()의 b()함수 호출 한 부분 바로 아래로 와서 실행을 합니다.

뭔 말인지 모르겠죠? 나두 모르겠습니다. ^_^

그림으로 보면 쉽죠

void a()                              void b()
{                              ----> {
      :                        |           :
     b();    -- b()함수호출 ---          명령문을 실행합니다.
      :     <------------------|           :
}                              ----- }

어때요.. 좀 낮죠..? 그래도 힘들죠^^; 안 힘들면 참 머리가 좋은 거예요

그런데 이런 함수들중에 C에서 이미 정해놓은 함수 가 있어요 main()이라는

함수인데 C는 어떤 프로그램에서든지 main()이라는 함수를 호출함으로써

프로그램 시작을 합니다. ( 물론 전역에 대한 처리는 끝난 상태이고요, 전역

int로 grobal이 잡혔다는 사실을 잊지 말아요 )

이제 main() 함수를 한줄 한줄 분석하게 됩니다.

int local; 이라는 것이 보이죠? C에서는 함수안에서 만들어진 변수를 가지고

지역 변수 (Local Valuable) 라고 부릅니다. 즉 이건 지역 int 형 변수인 local이

군요 그리고 전역 변수와 다른점은 전역 변수는 함수 안이든 밖이든 참조가

가능한데 비해 지역변수는 단지 지역변수가 선언된 그 함수 안에서만 효력을

발휘 한다는 것입니다. 결국 그 함수의 끝이 되면 지역변수도 자연 사라지게 되죠...

반대로 전역변수는 프로그램 전역에 위치 하기 때문에 프로그램이 끝날때 사라지게

되겠군요 ^_^


void main()
{
      int local;
      local = 3;
      grobal = 1;

      printf("%d %d",grobal,local);
}

자 main()함수의 지역변수 local은 main()함수 안에서만 유효합니다. 그리고

local =3 이라는 명령문장 또한 함수 안에서 했기 때문에 가능하죠 그리고

아래의 grobal이라는 변수의 값을 바꾸는 일 또한 가능하죠? 왜냐면 grobal은

전역 변수이기 때문이죠 그리고 printf문을 써서 각각 grobal과 local을 찍습니다.

결과는 역시 예상대로

3 1 이 나오는 군요 ^_^

강좌가 넘 길다고 생각 안되나요? 넘 긴거 같죠 ? 그럼 다음번에 하죠 ^_^

다음번에는

auto/static 변수앞에 붙는 keyword에 대해서 알아 보고 함수를 쓰는 법과

함수를 만드는 법을 알아보죠 neri가...^^:
===========================================================================
                                                               경민이 neri
                                                               98/07/17






NeRi's C 진짜 첨인데 4번째  자료형
_.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-.

안녕하세요 NeRi입니다. 이번에는 저번에 말씀 드린데로 auto와 static 키워

드에 대해서 이야기 해보도록 하겠습니다. 그냥 쉽게 집고 넘어가면 되죠^^

먼저 auto에 대해서 알아 보도록 하죠


auto 키워드
------------

자 먼저 그러기 위해서는 저번에 조금 말씀드린 함수 내에서 변수를 선언하는

지역 변수에 대해서 또 알아 봐야 겠군요

void func_a()
{
     int local;
     local = local + 1;    
}

자 말씀 드린대로 local은 함수 내에 선언이 된 int자료형 변수이기 떄문에

int형 지역변수입니다. 지역 변수이기 때문에 함수가 호출될 당시 메모리에

local이라는 이름이 붙은 방을 할당 받고 ( int이기 때문에 2 byte입니다. )

이 함수가 끝이 나서 이 함수를 부른 코드로 넘어가게 될때, 이 local이라는

변수는 지역 변수이기 때문에 메모리 할당을 해제 하고 사라지게 됩니다.

즉, 변수가 생겼다가 자동으로 지워지게 되는 것이죠.

물론 위의 함수의 int형 local이라는 변수의 선언시 빠진것이 있습니다.

실제로는 다음과 같은 코드입니다.

void func_a()
{
     auto int local;
     local = local + 1;    
}

즉 int형 지역변수 local은 auto라는 자료형 선언 성격에 관련된 키워드로

이 지역변수는 생성후 함수의 끝이 되면 자동으로 지워진다는 것을 의미합니다.

그러나 이제 이 auto라는 것은 잊으십시요 ^_^;

쓸일이 없기 때문입니다. 안 쓰게 되면 디폴트로 auto 변수가 되기 때문입니다.

그럼 다음 static이라는 것을 알아 보죠 ^_^


static 키워드
------------------

다음 함수를 한번 보도록 합시다.

void func_b()
{
     static int local;
     local = local + 1;    
}

이번에는 func_b()함수에 선언된 int형 지역변수인 local에 static이라는 것

이 붙었군요 static은 정적이라는 의미를 갖고 있습니다.

그니까 한번 선언되면 굳은것 처럼 함수가 끝이 나도 아직 살아 있다는 것이죠

( 메모리 할당된것이 해제가 되지 않는다는 말입니다. )

잘 모르시겠죠? ( 물론 알아 들으셨다면 이미 실력이 있으시다는 것과 함께

읽을 필요가 없다는 말씀을 드리고 싶습니다. )

다음 예제를 보면 그래도 이해하기 쉬울겁니다.


auto vs static
---------------------------

#include <stdio.h>

void func_a()
{
     int local = 0;
     local++;            
     printf("func_a() local : %d \n",local);
}


void func_b()
{
     static int local = 0;
     local++;            
     printf("func_b() local : %d \n",local);
}

void main()
{
     /* 먼저 func_a()함수를 세번 호출하겠습니다. */
     func_a();
     func_a();
     func_a();

     // 다음은 func_b() 함수를 세번 호출입니다.
     func_b();
     func_b();
     func_b();
}

[Result Screen]

func_a() local : 1
func_a() local : 1
func_a() local : 1
func_b() local : 1
func_b() local : 2
func_b() local : 3

으음.. 이해하기 쉽나요? 먼저 auto로 된 func_a()함수를 좀 보죠

int local = 0;

아무것도 안 써있기때문에 auto 변수이죠?

그러니까 func_a()함수가 끝나게 되면 local이라는 변수는 사라지게

됩니다. 그리고 다시 func_a()이 호출되면 다시 local이라는 auto

변수가 생성이 되고 다시 0으로 초기화 됩니다.

물론 printf로 찍기 전에 auto변수 local은 ++되어서 1로 증가가

되고요...

아참 ++ 이얘기를 해야 겠네요 ^^;

말그대로 플러스 하라는 말입니다. local+; 하면 될꺼 같지만^^

더하기와 구분하기 위해서 ++로 했다고 보면 되겠습니다.

근데 왜 이번에는 local = local + 1; 대신 local++;로 했냐고요?

베이직 처럼 해야지 보기도 좋다고요?? 아하 맞아요

그렇지만 이제 C를 하시게 되었으니 ++로 가급적 해주세요

로마로 가면 로마법을 따라야 로마시민이 되기 쉽죠 ^_^

효율성에서 ++이 더 효율적이라는 말이죠 나중에 컴파일되어서

기계어로 분석될때 코드량도 적고 더 빠르답니다.

단지 ++은 어셈에서 INC local 을 한거와 마찬가지로 보시면 됩니다.

그러나 local = local + 1; 은... 푸푸... ^^; 그냥 써보죠..

이해 할필요는 없어요 어셈 지식이 없으면 마시고요 어차피 요점은

단지 하나의 수치를 올리시려면 local++;을 하시는 것이 좋다는 거죠

안봐도 되는 대응되는 어셈 코드

<더하기의 어셈 소스 차이>

   i = i + 1       --- C 코드
   mov ax,1        -,
   add ax,1         |- 대응되는 어셈 코드
   mov 1,ax        -'

   i += 1          --- C 코드
   add i,1         --- 대응 어셈코드

   i++             --- C 코드
   inc i           --- 어셈 코드

보면 알겠지만 코드량도 많이 줄죠? (add 보다는 inc가 더 빠릅니다. )


자 이번에는 static 코드를 보죠  까먹었죠? 예제? 다음을 봐요^^

void func_b()
{
     static int local = 0;
     local++;            
     printf("func_b() local : %d \n",local);
}

   :
     func_b();
     func_b();
     func_b();
   :

결과는요

func_b() local : 1
func_b() local : 2
func_b() local : 3

자.. static은 함수에서 한번 선언되면 굳은것 처럼 함수가 끝나도 살아

있다고 했죠? 그럼 처음 한번 func_b()를 호출하고 호출이 끝나더라도

static int local은 아직 사라지지 않습니다. 물론 한번 호출 되고는

1이 찍히개 되죠? 다음 func_b()가 호출되게되면 좀 당황스럽죠?

첫 줄이 또 static int local = 0; 이니까요. 다시 메모리를 잡으라는

말인가.. 아니면 있으니 다시 초기화만 하라는것인가.

하지만 걱정할필요가 없습니다. 그냥 무시되니까요 한번 정적으로 메모

리에 잡혔기 때문입니다. 그럼 아직 메모리에 static int local은 1이라

는 값으로 있습니다. local++을 통해 2로 값이 증가되고 다시 찍히죠

그래서 2가 찍히죠^_^ 그 다음 호출때도 마찬기지로 static int local

은 아직 살아 있어서 다시 증가가 되죠 ^_^

자 이제 main() 함수의 끝으로 프로그램이 끝을 내게 됩니다.

참고로 static으로 선언되었다고 프로그램이 끝을 맺어도 메모리 할당이

해제 안된다면 큰일 나겠죠? 물론 메모리 반환이 일어나게 됩니다.^_^

자. 다음 번에는 register라는 것과 volatile 라는 것을 조금 보죠 ^^

register 키워드는 쓸만하고 volatile는 그냥 교양 삼아서 보면 되요

그럼 이만 마치며

-------------------------------------------------------------------

                                                   By NeRi
                                                   조경민
                                                   1998/07/30






    NeRi's  C 진짜 첨인데 #5   자료형
_.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-.


안녕하세요 이번에는 register와 volatile 필요는 없지만 보죠 ^^:

별로 길어질것 같지 않군요 ^_^

그니까 short형에 대해서도 간단히 보고요 ^^


register

먼저 register라는 키워드를 알기위해서는 하드웨어적인 상식이

조금 필요합니다....

CPU 아시죠? 중앙 처리장치 (맞나??^^ ) 그 칲에는 래지스터라는

것들이 붙어 있습니다. 이 래지스터들은 쓰임에 따라 AX,BX,CX,DX

라는 것들과 함께 IP ... ( 죄송 갑자기 생각이 안나네 ^^; )

초보 강좌니까 이해들 ^^; 그리고 이런 래지스터들의 원초적인

기본 역활을 정보의 저장입니다. AX , BX , CX, DX, IP 같은 것들

은 모두 16bit 즉 2바이트로 되어 있습니다. 즉 2바이트 정보를

저장하기 좋죠 ( 물론 AX같이 뒤에 X로 붙은 래지스터는 상위

1바이트를 AH 즉, A래지스터 High 상위, 하위 1바이트를 A래지스터

의 Low 라고 AL이라고 부릅니다. BX역시 BH,BL로 이루어 졌습니다.

그냥 넘어갑시당 ^^; )

흐.... 이런 래지스터들은 CPU에 붙어

있는 것들이라서 CPU가 처리를 위해서 래지스터들을 부르는 것은

빠르겠죠? 메모리에서 부르는 것보다 말입니다.  

보통 int a = 0; 이라고 하면 메모리에다가 할당을 하는 것이고

컴퓨터(CPU 칲이)가 이 메모리를 접근하려고 하면 시간이 좀 걸립

니다.. 그러나 CPU가 래지스터를 부를려고 한다면 빠르죠

즉 다음 처럼 써있다면요

register int a = 0;

이렇게 하면 a라는 변수는 가능하다면 래지스터에대가 변수를 저장

하게 되고 이렇게 래지스터에 저장/참조 가 가능해 지게 되면

당연히 속도가 빠르게 되죠

물론 int형같이 래지스터크기에 맞는것만이 가능합니다.

래지스터는 2바이트이고 int도 다행이 2바이트니까요

( 물론 32비트프로그래밍 때는 EAX가 4바이트고 int도 4바이트구요 )

그럼 두말 잔소리 없이 필요한 곳만 짚어 넘어갑시다!

register int i ;

for( i = 0; i < 10 ; i++ )
{
   printf("%d \n",i);
}

이렇게 해주면 0부터 9까지 찍는데요 래지스터 키워드를 씀으로써

조금의 속도 향상을 보실수 있습니다. ^_^ ( 참. for 문을......

안했나 봐요? -_-; 윽.. 이런 일이 ^^; 다음 번에 for 문과

while if 같은것을 합시다 )

단지 주의 사항은 아무리 여러 변수를 register로 키워드를 붙여도

다 래지스터 변수가되는건 아닙니다. 래지스터는 한정되어 있고

다들 바쁘니까요 1개만 하면 된다고 보면 편합니다.

만일 래지스터 변수로의 변신(?)이 실패하면 register 키워드는

컴파일러에 의해 무시되고 int  i;으로 그냥 해석되게 됩니다.

물론 컴파일러 마다 각기 컴파일 최적화 옵션에 따라 인덱싱 변수

같은것은 래지스터 변수로 되기도 합니다. ( 인덱싱이란 아까의

반복문 for의 인덱스로 쓰이는 i같은 변수를 인덱싱 변수라고

합니다. )


volatile

으음.. -.- 볼필요 없는데 심심해서 쓰는거니까 안 읽어도

이 글을 읽을 자격이 있는 분은 안 읽어도 됩니다. ( 읽으라는 거야

말라는거야 -.- )

이 키워드는 int 같은 것에 가능한것으로 알고 있고요

예로 얘기 해봅시다.


int a  = 0;

while( a == 0)
{
     printf(" forever continue ... \n" );
}


이 while 반복문 부분은 언제나 a 는 0이니까 계속 돌게 됩니다.

어디서도 이 a의 값 0을 바꾸게 하는 조건이나 상황은 없습니다.

컴파일러는 이때를 놓치지 않고요 (컴파일러 마다 다릅니다만 )

최적화 기법에 따라 이 값을 래지스터에 넣고 참조를 빠르게 해서

속도향상을 노립니다. 그러나 문제는 하드웨어 인터럽트 같은것

동기화 같은 부분에서는 cpu 제어 코드가 갑자기 가로 채어 저서

다른 부분으로 갈수 있다는 것입니다. 만일 이렇게 따른곳으로

오게된 코드상에서 a값을 바꾸는 시도를 하게 되면 while 문의

a == 0 이라는 조건을 만족하지 않게 되고 이렇게되면 자기가 원하

는 결과를 볼수 없게 되는 것입니다. ( 말만 어려운듯 --+ )

결국 컴파일러는 불행하게 이런 불상사를 눈치 못채고 a의 전에 값

을 래지스터에 넣고 속도 높일려고 했다가 오 동작을 하게 되는거죠

그래서 아예 컴파일러에게 이렇게 최적화 기법을 쓰지 마라

래지스터에 넣지 말구 그냥 a란 변수는 메모리에 할당된 곳의 값으로

언제나 참조해라 라고 하는거죠, 물론 메모리에서 참조 하기 때문에

최적화 효과를 얻을수 없기에 속도는 그냥 그래두 안정성은 보장

받은거니까요 ^_^

이 얘기를 왜 하냐구요 ? -.-; 나도 모르겠습니다. 저도 이걸 안게

솔직히 몇달전이거든요... 그래서 상식같은 얘기로 한번 해보았습니다.

자... 그냥 넘어갑시다.


short

으음... int형이 있습니다. 크기가 어떻게 된다고 했습니까?

2바이트 입니다. 예 맞습니다. 그런데 문제는 자기집의 컴퓨터가 16bit

즉 286 이 아니라 대부분은 386 이상되는 어떤집은 P2 300 이나 되는

32bit 체제의 컴퓨터라는 것입니다. 그렇게 되면 int형은 크기가 바뀌

게 됩니다. 4바이트라고... 근데 2바이트로 쓰기를 보장받고 싶으면

short이라는 키워드를 int 앞에 붙여 줍니다.

short int a = 0 ;

이 얘기는 16컴퓨터에서나 32비트 컴퓨터에서나 컴파일러는 동일한

일을 하게 됩니다. 메모리상에 유효한 공간에 2바이트 할당을 받고

a라는 변수로 이름지으고 속에다 초기화 값 0 을 넣습니다.



쓸데 없는 얘기로 오늘 강좌는 맞힐려고 합니다.

물론 쓸데 없다는 말은 아닙니다. 지금 필요하지 않아서 그런 말을 하는

거죠.. 그러나 나중에 다 피가되고 살이되는 것이기 때문에 ^_^

근데 강좌 계획에 차질이... 제어문이나 간단한 C 문법도 안 띤 상태라는

것을 말입니다 .^^;

그래서 다음번에는 간단하게 제어문, 반복문 같은것을들 보고

실제 C에서 프로그램 짜는 방식을 보도록 합시다.

그러고 난다음 자료형 파트는 끝이 납니다.

꾸벅

=======================================================================

                                                      By NeRi
                                                      1998/07/31
                  


   NeRi's 진짜C 첨인데      #6  자료형

_.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.-~`~-._.

안녕하세요 NeRi 입니다. 이번에는 저번에 말했듯이 C 의 기본 문법에

대해서 알아 보도록 하겠습니다. 자 그럼 시작합니다 .^_^

따른것은 알필요없고 먼저 if,for,while,switch 만 알면 됩니다.



조건 제어 if
-----------------------

문법 :  if ( condition ) <expression1>
        else <expression2>

설명 :  만일 condition 즉, 조건값이 참이면( 0 이 아니면 )
    
        <expression1>을 실행하고 거짓이면 ( 0 이면 )

        <expression2> 를 실행 하라

기본적으로 else 부분은 생략 가능합니다.

예제>

        int a = 2;

        if( a == 2 ) printf(" a is equal 2 \n");

== 은 C에서 같다를 의미합니다. 만일 a가 2와 같다면 화면에

a is equal 2 를 찍게 됩니다.


        int a = 2;

        if( a > 3 ) printf(" a is bigger than 3 ");
        else printf( " a is smaller than 3 ");

특히 <expresstion2> 부분에 if문을 더 두어서 중복적으로 if

검사를 할수 있습니다.

       int a = 3;

       if( a > 3 ) printf(" a is bigger than 3 ");
       else if( a == 3 ) printf(" a is equal 3 ");
       else printf(" a is smaller than 3 ");

또한 <expression> 부분을 블럭 {} 으로 놓고 블럭 안에 여러
    
문법을 쓸수가 있습니다.

다음은 a가 3이면 3이라고 찍고 hi를 찍습니다.

       int a = 3;

       if( a == 3) {
                    printf(" a is 3 \n");      
                    printf(" hi !   \n");
       }


반복문 for
------------------------------------

문법 : for ( 초기치 ; 조건 ; 증감치 ) <expression>

설명 : 초기치에 for 반복을 돌리기위한 초기화를 합니다.
      
       조건에는 이 반복문이 끝나게 될 조건을 넣어 줍니다.

       증감치 이 반복문이 조건에 부합되 끝이 나도록 증감치를

       둡니다.

예제>

       다음은 10번 hi를 찍습니다.

       int a;
    
       for( a = 0; a < 10 ; a++ )
            printf("hi \n");

      
      다음은 10번 hi와 love you를 찍습니다.

       int a;

       for ( a = 0; a < 10 ; a++ )
       {
            printf("hi \n");
            printf("love you\n");
       }


       각 부분(초기화,조건,증감치)은 생략 가능하며 만일 다 생략

       하게되면 끝내게 되는 조건이 없으므로 무한 루프를 돌게된다.

       for(;;) printf(" love you \n ");

       이렇게되면 널 사랑해가 계속 찍히게 되므로 널 영원히 사랑해

       가 된다.


반복문 while
-------------------------

문법 : while( 조건 ) <expression>
      
설명 : 조건이 참 ( 0이 아니면  )이면 <expression>을 실행하고 다시

       조건을 보다가 조건이 거짓( 0 ) 이면 끝을 낸다.

예제>

       다음은 10번 hi를 찍는다.

       int a = 0;
  
       while( a > 10 )
       {
             printf(" hi "\n);      
             a++;  
       }
      

do-while
-------------------------

문법 : do{  
          <expression>
       }while ( 조건 );

설명 : while과 같으며 단지 조건 검사를 while은 처음부터 시작하면서

       하지만 do-while은 조건 검사를 먼저 블럭안 expressiom을 실행

       하고 조건 검사를 한다는 것이다.      


다중 분기문 switch
-------------------------

문법 : switch ( 조건 )
       {
       case __ : <expression >;break;
       }

설명 : 조건이 합당하는 경우(case)를 찾아서 expression을 실행한다.

예제>

      다음은 나의 점수에 맞추어서 각 경우에 따라서 결과를 낸다.

      int score = 50;

      switch( score )
      {
      case 0  : printf(" die... \n"); break;
      case 50 : printf(" go out \n"); break;
      case 70 : printf(" good   \n"); break;
      case 100: printf(" best   \n"); break;
      }

      break는 for문이나 while, switch 문에서 나오게 되면 현재

      수행중인 반목문,분기문 을 조건 무시 그냥 나오게 하는 역활

      을 하게 된다.

      case 문에 default를 넣으면 만일 그런 경우가 없으면 기본으로

      실행하게 하는 것을 만드는 것이다. 다음은 경우에 없을때 기본

      으로 More Car 를 찍는 에제이다.

      int car = 5;

      switch( car )
      {
      case 0 : printf(" No car \n"); break;
      case 1 : printf(" One car \n"); break;
      default : printf(" More Car \n"); break;
      }

      

이번에는 기본적인 C 문법을 알아 봤다. 더 필요한 문법은 하면서 배우기로

하자 그럼 자료형을 마치고 본격적으로 C에서의 함수형에 대해서 알아 보고

실제로 자신이 스스로 함수를 만들수 있는 능력을 길러 보자

---------------------------------------------------------------------
  
                                                      By NeRi
                                                      1998/08/01

'KB > C/C++' 카테고리의 다른 글

Boyer Moore 문자열 패턴 매칭  (0) 2004.03.19
라인위의점으로선택  (0) 2004.03.19
bc 버그 중 하나..  (0) 2004.03.19
C & C++ Tip 1001  (0) 2004.03.19
비트찍기  (0) 2004.03.19

+ Recent posts