달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31



:
Posted by Gongdile
2017. 11. 22. 17:25

c언어 함수 Programming Language/C언어 공부 기록 2017. 11. 22. 17:25

함수는 독립적으로 수행하는 프로그램 단위를 말한다


C언어는 여러 개의 함수들로 이루어지고 

프로그램에서 반복적으로 수행되는 기능을 함수로 만들어서 호출한다 .


C언어에서 자료형과 함수는 짱짱 중요하다고 생각한다.


함수는 문제 해결의 방법이다 --> 주어진 문제를 작은 문제, 즉 여러 함수로 나누어서 생각할 수 있으므로 함수를 만드는 것은

   문제 해결의 하나의 방법이다 .


함수 이용의 장점 

함수로 구성된 프로그램은 함수 단위로 구성되어 있어, 읽기 쉽고, 이해하기 쉽다. 

이미 정의된 함수는 여러번 호출이 가능하므로 소스의 중복을 최소화해서 프로그램 양을 줄이는 효과가있다 .



C프로그램 함수의 종류에는...


1)주(main)함수 

프로그램의 시작과 종료를 나타내는 함수로, 프로그램에 main()함수는 꼭 있어야 한ㄴ 함수이며, 사용자 정의 함수라 할 수 있다.


2)사용자 정의 함수: 사용자(프로그래머)가 문제를 분석하여 필요한 기능으로 분류하여 기능열로 코딩하고자 할 때 만드는 함수다

 ex)) add(), swap()


3)시스템 라이브러리 함수: 많이 사용하는 기능의 함수들을 시스템에서 미리 만들어 놓고 사용자가 사용할 수 있도록 제공하는 함수다 


 

가장 중요한건 내가..함수를 작성할줄 알아야..내가 만들수있는 능력이 있어야 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 가져다

쓸수있다는거.. 



매개 변수라는건 함수와 함수사이의 서로 주고받는 데이터가있다면 그런 변수 그런거를 매개변수라고 한다 

&(앤퍼센트~)


함수(function, 모듈, 메소드(c++,Java))


매개변수 없는 함수 만들기

print만하고 돌아오거나.. 그런식 


void hello(void) 

void main()

{

hello();//함수 소출

}

//함수 정의 

void hello()

{

printf("Hello c!");

return;


}

add는부를때만생성되서만들고 다쓰면 돌아가서 없어지는 효율성..그래서 call by value 

 


매개변수(parameter, 인자, argument)

함수와 함수 사이에 주고 받는 값(예: 변수값, 상수값)


변수(variable)

프로그램에서 데이터를 저장하는 공간

지역변수: 함수 지역 안에서 선언된 변수는 다른 변수에서 그 내용을 보거나 수정 할 수 없음 


매개변수없는함수 

매개변수 있는 함수 만들기 

지역변수

함수 호출 방법: call by value


return값은 1개만 가지고올수있으음?~main 이라는 명령어.. 




[함수 호출 방법]

값에 의한 호출

주소에 의한 호출 (call by addres)

해결방법 

main 함수에 있는 변수의 주소값을 가지고

 swqp()함수를 호출하면 swap()함수에서 main함수의 변수값을 바꿀 수 있음

(포인터 변수 사용)

바꾸기 위해서는 역참조 연산자를 사용해야함 ..


*두가지용법

1)포인터 변수 선언

2)역참조 연산자

포인터 변수: 주소를 값으로 가지는 변수 

주소값을 저장하기 위해서는 포인터 변수가 필요함 


포인터 변수는 주소값만 값으로 가질 수 있음 

int *p = &a 

p = &a 

역참조 연산자: 포인터 변수 선언 후에 문장중에 포인터 변수 앞에 *가 오면

 (*p)포인터 변수가 가리키는 main변수의 값을 변경할 수 있음 

'Programming Language > C언어 공부 기록 ' 카테고리의 다른 글

c언어 1~2주차  (0) 2017.11.22
상수와 기본 자료형과 그외 등등등  (0) 2017.11.21
:
Posted by Gongdile
2017. 11. 22. 14:34

c언어 1~2주차 Programming Language/C언어 공부 기록 2017. 11. 22. 14:34

내용이 좀 두서가없다. 추후에 더 정리할 예정 

c언어 


일반적인 프로그램 구조(모듈화)


모듈 --큰문제를 기능별 작은 단위로 나눈 것 

 독립적으로 수행할 수 있는 프로그램의 단  위 


C언어 구조 : C프로그램은 여러 개의 함수로 구성됨 


함수 = 모듈 

독립적으로 수행할 수 있는 프로그램 단위 



주석(comment)


상수 constant  프로그램내에서 항상 고정된 값을 의미

변수 variable 변할 수 있는 수를 의미함 


숫자 상수 

정수 실수 

문자 상수

문자 문자열 


변수 c언어에서 변수란  데이터를 메모리에 저장하는 공간

   데이터를 처리하기 위해서 데이터 타입을 이용해 변수를 선언 


데이터타입이란?


데이터 처리를위해서 데이터를 저장해야함 

데이터를 종류에 따라 분류하여 적절한 크기의 공간에 저장하기 위해서 데이터 타입이 필요하다.

변수에 저장되는 값의 종류를 데이터타입 또는 간단히 자료형 


기본 자료형(basic type) int char float 


유도 자료형 (derived type) 배열 구조체 공용체 


변수 선언 

변수 프로그램에서 자료 값을 임시로 기억할 수 있는 저장 공간

컴퓨터의 메모리인 RAM에 저장 

변수명은 자료값을 저장하는 저장 장소의 이름 

같은 데이터 타입 변수 여러 개 선언 시 콤마(,)사용 


정수형

정수형은 큰 의미에서 문자형 포함 

좁은 의미에서는 문자형 제외한 순수하게 정수 저장하는 자료형 

 

문자형은 아스키코드로 저장되는 문자는 정수값으로 연산이 가능하기 때문에 


char c1='a';

c1= c1+1;

printf("%c",c1); //b 

printf("%d",c1); //98   %d 10진수로 찍어라~ 


부동소수형


float double long double 


float 은 4바이트 32비트 

double은 8바이트 64비트 


long double은 double보다 더 큰 저장공간을 할당하려는 의도에서 만들어졌으나 컴파일러마다 다름


sizeof연산자 


저장공간의 크기를 알 수 있는 연산자로sizeof를 이용 

연산다 sizeof 다음의 변수 이름으로 둘러싸는 괄호는 생략 가능 

결과 값은 같은 크기의 바이트 값 

 sizeof 이용법

sizeof(변수)

sizeof 변수 

sizeof(자료형 키워드) 


전처리기(preprocessor)

전처리는 컴파일러가 프로그래밍 언어를 기계어로 바꾸기 전에 처리해야할 명령을 먼저 수행하는것~ 

