C프로그램은 식별자에 카테고리를 지정하여 구분 가능.
ex) using namespace std(standard);
컴퓨터에게 명령을 내리는 것. 세미 콜론으로 구문을 구분.
구문에 사용되는 여러 C언어의 요소는 식별자에 의해 구분된다.
이렇게 작성한 구문은 main 함수에서 시작된다.
선언을 제외하고 모든 구문은 레이블이 될 수 있음.
사용자에게 정보를 제공하는 문서. 코드의 의미를 설명할 때 사용.
Why? 왜 이 코드를 작성했는지 설명할 때.
C프로그램에서 메모리, 데이터를 조작하는 영역. 객체는 선언을 통해 생성.
객체에 저장된 이진수나 식에서 평가된 이진수의 해석.
정수(Integer) : 정수에는 signed char, short, int, long, long long이 있다.
위의 타입들은 부호를 가지고 있으며, MSB를 부호비트로 사용해 0이면 양수, 1이면 음수로 취급. 부호를 사용하고 싶지 않다면 unsigned를 사용.
- MSB(Most Significant Bit) : 이진수에서 가장 큰 비트.
실수(Floating-point) : 실수 표현을 위해 부동 소수점으로 표현하고 IEEE - 754 포맷을 사용.
float타입을 많이 사용. float, double, long double
- float : 유효숫자 6자리
- 유효 숫자 : 어떤 측정값이 있을때 그 측정값의 정확도에 영향을 주는 숫자.
- IEEE - 754 : 비트를 부호, 지수, 정규화된 가수 부분으로 나눠 표현하는 방식.
문자(Character) : char타입을 사용, 아스키코드로 해석.
반드시 초기화를 하는 습관을 들이자.(초기화를 하지 않아, 오류가 나는 경우가 많음.)
여러 데이터를 담을 수 있는 객체. 상수나 리터럴, 혹은 식의 결과값을 넣어준다.
ex) int 타입의 number 객체를 정의하고, 10으로 초기값을 지정.
int number = 10;
- 실행 중간에 값을 바꿀 수도 있다.
number = 20;
int number2 = number;
number = 42; // 10진수
number = 052; // 8진수
number = 0x2a; // 16진수
number = 0X2a; // 16진수
number2 = 42; // int
number2 = 42U; // unsigned int
number2 = 42L; // long
number2 = 42UL; // unsigned long
number2 = 42LL; // long long
number2 = 42ULL; // unsigned long long
double realNumber = 1.2;
realNumber = 1.2e3; // 지수 표현법으로 1.2 * 10^3이다.
- 부동 소수점 상수의 타입은 아래와 같다.
realNumber = 1.2; // double
realNumber = 1.2f; // float
realNumber = 1.2L; // long double
- 문자 상수는 ''으로 표현한다.
char ch = 'a';
리터럴 : 문자 그대로의.
printf( ); scanf( );
타입에 따라 읽어들일 수 있는 비트의 수가 다르기 때문에, 타입을 잘 알아야함.
입력 형식을 잘 맞춰주지 않으면 쓰레기값으로 출력이 제대로 되지 않을 수 있다.
flags
ASCII : graphical , Non - graphical
& : 데이터 주소를 알아야 할 때. (address)
데이터를 다른 타입으로 해석 하는 것. ex) 정수형 데이터를 가지고 실수를 얻어내야 할 때.
암시적 변환(Implicit) : 피 연산자의 타입이 연산자의 결과 타입과 매치되지 않을 때.
데이터를 보존할 수 있는 쪽으로 변환이 일어남.
명시적 변환(Explicit) : 데이터 손실이 일어날 수 있다. (캐스팅 Casting)
상수(Constant) : 데이터가 변하지 않는 객체.
while : 반복 횟수를 파악할 수 없을 때 유용.
do-while : 맨 뒤에 세미콜론이 붙음에 주의. 평가를 나중에 해야할 때 용이.
for : 유효한 반복 횟수가 있을 때 유용.
for (init-clause; cond-expression; iteration-expression)
- EOF(End Of File) : 파일의 끝.
break
continue
const 사용 불가능
index가 0부터 시작함.
char 타입의 배열. 문자열의 끝은 널 문자로 판단함.
<ctype.h> : 알파벳 체커.
<stdlib.h> : string을 다른 타입으로 바꿔줌
<string.h> : string 조작
데이터를 메모리 주소값으로 해석.
메모리에 접근 하는 방법
Pointer Type의 크기 - x86 = 4Byte, x64 = 8Byte.
쓸 수 있는 연산자 : +, -;
주소 연산(Address Operation) : + 만큼 뒤로, - 만큼 앞으로
pointer to int -> int의 크기만큼 주소연산.
*P++ => 역참조한 후, 주소연산.
*++P => 주소연산 후, 역참조.
패딩 : 멤버의 정렬요건 중 가장 큰 값으로 맞춤. 패딩을 줄이려면 크기가 작은 것부터 큰 순서대로, 혹은 큰 것부터 작은 순서대로 정렬, 가장 최소한의 패딩바이트를 얻음.
<assert.h> : 반정문. 입력이 조건에 맞는 지 확인해줌. 디버그 모드에서만 동작한다. 조건에 맞지 않는 코드가 존재하지 않아야 할 때 사용.
<ctype.h> : 캐릭터 타입에 관련된 라이브러리.
<float.h> : 부동소수점의 한계를 정리한 라이브러리.
<limits.h> : 정수의 한계를 정리한 라이브러리.
<math.h> : 다양한 수학적인 계산을 지원하는 라이브러리.
<stdarg.h> : 가변인수를 만드는 라이브러리.
<stdbool.h> : 불리언 함수. 불리언 타입으로 참과 거짓을 표현할 수 있음.
<stddef.h> : 데이터타입의 값을 표준으로 정해주는 라이브러리.
<stdint.h> : 정수의 크리를 정하는 타입 지원 라이브러리.
<string.h> : 문자열 사용 관련 라이브러리.
<time.h> : C의 날짜 시간 관련 라이브러리.
<stdlib.h> : 여러가지 도구를 사용하게 하는 표준 라이브러리.
1.파일을 다루기 위한 객체 생성
2.파일을 연다.
1) 텍스트 파일 : 텍스트 에디터로 열 수 있는 파일.
2) 바이너리 파일 : 그 외 모든 타입의 파일.
파일을 조작한다.
fputs() / fputc( ) / fprintf() -> 텍스트 파일에 작성할 수 있는 함수.
fwrite() -> 바이너리 파일에 작성할 수 있는 함수.
fgets() / fgetc( ) / fscanf() -> 텍스트 파일에 읽어들일 수 있는 함수.
fread() -> 바이너리 파일에 읽어들일 수 있는 함수.
파일을 닫는다.
Heap : 동적 할당 영역 -> malloc()
Stack : 정적 할당 영역 -> 함수, 이미 얼마나 메모리를 사용해야 할 지 알고 있다.
스택 프레임 : 함수와 관련된 데이터. 임시 데이터, 매개 변수, 반환 주소로 구성되어 있음.
호출 규약 (x86 Achitecture)
cdecl : C의 기본 호출 규약. 오른쪽에서 왼쪽으로 인자를 스택에 넣음. 호출자가 스택 정리를 하기에 가변인자 사용 가능, stdcall보다 실행 파일의 크기가 큼.
__stdcall : Win32 API함수에서 사용. 오른쪽에서 왼쪽. 피호출된 함수가 스택 정리 하기에 가변인자 사용 불가능.
__fastcall : 첫 2개의 인자 까지는 순서대로 ECX와 EDX 레지스터에 저장. 나머지 인자는 오른쪽에서 왼쪽으로 스택에 넣음. 피호출된 함수가 스택 정리.