본문 바로가기
깨알 c언어

깨알 c언어 ch.1 ~ 5

by moca7 2024. 2. 21.

01. 프로그래밍이란?

02. 컴파일러 & 인터프리터

03. 변수

04. 변수의 종류와 유효범위

05. 산술연산자

 

 

 

01. 프로그래밍이란?

 

ㅁ 프로그램 동작 과정

 

 선언 -> 입력 -> 처리 -> 출력

 

 - 모든 프로그램이 똑같은 과정을 거친다.

 

ㅁ scanf("%d%d", &age1, &age2);

- scanf: 입력을 받는 함수

- %d%d: 정수 2개를 받겠다.

- age1, age2: 라는 공간에 값을 집어 넣겠다.

 

ㅁ 변수 선언

 - 입력받기 위한 공간을 만드는 것.

 

 

02. 컴파일러 & 인터프리터

 

- 두 개가 하는 역할은 같다.

- 컴퓨터는 0과 1만 안다. 그래서 컴퓨터가 알아들을 수 있게 번역해 주는 것.

- 컴파일: 인간이 만든 고급언어를 컴퓨터가 해설할 수 있는 저급언어로 번역.

- 컴파일러든 인터프리터든 번역하는 걸 컴파일 한다고 함.

 

ㅁ c언어 컴파일 과정

- c언어는 int/void main()으로 시작함. 그런데 이 안엔 내가 만들지 않은 printf, scanf같은 함수가 있음.

내가 만들지 않았는데 어떻게 가능하냐. 맨 위에 #include<stdio.h>이 있음. 

stdio.h는 standard input/output library의 약어로서, c언어 표준 라이브러리 함수가 포함된 헤더 파일이다.

미리 만들어진 많이 쓰이는 함수들을 쓸 수 있게 해주는 게 전처리기.

- c언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시파일(소스파일)이라고 함.

c언어를 통해 작성된 소스파일의 확장자는 .c이다.

- .c파일을 전처리기 돌리면 .i가 됨. (전처리기: 전처리 구문을 처리함.)

- .i파일을 컴파일러 돌리면 .s가 됨.  (컴파일러: 고급어를 저급어로 변환. 기계어와 가깝다)

- .s파일을 어셈블러 돌리면 .o가 됨. (어셈블러: 완전히 기계어로 바꾸어주는 역할)

- 프로그램이라는 것은 여러 파일들이 합쳐진 것. 여러 .o파일들을 엮어주는게 링커다.

- .o파일들을 링커로 묶어주면 .exe 실행파일이 됨. (링커: 여러 개의 오브젝트 파일을 합치거나 라이브러리르 합침)

- c i s o 전 컴 어 링

 

ㅁ 컴파일러, 인터프리터, 어셈블러

(1) 컴파일러

- 고급언어로 작성된 프로그램을 컴퓨터에서 실행하기 위해 컴퓨터가 이해할 수 있는 언어로 번역해주는 것.

- 전체를 번역하므로 번역시간이 오래 걸리지만, 한 번 번역한 후에는 다시 번역하지 않으므로 실행속도가 빠름.

- 종류: c, c++, java 

 

(2) 인터프리터

- 고급언어로 작성된 프로그램을 한 줄 씩 읽어 들여서 실행하는 프로그램. (얘는 통역)(컴번인통)

- 번역과 실행이 동시에 이루어지므로, 별도의 실행파일이 존재하지 않음.

- 종류: ruby, php, javascript, basic

 

(3) 어셈블러

- 어셈블리어를 기계어 형태의 오브젝트 코드로 해석해 주는 컴퓨터 언어 번역 프로그램을 말한다

- 위의 c언어 컴파일 과정의 어셈블러랑 다름.

 

 

03. 변수

 

ㅁ 변수

- 데이터를 저장할 수 있는 메모리의 기억 공간.

 

ㅁ 변수 생성 규칙 및 특징

- 예약어(키워드)는 사용할 수 없다.

- 공백(띄어쓰기)을 포함할 수 없다.

- 첫 글자는 영문과 언더바(_)만 사용 가능하다. 숫자 사용 불가.

- 언더바(_) 이외의 특수문자는 사용할 수 없다. 미들바(-) 안됨.

- 대소문자를 구분한다. (자바와 c는 대소문자를 구분함)

 

ㅁ c언어 데이터 타입(자료형)

 