다양한 라이브러리를 작업중인 소스파일에서 사용할 수 있도록 헤더파일을 포함


#include<stdio.h> 이렇게..!  


전처리기중 #define이라는애가있음 

#define 문자열1 문자열2 

컴파일 전에 소스파일의 문자열1을 문자열2로 치환 


printf함수 여러개의 데이터타입을 형식화 시켜서 출력하는 함수다 

%d --> 정수를 10진수로 출력 1 -2 10

%f --> 소수점이 있는 실수로 출력 

%c --> 문자 형태로 출력 

%s --> 문자열 형태로 출력 


scanf 함수 여러 개의 다양한 데이터타입을 한 번에 입력 받을수 있는 함수 


double형은 %lf로 받음

 예제 마일을 킬로미터로 변환     


'Programming Language > C언어 공부 기록 ' 카테고리의 다른 글

c언어 함수  (0) 2017.11.22
상수와 기본 자료형과 그외 등등등  (0) 2017.11.21
:
Posted by Gongdile

꾸준히 C를 공부해 보겠다 !! 

근데 꾸준히라는 말이 제일 어려운것같다..ㅠㅠ 


지금 보고 있는 책은 알고리즘이 보이는 그림책인데 

그림으로 쉽게 나와있어서 개념부분을 간단간단 확인할 수 있어서 참고하는 중이다.



캐스트 연산자 

'(int)'와 같이 형 이름을 괄호() 로 둘러싼 것을 값이나 변수 앞에 쓰면 

그 변수를 특정형으로 변환할 수 있다.

 이런 조작을 형 캐스트라고 한다.  괄호 ()를 캐스트 연사자라고 한다. 


형을 특정형으로 바꾸는거를 형 캐스트라고 하는것이고 그때 괄호 ()를 캐스트 연산자라고 하는거다.



배열 


동일한 형으로 된 변수들을 하나로 묶은 것을 배열이라고 함 


배열은 여러 개의 동일한 형으로 된 변수를 하나로 묶은거다 


배열 선언은 


int a[4]; 이런식으로 하는데 여기서 int는 형을 말하고 a는 배열명 4는 배열의 크기(요소의 수 ) 를 말한다.


여기서 첨자와 요소에 대해 알아야 하는데


첨자--> 0부터 시작하는 배열의 인덱스 번호를 만든다 

요소-->하나하나의 상자를 a[0],a[1],a[2],a[3]로 나타낸다 


==> 첨자는 0부터 시작하기 때문에 요소 개수보다 하나 작은 값이 된다.


그래서 int a[4];를 실행하면 배열의 크기가 4인 a라는 이름의 int형 배열을 만들어~ 하고 4개의 공간을 만드는데 

인덱스 번호가 0부터 시작해서 

4개의 방 이름이 a[1] a[2] a[3] a[4] 가 아니라 

    a[0] a[1] a[2] a[3]로 시작한다. 

첨자에 '0' ~ '요소 개수-1' 이외의 값을 지정하면 실행시 오류가 발생하므로 주의해야한다.



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

포인터 변수에 대해 정리해보기! 


데이터가 있는 장소를 기억하는 놈이 포인터 변수다 


변수 등이 저장되어 있는 위치(주소)를 값으로 값으로 가지는 변수를 포인터 변수라고 한다.

포인터 변수에도 형이 구별되어 있다.


책에 나와있는 예시를 보자 

 char형의 포인터 변수p를 사용하려면.. 일단 선언해줘야겠지?

1.포인터 변수 p의 선언 

char *p; 또는 char* p;

모두 같은 뜻이다 


2. 포인터 변수 p에 변수 a의 주소를 대입 

char a; 

char *p;

p = &a; -->여기서 &a는 변수 a의 주소를 의미한다. 


3.포인터 변수 p가 가리키는 변수 a의 값을 참조 


포인터 변수명 앞에 *를 붙이면 그 포인터 변수가 가리키는 곳의 데이터를 참조할 수 있다. 

char a = 3;

char  *p;

p = &a;


여기서 예를 들어서 

char b = *p;라고 한다면 

char b 안에 포인터 변수 p가 가리키는 변수a의 값이 들어간다고 생각하면 된다.

왜????? p =&a; 라는건 포인터 변수 p에 변수 a의 주소를 대입한거라 


포인터 변수 p를 사용하여 변수 a의 값을 변수 b에 대입한거라고 보면 된다 .


<포인터와 배열>

배열의 이름 자체에는 배열의 첫 번째 요소를 가리키는 포인터 역할을 한다. 

그래서 &(주소를 구하는 기호)를 사용할 필요가 없다.


int a[4]; 에서 a는 a[0]에 대한 포인터로 사용할 수 있다. 


이거 꼭 기억해 두기 !! 


<포인터를 사용한 배열의 참조>

예를 들어서 int a[4];를 선언했다고 하자. 

int a[4] = {10, 20, 30, 40};


  10

    20

 30

 40

a[0]                                            a[1]                                             a[2]                                           a[3]


여기서 배열 a[]가 있을때 a자체는 --> a[0]에 대한 포인터 이므로 => *a는 a가 저장되어 있는 장소의 값 a[0]이 된다.!! 


그래서... a[1]을 *(a+1), a[2]는 *(a+2)라고 쓸 수 있다. 


==> 위에 배열 예시를 들면 *(a+3)은 40이다.. 

   *a+3은  13이다.


<문자와 문자열>


프로그램상에서 문자표현에는 작은 따옴표가 사용된다.

문자열은 ""로 둘러싼다. 


고정 문자열은 이런 구조로 되어있다 

"Hello"

 ' H '

' e '

' l ' 

 ' l ' 

' o '  

' \0 ' 


\0은 문자열이 여기서 끝난다는 것을 나타낸다. 화면에는 표시안됨 \0을 한 문자로 취급함 

\0이 NULL문자를 의미하는 기능을 가짐

문자열을 저장하는 변수를 준비하려면 다음과 같이 선언한다.


char s[6];

 변수s에 문자열의 길이에 null문자 하나를 더한 수 이상으로 지정한다.


문자열을 초기화하려면 다음과 같이 한다 .

char s[6]= "Hello";

[]안을 생략하면 문자수+1 (6개)만큼의 상자가 자동으로 만들어집니다.


char s[] = "Hello"; 


문자열 변수에 값을 넣을때 =를 사용할 수 있는 경우는 초기화할때뿐임 

그외의 경우에 대입할때는 strcpy()함수를 사용한다.


char s[10];

strcpy(s, "Hello");

여기서 s는 위에서 선언한 s[10]의 첫 번째 주소를 가리킨다.



<키보드 입력>

키보드로 입력한 데이터를 변수나 문자열 배열에 저장하는 방법을 알아보는거임 


1. scanf() 함수 


