본문 바로가기

VEDA 복습

VEDA 2일차 - C 프로그래밍

반응형

상수와 데이터 표현

  • 정수형 변수 : char(0 ~ 255), short (0 ~ 0xFFFF) , int(0 ~ 0xFFFFFFFF), long (0 ~ 0xFFFFFFFF FFFFFFFF )
  • 실수형 변수 : float, double

signed vs unsigned : 음수를 표현할 수 있냐, 없냐의 차이

부동 소수점의 표현 : 부호 비트 + 지수부 + 소수부 ( 2^지수 * 소수부 ), 유효숫자에 대해서 유의할 필요가 있다.(신뢰성)

'A' vs "A" 

하나는 문자, 다른 하나는 문장, 문장은 마지막에 \0이 숨겨져 있다. 즉 문장은 배열이다. 

컴퓨터는 숫자만 인식한다. ASCII는 문자에 대해서 숫자를 할당한 것이다.

 

변수

변수는 블럭 밖에 만드는 경우(전역 변수), 블럭 안에 만드는 경우(지역 변수)로 분류할 수 있다.

변수를 만들기 위해서는 메모리를 할당해주어야 하고, 이를 위하여 변수형을 지정해주어야 한다.

type identifier; //선언
type identifier = value; //정의

type = 변수형(float, char, etc)
identifier = {이름, 'a-z', 'A-Z' , '_', 숫자(단 숫자 시작은 안됨)}

 

storage class : 변수가 어느 메모리 영역에 할당할 지를 지정할 수 있다.(ex) static, register, auto, etc)

L value : 좌편에는 변수만 올 수 있다.

printf의 %d, %u와 같은 형식 지정자는 변수의 타입과는 다르다.

char fruit[6] = "apple";
char fruit[6] = {'a', 'p', 'p', 'l', 'e', '\0'};

결과적으로는 stack에 char 데이터가 6개가 잡힌다.
다만 컴파일러의 구현에 따라서 .rdata에 "apple"을 저장하고 있다고 할당하거나,
일일이 instruction으로 6번 반복하여 할당하는 등 달라질 수 있다.

 

***배열의 경우 일부라도 초기화 작업이 되어 있으며, 굳이 지정을 하지 않더라도 0으로 초기화하여 준다.

 

const : 원래 C++ 문법, L-value에 오지 못하게 막는다. 그런데 const는 포인터로 무력화될 수 있다.(간접 참조) -> 그래서 요즘에는 rdata 섹션에 저장시키는 등 방법 사용

 

연산자

  • operator : 연산자, 피연산자의 수에 따라서 unary, binary 등 종류가 갈린다.
  • operand : 피연산자, 연산자에 의하여 계산되는 수

++ 연산자 원리

후위 연산자 원리

++(i){
	j;
    j = i;
    
    i = i+1;
    
    return j;
}

 

C에서 참은 0외의 다른 값, 거짓은 0이다. 이러한 점을 보호하기 위해서 C++에서는 bool type을 도입하였다.

cast operator

(type)

1. implicit cast -> 컴파일러가 수행
2. explicit cast -> 유저가 수행
char fruit[20]
type identifier -> char[20] fruit
char[20]은 그러나 cast는 아니다. -> casting 연산이 안됨

 

***연산자 우선 순위

  • 산술 연산은 우선 순위가 같으면 왼쪽에서 오른쪽
  • 대입 연산은 우선 순위가 같으면 오른쪽에서 왼쪽
  • 단항 연산은 우선 순위가 같으면 오른쪽에서 왼쪽

 

조건문

if - else if - else, switch - case 두 방식이 대표적이다. 간단한 경우 (condition ? true : false)도 괜찮다. 

하드웨어가 많이 발전해서 성능 중심의 뒤틀린 코드보다는 클린한 코드가 선호된다.

 

switch-case의 condion은 정수이다. break가 없으면 switch 블럭은 참인 부분을 기점으로 블록이 끝날때까지 모두 실행된다.

 

반복문

while, do-while, for로 구성되어 있다.

scope of variable : global scope, local scope, function scope(argument, local scope와 유사하다), for scope(원래 C에는 없음, C99부터 C++에서 넘어온 문법)

break, continue : 제어 담당, 각각 블록을 탈출하거나, 현재 작업을 건너뛰고 새로운 반복을 시작한다.

 

함수

함수 구조
type funcname(argument){
		@function body
    @block head - declare
    @block body - process
}

 

void : void는 타입이 아니다.(캐스팅이 안된다.) 함수에서 void는 return이 없다는 것을 의미한다.

함수의 호출 : 함수가 호출되면 argument들을 복사하여(주소 참조 방식이 아닌 값 복사) 함수의 argumet 자리에 채워준다. 컴파일러에 따라서 다르겠지만 함수의 argument들은 register에 저장된다. 

 

재귀 호출 : 함수의 결과가 다시 입력으로 들어가는 함수, 위험성이 있음(Stack overflow)-탈출 조건이 필요함, 그럼에도 재귀를 잘 쓰면 깔끔한 코드의 작성이 가능하다.

 

***배열***

배열 : 메모리 상에 동일한 타입의 데이터들이 늘어져 있는 상태

배열 초기화의 초기화 : 순서대로 초기화, 정의하지 않은 부분은 0으로 초기화, 초기화시 배열 요소의 수를 생략할 수 있다.

포인터에 대한 백그라운드가 필요하다.

 

***포인터***

포인터 : 변수가 할당된 메모리의 시작 주소를 저장한다.

const를 사용한 포인터 : const는 L-value의 값이 바뀌는 것을 막는다.

 

반응형

'VEDA 복습' 카테고리의 다른 글

VEDA 4일차 - C 프로그래밍  (0) 2025.03.20
VEDA 3일차 - C 프로그래밍  (0) 2025.03.19
VEDA 1 일차 : C 프로그래밍  (0) 2025.03.17