ㅁ java 데이터 타입(자료형)

 

 

ㅁ 변수 선언

- int 변수명;

- int 변수명 = 초기값;

 

 

04. 변수의 종류와 유효범위

 

ㅁ 변수의 종류 4가지

- 지역변수: 지역 안에서만 쓰는 거

- 전역변수: 공동으로 쓰는 거

- 정적변수: 공동으로 쓰는 거

- 동적변수: 그때 그때 만들어 쓰는 거

 

ㅁ 지역변수

- 함수나 블록({~~}) 안에서 선언하는 변수

- 함수나 블록의 종료와 함께 메모리 상에서 소멸

- 초기값이 없으면 쓰레기 값이 들어감(뭔 값인지는 모르는 이상한 값)

- 스택 영역에 저장이 된다.

 

void main(){

 if(1){

   int num1 = 10;

   printf("%d", num1);

 }

 printf("%d", num1);

}

 

num1은 if문 블록 안에서만 쓸 수 있음. 2번째 printf문 때문에 오류가 뜸. 

 

ㅁ 전역변수

- 함수 블록 밖에서 선언하며 전체 함수에 영향을 미친다.

- 프로그램이 종료될 때 메모리 상에서 소멸

- 초기값이 없으면 0 값이 들어감

- 데이터 영역에 저장됨.

(특징은 그렇구나 하고 보시면 돼요)

 

-

int num1;

void main(){

 num1 = 10;

 printf("%d", num1);

 func();

 printf("%d", num1);

}

void func(){

 num1 = 20;

}

 

main이란 함수가 있고, func라는 함수가 있음. 근데 저 둘에 속하지 않고 num1이라는 전역변수가 선언되어 있음. 

0들어가 있음. 

출력결과: 1020 (%d 뒤에 \n이 없으니)

func라는 함수가 실행되서 num1이 20으로 선언됨.

 

ㅁ 정적변수

- static으로 선언되며 선언된 블록 내에서만 사용가능

- 함수가 종료되어도 소멸되지 않고, 값이 그대로 유지됨.

- 프로그램이 종료될 때 메모리상에서 소멸

- 초기값이 없으면 0이 입력되고, 단 한번만 초기화 된다.

- 데이터 영역에 저장됨.

 

-

void main(){

 add(10);

 add(5);

 add(3);

}

int add(int i){

 static int sum=0;

 sum = sum + i;

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

}

 

main이란 함수가 있고 add라는 함수가 있음. main에서 add(10)이란 함수를 호출함.

add(5)실행, sum이라는 변수를 또 선언함. 근데 정적변수라 메모리 상에 sum=10으로 남아 있음. 

그럼 어떻게 되냐. 무시해버림.  static int sum=0; 무시됨.

출력결과:

sum:10

sum:15

sum:18

 

ㅁ 동적변수 

- 메모리 동적할당으로 생성되는 변수

- run time 시간에 메모리를 할당(exe파일 눌러서 실행되어 있으면 그때가 런타임이다)

- 동적 기억장소에 할당하여 메모리 낭비를 피하려는 목

- 무조건 포인터를 사용해야 함

- 힙 영역에 저장

(동적변수는 그때그때 만들어지는 거다 라고만 알아두시면 돼요)

(malloc이란 걸로 선언. 나중에 배열, 포인터 할 때 나옴)

 

 

05. 산술연산자

 

ㅁ 산술연산자 종류(일부만)

- 이항 연산자: +, -, *, /, %

- 단항 연산자: ++, --

- 대입 연산자: =, +=, -=, *=, /=, %= 

 

- c언어에서 정수 나누기 정수는 정수입니다. 소수점 x. 5/3은 1이다. 3/4는 0이다.

정수 나누기 실수는 실수. 실수 나누기 정수는 실수.

 

ㅁ 아래 c프로그램의 실행 결과는?

#include<stdio.h>

void main(){

 int a, b;

 a = 4 * (1/2);

 b = a++;

 printf("%d", b);

}

 

실행결과는 0. 

 

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.26 ~ 30  (0) 2024.03.08
깨알 c언어 ch.21 ~ 25  (0) 2024.02.22
깨알 c언어 ch.16 ~ 20  (0) 2024.02.22
깨알 c언어 ch.11 ~ 15  (0) 2024.02.22
깨알 c언어 ch.6 ~ 10  (0) 2024.02.21