scanf() 함수는 키보드에서 입력한 데이터를 지정한 서식으로 변환해서 변수나    배열에 저장하는 거임 


int a;

scanf("%d", &a); 

 근데 문자열의 경우에는 배열명은 배열의 첫번째 요소의 주소가 되기 때문에 &을 붙일 필요 없다.

char s[30];

scanf("%s",s);


여러 데이터를 한번에 입력할 수도 있다.(입력 문자는 스페이스로 구분한다.)

그래서 스페이스를 포함하는 문자열은 제대로 읽을 수 없고, 또 입력문자와 지정한 서식이 맞는다는 보장이 없다.


2.gets() 함수 

gets()함수는 키보드에서 입력한 한주르이 문자열을 문자 배열로 저장한다. 

스페이스도 읽을 수 있다.  


char s[30];

gets(s);


3.getchar() 함수 

getchar() 함수는 키보드에서 입력한 문자 중 한 문자만 변수에 저장한다.


int c;

c = getchar();


 









 


'Programming Language > C언어 공부 기록 ' 카테고리의 다른 글

c언어 함수  (0) 2017.11.22
c언어 1~2주차  (0) 2017.11.22
:
Posted by Gongdile

2017-06-28 (어제 공부한거를 바로 포스팅을 못했다.)


오늘 공부한내용 


Chapter 04 데이터 표현방식의 이해



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

04-1) 컴퓨터가 데이터를 표현하는 방식


컴퓨터는 2진수를 기반으로 데이터를 표현하고연산도 진행한다.


따라서 2진수를 이해해야 C언어를 보다 정확히 이해할 수 있는데 


2진수란 -> 두 개의 기호를 이용해서 데이터를 표현하는 방식을 가리켜 2진수라 한다.  


여기서 말하는 'n진수'에서의 n은 데이터를 표현하는데 사용하는 기호의 갯수를 의미한다. 


2진수 10진수 16진수에 대해서 설명하려고한다. 


여기서 16진수는 총 열여섯 개의 숫자를 이용해서 수를 표현하는데  숫자 기호의 수가 10개밖에 되지 않으므로

문자기호까지 동원해서 표현한다. 


간단하게 표로 표현하자면 


 2 진수

10 진수 

16 진수 

0

 0

 1

 

 2

 

 3

 

 4

 

 5

 

 6

 

 7

 

 8

 

 9

 

 10

A

 

 11

B

 

 12

C

 

 13

D

 

 14

E

 

 15

F

 

 16

10

 

 17

 11


그래서 16진수는 문자 A는 정수10 그외 .. 등으로 표현하였다.


10진수는 언제 자릿수가 증가할까? 

정수 9다음에 증가한다 -->왜??--> 한 자릿수를 가지고 표현할 수 있는 최댓값이 9이기 때문이다.


그렇다면 2진수는?? 


한 자릿수 내에 표현할 수 있는 최댓값이 1이므로 1다음에  자릿수가 증가한다. 


16진수도 마찬가지다.


데이터의 표현방식의 이해에서 16진수를 왜 설명하냐면 2진수 네 개는 16진수 하나로 표현이 가능하기 때문이다 

그래서 16진수를 적지 않게 사용하기 때문에 익숙해질 필요가 있다.


< 데이터의 표현 단위인 비트(Bit)와 바이트(Byte) >


'비트'는 컴퓨터가 표현하는 데이터의 최소단위다. 

--> 2진수 값 하나를 저장할 수 있는 메모리의 크기를 뜻하는 단위

 


비트를 여덟 개 묶으면 '바이트'라는 단위가 구성되다.


1Byte = 8bit 



04-2) 정수와 실수의 표현방식


<정수의 표현 방식>


c언어는 보통 하나의 정수를 4바이트로 표현한다. 


정수를 표현하는데 있어서 가장 왼쪽에 존재하는 비트를 '부호비트'라고 한다. 

양수라면 0, 음수라면 1을 저장하여 부호를 표시한다.


그래서 이 비트를 가리켜 MSB라고 한다. Most Significant Bit의 약자로 가장 중요한 비트라는 뜻을 지닌다, 


<음수 정수의 표현>


음수 정수를 표현할 때에는 2의 보수를 취해야 한다.


그전에 보수는 왜 사용하는 걸까?



컴퓨터에는 (-)라는 개념이 없기 때문에 보수를 사용한다. 


1의보수는 음수 표현시에 0을 1로, 1을 0으로 바꿔주는것인데  

1의 보수는 0이라는 개념이 없을때에는 그냥 사용해도 좋으나 

0의 개념이 들어갈 경우 1의 보수로 한다면 (+)0과 (-)0이 나오게 된다. 


분명 0은 하나밖에 없는데, 음 양의 개념으로 나뉜다면 계산시에 컴퓨터가 오작동할 문제가 있다. 


그래서 이를 방지하기 위해 2의 보수를 사용한다. 


2의 보수는 0의 개념이 하나로 지정되기 때문에 컴퓨터가 오작동할 이유가 없다.



따라서 음수 계산 및 기타 계산은 1의 보수 또는 2의 보수 두랃 사용이 가능하지만 


0의 개념을 하나로 통합시켜 사용할때는 2의 보수를 사용하는게좋다.

(1의 보수는 결과에 캐리가 발생시 캐리값을 연산해주어야 하지만 

2의 보수는 발생한 캐리를 무시하기 때문에 다른 처리를 할 필요가 없다, -->나중에 자세히 포스팅)


2의 보수는 1의 보수를 취해준뒤에 1을 더하면 2의 보수가 된다. 



<실수표현방식> 

실수를 표현하는 방식은 부동소수점 방식을 사용하는데.. 대략적으로 이런것이 있다 하고 이해하고 넘어가면 되는 부분이라서 

이건 나중에 2의보수와 함께 자세하게 다루겠다. 


컴퓨터가 실수를 표현하는 방식에는 오차가 존재한다는것은 알아두자  

컴퓨터가 우리가 표현하고자 하는 실수 값을 정확하게 표현하는게 아니라, 아주 가까운 문제가 없을 만큼의 근사치를 통해서 실수를 표현하기 때문이다.




04-3)비트연산자 


비트 단위로 연산을 진행하는 연산자를 비트 연산자라고한다 주로 하드웨어 관련 프로그래밍에 활용된다 

메모리 공가느이 효율성을 높이고 연산의 수를 줄이는 요인이다. 


<&연산자: 비트단위 AND>


& 연산은 두 개의 비트가 모두 1일 때 1을 반환하는 연산이다 


0 & 0  0반환

0 & 0  0반환

1 & 0  0반환

1 & 1  1반환


< |연산자 : 비트단위 OR >


| 연산은 두 개의 비트 중 하나라도 1이면 1을 반환하는 연산


0 | 0  0반환

0 | 0  1반환

