상수와 데이터 표현
- 정수형 변수 : 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 |