1 | 0  1반환

1 | 1  1반환



< ^연산자: 비트단위 XOR >


^연산은 두 개의 비트가 서로 다른 경우에 1을 반환하는 연산


0 ^ 0  0반환

0 ^ 1  1반환

1 ^ 0  1반환

1 ^ 1  0반환


< ~연산자: 비트단위 NOT >


~연산은 비트를 0에서 1로, 1에서 0으로 반전시키기 때문에 보수연산이라고도 불린다.


~0  1반환

~1  0반환


-->MSB 도 반전되어 부호마저 바뀐다는 사실 알아두기 



< <<연산자: 비트의 왼쪽 이동(Shift) >


<<연산자는 두개의 피 연산자를 요구하며 다음의 의미를 갖는다. 


num1 << num2  num1의 비트 열을 num2칸씩 왼쪽으로 이동시킨 결과를 반환 


8 << 2  정수 8의 비트 열을 2칸씩 왼쪽으로 이동시킨 결과를 반환 


예제를 보자 

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

<BitLeftShift.c>


#include <stdio.h>


int main (void)

{

int num = 15;  // 00000000 00000000 00000000 00001111


int result1 = num<<1;   //num의 비트 열을 왼쪽으로 1칸씩 이동

int result2 = num<<2;  // num의 비트 열을 왼쪽으로 2칸씩 이동

int result3 = num<<3;  // num의 비트 열을 왼쪽으로 3칸씩 이동


printf("1칸 이동 결과: %d \n", result1);

printf("2칸 이동 결과: %d \n", result2);

printf("3칸 이동 결과: %d \n", result3);


return 0 ; 



}

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

실행 결과


1칸 이동 결과: 30  // 2진수표현   00000000 00000000 00000000 00011110

2칸 이동 결과: 60  // 2진수표현   00000000 00000000 00000000 00111100

3칸 이동 결과: 120   // 2진수표현   00000000 00000000 00000000 01111000


비트의 이동으로 인해서 생기는 오른쪽 빈 칸은 0으로 채워지고, 이동으로 인해서 밀려나는 왼쪽 비트들은(4바이트를 넘어서는 비트들은) 그냥 버려진다.

비록 그 값이 1이더라도 말이다. 


위의 예제를 보면 다음 사실도 알 수 있다. 


""비트의 열을 왼쪽으로 1칸씩 이동시킬 때마다 정수의 값을 두 배가 된다." 


그리고 위의 내용을 토대로 다음 사실도 알 수 있다.


"비트의 열을 오른쪽으로 1칸씩 이동시킬 때마다 정수의 값은 2로 나누어진다."



num에 14 를 넣어서 해보니까 28 56 112가 출력됬다 ㅋㅋ 다른수로 해도 마찬가지! 




<  >>연산자 : 비트의 오른쪽 이동(Shift) >


>>연산자와 <<연사자의 가장 큰 차이점은 비트의 열을 이동시키는 방향에 있다.


num >> num2


num2의 크기만큼 num1의 비트 열이 오른쪽으로 이동한 결과가 반환된다. 

물론 num1이 양수라면 이동으로 인해 밀려나는 오른쪽 비트들은 소멸되고 

이동으로 인해 생긴 왼쪽 빈자리는 0으로 채워진다. 


그러나 num1이 음수라면 이야기는 달라진다 


이 결과는 cpu에 따라서 달라지는데 음의 값을 유지하기 위해 1을 채우는 cpu도 있고 음의 값 유지에 상관하지 않고 0을 채우는 cpu도 있다. 

'Programming Language > 열혈강의c 공부' 카테고리의 다른 글

03.변수와 연산자  (0) 2017.06.27
02.프로그램의 기본구성  (0) 2017.06.27
01.이것이 c언어다.  (0) 2017.06.26
00.시작  (0) 2017.06.26
:
Posted by Gongdile

2017-06-27 


오늘 공부한 내용 


chapter 03 변수와 연산자 


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

03-1)연산을 위한 연산자와 값의 저장을 위한 변수 



<연산자와 변수를 이용한 데이터의 저장>


c언어에서는 '연산자(operator)'라는게 있는데 특정연산을 요구할 때 사용하는 약속된 기호를 가리켜 말한다.


덧셈연산을 하는 프로그램을  만든다고 가정할때 컴퓨터내에서 덧셈연산 명령을 한뒤에 그 연산값을 보여주려면 무엇을 이용하면될까?


바로 c언어에서 제공하는 변수를 이용하면 된다. 


--> 덧셈연산을 하고 그 결과를 메로리 공간에 저장하고 메로리 공간에 저장된 값을 출력할때 --->변수 이용 !!


c언어에서 변수의 의미는

"값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리켜 변수라 한다."


예시를보자

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

int main(void)

{

int num; //num이라는 이름의 변수를 선언한것이다.


}

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

이 문장의 int와 num의 의미하는바는 이렇다

int : 정수의 저장이 가능한 메모리 공간을 할당한다.

num : 그리고 그 메모리 공간의 이름을 num이라 한다.


아래를 보자 

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

int main(void)

{

int num; //num이라는 이름의 변수를 선언한것이다. 전 포스팅에서 //는 주석이라고 설명했다. 

num=20; //변수 num에 20저장 

printf("%d",num); // 변수 num의 값 참조 



}

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

C언어에서 =기호는 값의 대입을 뜻한다 num이라는 변수에 20이라는 값을 대입 한다는 것이지 num과 20이 같다는 뜻은 아니다.

그렇게 사용하려면 num==20;이라고 입력해야한다 

 


=라는 기호를 가리켜 '대입 연산자' 라 하며, 

대입 연산자의 오른편에 오는 값을 왼편에 오는 변수에 저장하는 형태로 사용이 된다. 


<변수의 다양한 선언 및 초기화 방법>


c언어에서 '초기화'선언된 변수에 처음 값을 지정하는 것을 말한다. 

그리고나서 초기화 이후에 저장된 값을 변경할 때에는 '대입'또는 '대입연산'을 진행한다고 한다.


int main(void)

{

int num;  //num이라는변수의 선언

num=12; //변수 num을 12로 초기화

num=24; // 변수 num에 24를 대입


}

그런데 이렇게 변수선언해주고~초기화 해주지않고 C언어에서는 변수를 '선언과 동시에 초기화' 하는 것이 가능하다.


int num=12; 


라고 코드를 작성해주면 변수 num이 메모리 공간에 할당되자마자 12로 초기화가된다.


둘 이상의 변수를 동시에 선언하는 것도 가능하고, 동시에 선언 미 초기화하는 것도 가능하다.


int num1,num2; //두 개의 변수를 선언

int num3=30, num4=40; // 두 개의 변수를 선언 및 초기화 


그런데 왜 변수를 초기화할까??

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

#include<stdio.h>


int main(void)

{

int num1,num2;


printf("num1: %d, num2:%d \n", num1,num2);


num1=10;

num2=20;


printf("num1:%d, num2: %d \n",num1,num2);


}

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

을 실행시켜보면  초기화되지않은 지역변수를 사용했다고 에러가 뜨는데 


"변수를 선언만하고 초기화하지 않으면 쓰레기 값이 저장된다."

여기서 말하는 쓰레기 값이란 '아무런 의미가 없는 값'을 뜻한다. 

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

#include<stdio.h>


int main(void)

{

int num1,num2;


//printf("num1: %d, num2:%d \n", num1,num2); 이 코드를 주석처리하고 돌려보면 


num1=10;

num2=20;


printf("num1:%d, num2: %d \n",num1,num2);


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

num1=10 num2=20 이 출력된다.


그래서 변수를 선언과 동시에 0으로 초기화한 다음 이후 의미있는 값을 저장하기도 한다.

int num1=0; 

int num2=0;

처럼 말이다 하지만 이것이 절대적으로 지켜야 할 규칙은 아니다.  


<변수선언 시 주의사항>


"중괄호 내에 변수를 선언할 경우, 변수의 선언문은 중괄호의 앞부분에 위치해야 한다.:


중괄호의 시작부분에 변수의 선언문이 위치해야한다. 


두 예시를 보자

int main(void)

{

int num1;

int num2;

num1=0;

num2=0; 


변수 선언 이후에 초기화 문장이 등장한 예시인데 이 코드는 컴파일 에러를 발생시키지 않는다


그러나 아래와 같은 코드는 컴파일 에러를 발생시킨다. 

int main(void)

{

int num1;

num1=0;

int num2;

num2=0; 


num2의 선언문 앞에 변수의 선언이 아닌 문장이 등장했기 때문이다 따라서 중괄호의 앞부분에 변수의 선언문이 오도록 해야한다.


열혈c에 나오는 책에서는 1999년도에 발표된 c언어의 표준에서는 변수의 선언위치에 아무런 제한을 두지 않고 있기에 위의 코드도 컴파일이 되어야 하는 것이 정상이지만 최근에 발표된 컴파일러를 비롯해서, 상당수의 컴파일러가 변수의 선언문이 중괄호에 앞부분에 위치할 것을 요구하고 있으니 ..

순수하게 C언어로 프로그램을 작성하고자 한다면 컴파일러가 지원하는 변수의 위치에 상관없이 중괄호의 앞부분에 변수를 선언하는것이 좋다.


#변수이 이름을 지을 때 적용되는 규칙들 


이거 진짜 변수 지을 때 기억해야한다. !!!! 

특히 

"변수의 이름을 정할 때에는 변수의 역할에 어울리는, 의미 있는 이름을 지어야 한다."

안그러면 나중에 내가 코드를 짜놓고도.. 이거 어디에 사용하려고 만든 변수인지 와닿지가 않는다 그래서 딱봐도 아 ! 하고 예상할수 있는 이름의

변수가 좋다. 


1. 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성된다.

2. C언어는 대소문자를 구분한다. 변수Age와 변수 age는 서로 다른 변수이다.

3. 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변ㅅ의 이름으로 사용할 수 없다. 

4. 이름 사이에 공백이 삽입될 수 없다. 



<변수의 자료형(Data Type)>


변수는 두 가지 부류로 나뉜다.


1. 정수형 변수 : 정수의 저장을 목적으로 선언된 변수 

char형, short형, int형, long형 변수로 나뉜다.


2. 실수형 변수 : 소수점 이하의 값을 지니는 실수의 저장을 목적으로 선언된 변수

float형, double형 변수로 나뉜다.


변수의 종류가 나뉘는 이뉴는 정수냐, 실수냐에 따라서 값이 메모리 공간에 저장 및 참조되는 방식이 다르기 때문이다


03-2) C언어의 다양한 연산자 


<대입 연산자(=) 와 산술 연산자(+, -,*,/,%)>


두개의 피연산자를 요구하는 연산자를 가리켜 '이상 연산자(binary operator)'라 하는데 대입 연산자와 산술 연산자는 모두 이항 연산자들이다.


=연산자 : 연산자 오른 쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입한다 ex) num=20;


+연산자 : 두 피 연산자의 값을더한다. ex) num=4+3;


-연산자 : 왼쪽의 연산자 값에서 오른쪽의 피연산자 값을 뺀다. ex)num=4-3;


*연산자: 두 피연산자의 값을 곱한다. ex)num=4*3;


/연산자 : 왼쪽의 피 연산자 값을 오른쪽의 피 연산자 값으로 나눈다. ex) num=7/3;


%연산자 : 왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환한다. ex)num=7%3;


그리고 함수 호출문의 인자절달 위치에 연산식이 올 수 있다.

무슨 말이냐면 


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

int main (void)

{

int num1, num2;

printf("%d-%d=%d \n",num1,num2,num1-num2);


return 0;


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

이렇게 인자전달 위치에 num1-num2와 같은 연산식이 올 수 있다. 


<복합 대입 연산자>


이거 많이 쓴다 .

복합 대입 연산자는 다른 연산자와 합쳐진 형태의 대입 연산자를 말한다 


+=, -= , /=, %=, <<=, >>=, &=, ^=, |=등이 있는데 산술 연산자와 합쳐진 복합 대입 연산자외에 나머지 연산자들은 다음에 !!! 


a = a+b 를 a+=b라고 표현할수도 있는데 여기서 +=가 복합 대입 연산자이다.

a=a-b 는a-=b 와 같은 의미이다. 


<부호연산의 의미를 갖는 +연산자와 -연산자>


+와 -가 덧셈, 뺄셈 의미 말고도 부호의 의미를 가진다.


그런데 부호 연산자와 복합 대입 연산자가 비슷해서 혼동하기 쉬우므로 잘 기억하자


num= -num2; //부호 연산자의 사용


num-= num2; //복합 대입 연산자의 의미이다.  num=num-num2; 라는 뜻이다. 


<증가, 감소연산자>


이거 헤깔리기 쉬운데 활용 빈도가 높아서 확실하게 이해해야한다. 

이 연산자는 변수에 저장된 값을 1증가 및 감소시키는 경우에  사용되는 연산자이다. 단한연산자다.


++num : 값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산)

num++ : 속한 문장을 먼저 진행한 후, 값을 1 증가(선 연산, 후 증가)

--num : 값을 1 감소 후 , 속한 문장의 나머지를 진행(선 감소, 후 연산)

num-- : 속한 문장을 먼저 진행한 후, 값을 1 감소(선 연산, 후 감소)


예제를 통해 보여주겠다.

int main(void)

{

int num1=12;

int num2=12;


printf("num1: %d \n", num1);

printf("num1++: %d \n", num1++); //후위 증가 

printf("num1: %d \n\n", num1);



printf("num2: %d \n", num2);

printf("++num2: %d \n", ++num2); //전위 증가

printf("num2: %d \n", num2);


return 0 ;


}  


값이 어떻게 출력될까?


num1: 12

num1++: 12

num1: 13


num1: 12

++num1: 13

num1: 13



의 결과가 출력된다 

예제 코드에 만약 괄호 연산이 있다면 후의 증가 및 후의 감소 연산 시에는

 '소괄호의 영향을 받지 않고, 다음 문장으로 넘어가야만 비로소 값의 증가 및 감소가 이뤄진다'라는 사실을 기억하자. 



<관계 연산자>


관계 연산자는 대소와 동등의 관계를 따지는 연산자이다.

관계 연산자는 '조건을 만족하면 1을, 만족하지 않으면 0을 반환'한다.

여기서 말하는 1과 0은 참(true)이면 1, 거짓(false)면 0을 대표하는 숫자이다.


1. < a<b a가 b보다 작은가?

2.> a>b   a가b보다 큰가?

3.== a==b a와 b가 같은가?

4.!= a!=b  a와 b가 다른가?

5.<= a<=b a가 b보다 같거나 작은가?

6.>= a>=b a가 b보다 같거나 큰가?


코드를 실행시켰을시에 0이 출력되었다는건 거짓을 의미하고 1을 출력한다면 참이라는것을 의미한다. 



<논리 연산자>


1. &&  A&&B A와 B가 모두 참이면 연산결과로 참을 반환한다. (논리AND)

2. ||  A || B A와 B둘 중 하나라도 참이면 연산결과로 참을 반환 (논리 OR)

3. ! A! A가 참이면 거짓, A가 거짓이면 참을 반환(논리 NOT)


<콤마 연산자 , >


콤마 연산자는 둘 이상의 변수를 동시에 선언하거나, 둘 이사의 문장을 한 행(line)에 삽입하는 경우 사용되는 연산자다. 

또한 둘 이상의 인자를 함수로 전달할 때도 인자의 구분을 목적으로 사용된다 


즉 콤마 연산자는 다른 연산자와는 달리, 연산의 결과가 아닌 '구분'을 목적으로 주로 사용된다.


<연산자의 우선순위와 결합방향>


우리가 덧셈 뺄셈 곱셈 나눗셈 연산을 할때 우선순위가 존재하듯이 

C언어에서도 연산자 우선순위 라는 것이 존재한다. 


그런데 곱셈과 나눗셈이 동시에 있을때 곱셈과 나눗셈 중 무엇을 먼저 계산하는가?


곱셈과 나눗셈은 왼쪽에 먼저 등장하는 것부터 순서대로 계산한다.!! 이것을 바로 결합방향 이라고 한다.


즉 '우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것'이 바로 결합방향이다. 


 순위

연산기호 

연산자 

결합방향 

1위 

 () 

 함수호출 

 →


 [] 

 인덱스 

 -> 

 간접지정 

 ++(postfix)

 --(prefix) 

 후위증가 및 감소 

2위 

 ++(postfix)

 --(prefix) 

 전위증가 및 감소

 ←

 sizeof 

 바이트 단위 크기 계산 

 ~

 비트 단위 NOT 

 !

 논리 NOT 

 -, + 

 부호 연산(음수와 양수의 표현) 

 & 

 주소 연산 

 * 

 간접지정 연산

3위 

 (casting)

 자료형 변환 

  

4위 

 *,/,% 

 곱셈, 나눗셈 관련 연산 

  →

5위 

 +, - 

 덧셈, 뺄셈 

  →


6위 

 <<, >> 

 비트이동

  →

7위 

 <, >, <=, >= 

 대소비교 

  →

8위 

 ==, != 

 동등비교 

  →

9위 

 & 

 비트AND 

  →

10위 

 ^ 

 비트XOR 

  →

11위 

 | 

 비트OR 

  →

12위 

 && 

 논리AND

  →

13위 

 || 

 논리OR 

  →

14위 

 ? : 

 조건연산 

 ←

15위 

 =, +=, -=, *=, /=, %=,  <<=,  >>=, &=, ^=, |= 

 대입연산 

 

16위 

 , 

 콤마연산 

  →



03-3) 키보드로부터의 데이터 입력과 C언어의 키워드


<키보드로부터의 정수입력을 위한 scanf함수의 호출>


scanf 함수의 기본적인 사용법을 알아보자


int main(void)

{

     int num;

     scanf("%d", &num); //키보드로 입력된정수를 변수 num에 저장하라.


}

%d : 10진수 형태로 입력 받아서 --> &num : 변수 num에 저장하라!! 


저번 시간에 나온 prinft함수에서 %d 는 서식문자이면서 '10진수 정수형태의 출력'을 의미한다고 했는데 


그렇다면 scanf에서는 무슨의미일까?? 


prinft 에서의 %d와 반대로 '10진수 정수형태의 입력'을 뜻한다. 


scanf함수도 입력의 형태를 다양하게 지정할 수 있다. 또 scanf함수는 공백을 기준으로 데이터를 구분한다. 


scanf("%d %d %d", &num1, &num2, &num3); 라고 코드를 작성했다면 값을 입력할대 스페이스바, 탭 또는 엔터키를 입력해야한다. 




<c언어의 표준 키워드(keyword)>


앞에서 소개한 int나 return와 같은 단어들은 이미 그 기능적 의미가 정해져 있는데, 

기능적 의미가 정해져서 C언어의 문법을 구성하는 단어들을 가리켜 -->키워드(keyword)라고 한다. 


키워드는 '프로그래머가 다른 용도로 사용할 수 없도록 제한되어 있다.' 그래서 변수나 함수의 이름으로 사용할 수 없다. 

'Programming Language > 열혈강의c 공부' 카테고리의 다른 글

04.데이터 표현방식의 이해  (0) 2017.06.29
02.프로그램의 기본구성  (0) 2017.06.27
01.이것이 c언어다.  (0) 2017.06.26
00.시작  (0) 2017.06.26
:
Posted by Gongdile

02-1)   Hello world! 들여다보기


책 앞에있는 Hello world예제를 통해 간단하게 실습하였고 그 코드를 통해  이 문장이 의미하는바가 무엇일까? 생각해보기로했다.

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

<Hello.c>

#include <stdio.h>

int main(void)

{

printf("Hello world! \n");

return 0;

}

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


<c언어의 기본 단위인 '함수'의 이해>


기억하자 "C언어는 함수로 시작해서 함수로 끝난다!!"

C언어로 프로그램을 작성한다는건 함수를 만들고, 만든 함수들의 실행순서를 결정하는 것이다 


C언어에서는 삽입되는 값을 '입력'이라고 하고 그 결과로 얻게되는 값을 '출력'이라고 한다. 

그리고 적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜  '함수(function)'라고 한다


C언어에서 함수와 관련해서 사용되는 용어 몇가지를 정리하자면


-함수의 정의 : 만들어진 함수, 실행이 가능한 함수를 일컫음

-함수의 호출 : 함수의 실행을 명령하는 행위

-인자의 전달 : 함수의 실행을 명령할 때 전달하는 입력 값 


예를 들어 3X+4=Y 라는 함수가 있을때 


보이는 것이 함수의 '정의'이고, 이 함수의 호출을 위해 X에 전달되는 값이 '인자'가 된다.

따라서 인자의 전달은 함수의 호출과정에서 동시에 발생한다고 볼 수 있다.


<예제 Hello.c에서의 함수는 어디에?>


위에서 얘기했지만 c프로그램은 함수로 시작해서 함수로 끝난다.

즉, 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램의 흐름이 되는 것이다.


제일 먼저 호출되는 함수는 무엇일까??--> 바로 main이라는 이름의 함수이다. 

프로그램이 시작되자마자 컴퓨터는 main이라는 이름의 함수를 찾아서 호출을 한다. 

따라서 C언어로 구현된 모든 프로그램에는 Main이라는 이름의 함수가 정의되어야 한다. 


Hello.c예제를 보면 이 예제의 main 함수는 다음과 같이 시작한다.


int main (void)


이것이 의미하는건 다음과 같다.

"출력의 형태가 int이고 입력의 형태가 void인 main이라는 이름의 함수"


함수의 특성(입력형태, 출력형태 그리고 함수이름)만 정의했다고 해서 함수가 되는 것은 아니다.

함수는 기능을 지녀야한다. c언어에서는 그 기능은 중괄호 안에 표현이 된다. 

즉 main함수의 기능은 다음과 같다. 

.  int main(void)

{

printf("Hello world! \n");

return 0;

}


중괄호 내부에 두 개의 문장으로 이루어져 있는데 순차적으로 실행되고 문장의 수에 상관없이 위에서 아래로 순차적으로 실행이 된다.

그리고 이렇게 함수의 기능을 정의하고 있는 영역을 가리켜 '함수의 몸체(body)'라고 한다. 


그리고 '출력형태'라는 표현은 함수임을 강조할 때 사용이 되며 실제로는 반환형(return type)이라는 표현이 주로 사용된다.


함수 내에 존재하는 문장의 끝에는 세미콜론 문자 ;를 붙여준다.


그런데 모든 문장에 세미콜론이 붙는 것은 아니다. 

(조건문이나 반복문과 같은 컨트롤 문장등에는 붙지 않는다. )


<표준 라이브러리와 printf함수>


printf("Hello world! \n"); 

함수의 호출문에서 소괄호 안에는 함수호출 시 전달할 인자정보를 표현한다. 그리고 C언어는 큰따옴표를 이용해 문자열을 표현한다.

즉 위 문장은 "Hello world! \n"을 인자로 전달하면서 print라는 이름의 함수를 호출하는 문장이다.

( 큰따옴표로 표현되는 문자열 안에는 특수한 의미의 문자를 삽입할 수 있다. \n도 그런 특수문자 중 하나이다. 

  \n은 줄을 바꾸라는(개행)의 의미다.  줄바꿈 이라는 것만 기억하기!) 


근데 여기서 printf라는 함수를 만든적이 없는데 어떻게 호출할 수 있던 것일까?


'표준함수'란 기본적으로 제공되는 함수를 말하고, 이런 표준 함수들의 모임을 가리켜 '표준 라이브러리'라 한다. 


prinft함수는 함수호출 시 전달되는 문자열을 모니터에 출력하는 기능을 지니는 기본적으로 제공되는 함수이다. 




<헤더파일 선언의 필요성>


printf와 같은 표준함수의 호출을 위해서는 printf 함수와 관련 있는 '헤더파일 선언' 이라는 것을 해야한다. 


#include <stdio.h> <-- 이부분

int main(void)

{

printf("Hello world! \n");

return 0;

}


이는 stdio.h라는 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언인데 

저 문장의 의미를 정리하자면 

"헤더파일 stdio.h에는 printf 함수의 호출에 필요한 정보가 존재한다. 따라서 이 파일의 정보를 포함하는 헤더파일 선언문이 삽입되어야한다. 


표준 라이브러리에는 다양한 표준 함수가 존재하기 때문에 헤더파일도 다양하게 존재한다.

그래서 필요에 따라서 여러 개의 헤더파일 선언문을 삽입하기도 한다. 



-printf함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야한다.

-헤더파일의 선언은 소스파일의 맨 앞 부분, main 함수 정의 이전에 와야한다.



<return은 함수의 종료와 값의 전달(반환)이라는 두 가지 의미를 지닌다.


위에 Hello.c 예제 마지막 문장

return=0;


이를 가리켜 return문이라 하는데, 이 문장이 지니는 두 가지 의미는 다음과 같다.

-함수를 호출한 영역으로 값을 전달(반환)

-현재 실행중인 함수의 종료 


따라서 Hello.c에서는 이 문장을 실행하면서 main함수를 호출한 영역으로 0을 전달한다. 그리고 함수를 빠져나온다.

그런데 main함수의 종료는 프로그램의 종료로 이어지기 때문에 결국 프로그램이 종료가 된다. 


0을 전달(반환)하는 이유는 무엇일까?

0은 프ㅗ그램의 종료상태를 알리는 용도로 사용된다. 보통 0은 정상적인 종료의 상황에서 전달하는 값이다.



02-2) 주석이 들어가야 완성된 프로그램


주석은 선택이 아닌 필수다! 

내가 작성한 코드를 분석하는데 배려하는 수단이다. 


C언어에서 주석을 다는 방식은 두가지가 있다.


하나는 블록단위 주석으로 주석의 시작과 끝을 명시하는 방식이다.

한 줄을 주석 처리하는데도 사용이 가능하고, 

/* 주석 처리 된 문장 */


두줄 이상을 주석 처리 하는데도 사용이  가능하다.

/* 

주석 처리 된 문장 1

주석 처리 된 문장 2

주석 처리 된 문장 3

*/


마지막으로 행 단위 주석이 있다.

//뒤에 등장하는 문장은 주석으로 처리된다.


// 주석 처리 된 문장1

//주석 처리 된 문장2



주석 처리에 있어서 

/*

블록 단위 주석 안에 

// 행단위 주석은 가능하나


*/


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

/*

블록 단위 주석 안에 

/*단일 행 주석 처리*/

또 블록 단위 주석은 컴파일 오류가 발생한다.

*


*/



02-3) printf 함수의 기본적인 이해


<print 함수를 이용한 정수의 출력과 서식문자>


printf 함수를 이용해서 문자열 이외의 데이터를 다양한 형태로 출력하는 것이 가능하다. 물론 정수를 출력하는 것도 가능하다. 


printf("%n\n", 1234); 를 실행시키면 1234가 출력되는데 여기서 %d는 '서식문자(conversion specifier)'라한다. 

서식문자는 출력의 형태를 지정하는 용도로 사용된다. 출력의 형태를 지정하려면 '출력의 대상'이 있어야 하는데 함수 호출시 전달되는 인자는 

,로 구분한다. 바로 이 두 번째 전달인자가 출력의 대상이 된다. 


%d가 지정하는 출력의 형태는 '10진수 정수형태의 출력'을 의미한다. 



'Programming Language > 열혈강의c 공부' 카테고리의 다른 글

04.데이터 표현방식의 이해  (0) 2017.06.29
03.변수와 연산자  (0) 2017.06.27
01.이것이 c언어다.  (0) 2017.06.26
00.시작  (0) 2017.06.26
:
Posted by Gongdile

2017-06-26

오늘 나간 진도 


chapter 01 이것이 c언어다.

chapter 02 프로그램의 기본 구성


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

01-1) c언어는 뭐냐 

 

c언어는 프로그래밍 언어이다. 


말그대로 c언어는 프로그래밍 언어이다. 

프로그래밍 언어란 컴퓨터와의 대화에 사용되는 일종의 '대화수단'이다.


대화수단으로서 프로그래밍 언어는 다양하다. c, java, pyhon 등등등 


마치 한국어 일본어 영어 처럼 말이다. 



다른 언어체계를 익힌 사람들이 대화를 나누기 위해서는 그 사이에 공통적인 대화 수단이 마련되어야 한다.

통역가나 번역기 처럼 말이다 


여기서 compiler(컴파일러)라는 개념이 나오는데  


사람이 컴퓨터에게 명령시킬때 프로그래밍 언어로 명령을 시키면 컴파일러가 컴퓨터가 이해할수있는 기계어로 변경하여 전달한다. 


왜 굳이 컴파일러를 등장시켰냐 라고 한다면 

(사람도 컴퓨터가 인식하는 기계어를 알지 못하고 사람이 기계어를 공부하기에는 부담이 크기때문이다.

 그리고 컴퓨터에게 사람의 언어를 가르친다는 것은 아직까지 불가능하기에)


기계어(Machine Language)란 컴퓨터가 이해할 수 있는 0과 1로 구성된 언어체계이다.


<정리>


-프로그래밍 언어란 사람과 컴파일러가 이해할 수 있는 약속된 형태의 언어를 의미한다.


-컴파일러의 역할은 프로그래밍 언어로 작성한 프로그램을 컴퓨터가 이해할 수 있도록 기계어로 번역하는 역할을 한다 

-->이렇게 번역하는 일 자체를 가리켜 '컴파일(compile)'이라 한다.



01-2) c언어의 역사와 특징 


C언어의 역사와 특징을 알면  좀더 이해하기 쉽고, 이런 장점이 있구나 하고 생각해보게되서 정리한다. 


<c언어의 역사>


c언어는 1971년경에 UNIX라는 운영체제의 개발을 위해 Dennis Ritchie와 Ken Thompson이 함께 설계한 범용적인 고급(high-level)언어이다.



기존의 UNIX라는 운영체제는  '어셈블리(assembly)언어' 라는 저급(low-level)언어로 만들어졌기 때문에 하드웨어 의존도가 높았다.(=이식성이 낮다)


여기서 저급언어가 말그대로 질이 낮은 언어라고 오해하면 안된다! 저급 언어라는건 인간보다 컴퓨터에 더 가까운 언어라는 것을 뜻한다.

즉, 고급언어에 가까울수록 사람이 이해하기 쉬운언어라는것 그렇다고 해서 무조건 고급언어가 저급언어보다 좋다고 판단하는 것은 무리가 있다.

 

저급언어로 작성되었다는건 작성된 컴퓨터 하드웨어가(cpu) 이해하기 쉽게 작성되었다는 것이고, 다른 cpu에 그 프로그램을 실행하려고 하면 똑같은 기능이라도 cpu종류에 따라서 별도로 구현해야했다. (그래서 위에서 하드웨어 의존도가 높다라고 설명했다.)


여기서 CPU는 'Central Processing Unit'의 약자로 중앙처리장치 라고한다. 컴퓨터의 두뇌에 해당하는 것으로, 사용자로부터 입력받은 명령어를 해석, 연산한후 그 결과를 출력하는 역할을 한다. 


--->어셈블리언어의 단점 해결을 위해서 c언어의 개발로  어셈블리언어의 저급 언어적 특징을 지니면서 이식성도 좋은 c언어가 운영체제의 90%이상이 대      체되었다. 



<c언어의 특징>


-C언어는 절차지향적 특성을 지닌다  

절차지향이란 '정해진 순서의 실행흐름'을 중시한다. 즉 절차지향 프로그래밍에서 중심이 되는것은 순서이다.


-C언어로 작성된 프로그램은 이식성이 좋다


-C언어로 구현된 프로그램은 좋은 성능을 보인다.



01-3)C프로그램의 완성과정 


C프로그램의 완성과정을 설명하려고한다.


1.프로그램 작성

2.컴파일(Compile)

3.링크(Link)

4.실행파일 생성


순으로 프로그램이 생성된다. 


나는 Visual C++ Express Edition 2010을 기반으로 실습했고, 인터넷에 무료로 배포중이다.


C프로그램을 이루는 파일의 종류는 소스파일과 헤더파일로 나뉜다.


파일의 이름을 입력할때 주의할점은

"C언어의 소스파일 확장자는 .c가 되어야 하므로, 소스파일의 이름을 입력할 때 반드시 확장자 정보인 .c를 붙여줘야 한다."








'Programming Language > 열혈강의c 공부' 카테고리의 다른 글

04.데이터 표현방식의 이해  (0) 2017.06.29
03.변수와 연산자  (0) 2017.06.27
02.프로그램의 기본구성  (0) 2017.06.27
00.시작  (0) 2017.06.26
:
Posted by Gongdile
2017. 6. 26. 22:52

00.시작 Programming Language/열혈강의c 공부2017. 6. 26. 22:52

c언어 공부가 필요해서 구입한 책 


[열혈강의 c 프로그래밍] 


하루에 최소 chapter01씩 꾸준히 공부하려고 한다. 



'Programming Language > 열혈강의c 공부' 카테고리의 다른 글

04.데이터 표현방식의 이해  (0) 2017.06.29
03.변수와 연산자  (0) 2017.06.27
02.프로그램의 기본구성  (0) 2017.06.27
01.이것이 c언어다.  (0) 2017.06.26
:
Posted by Gongdile