1. 프로그램 만들기
1.1 컴파일 과정 3단계
1) 1단계 전처리
사용자가 작성한 소스파일을 처음에 가공하는 과정이다. #include가 전처리 지시자이며 이후에 작성하는 <stdio.h> 등의 헤더 파일, 즉 라이브러리를 불러올 수 있다. 이로써 외부에 있는 함수를 직접 정의하지 않아도 사용할 수 있다. 전처리 과정은 주로 소스 파일을 컴퓨터에 맞게 편집하는 일이므로 파일의 형태에는 변화가 없습니다.
2) 2단계 컴파일
전처리가 된 소스 파일은 컴파일 과정을 거쳐 기계어로 변환된다. 변환된 것은 개체 파일이라고 하며, CPU가 해석할 수 있는 기계어로 된 명령어들로 이루어져 있지만 바로 실행할 수는 없다. 프로그램은 운영체제에 의해 실행되어서 설치된 운영체제가 인식할 수 있는 형태로 바꿔야 한다.
3) 3단계 링크
이 프로그램을 운영체제가 읽기 위해 startup code를 결합하는 과정이 필요한데, 이를 링크라고 한다. startup code는 프로그램을 실행하기 전에 필요한 준비 작업을 수행하며, main 함수를 호출하여 우리가 작성한 프로그램의 코드가 실행되도록 한다. 따라서 프로그램에는 항상 main 함수가 있어야 한다.
2. 상수와 데이터 출력
2.1 main 함수 구조
main 함수는 머리와 몸통으로 이루어져 있으며, 머리는 함수 원형이라고도 한다.
2.2 다음 줄로 이동하는 개행문자 \n
커서의 위치에 상관 없이 줄을 바꾸게 된다. 특별한 경우가 아니라면 printf() 함수를 사용할 때 문자열의 끝에 항상 붙이는 습관을 들이도록 하자.
2.3 제어 문자의 종류
제어 문자 | 의미 | 기능 |
\n | 개행 new line | 줄을 바꾼다. |
\t | 탭 tab | -출력 위치를 다음 탭 위치로 옮긴다. -tab은 8 단위로, 다음 탭 위치로 옮길 때 항상 정해진 다음 tab 위치로 이동한다. |
\r | 캐리지 리턴 carriage return | 출력 위치를 줄의 맨 앞으로 옮긴다. |
\b | 백스페이스 back space | 출력 위치를 한 칸 왼쪽으로 옮긴다. |
\a | 알럿 경보 alert | 벨 소리를 낸다. |
2.4 아스키 코드
아스키 코드는 컴퓨터에서 필요한 128개의 문자를 코드화했으며, 여기에는 영문 대문자, 소문자, 아라비아 숫자, 특수 문자, 제어 문자 등이 포함된다.
2.5 상수가 컴파일된 후의 비트 형태
상수 종류 | 크기(byte) | 크기(bit) | 바뀌는 형태 |
정수 | 4 | 32 | 2진수 |
실수 | 8 | 64 | IEEE 754 표준 double 형 |
문자 | 4 | 32 | 아스키 코드 값과 같은 2진수 |
2.6 음수의 변환
1) 절댓값 변환
2) 2진수로 변환
3) 0과 1을 바꿈(1의 보수)
4) 1을 더함(2의 보수)
ex) 10과 -10을 더하게 되면 결과값에서 자리올림을 하여 정해진 메모리 넘어로 넘어간다. 그렇게 0이 된다.
2.7 2, 8, 10, 16진수의 변환
1) 10진수 => 2진수
10진수의 수를 2로 나머지가 0이 나올 때까지 나누고, 그 나머지를 마지막부터 나열하면 그것이 해당 숫자의 2진수이다.
ex) 10진수 : 65, 2진수 : 1000001
2) 2진수 => 8진수
8 = 2^3이므로 2진수의 3개의 비트 값이 8진수의 한 개의 비트의 값과 동일하다. 그러므로 2진수의 비트를 처음부터 차례대로 3개 씩 묶어서 값을 더하면 8진수의 값이 된다.
ex) 2진수 : '001''000''001', 8진수 : 101 (2진수 값을 세 개씩 묶었다는 것을 보여주기 위해 작은 따옴표를 사용함)
3) 2진수 => 16진수
8 = 2^4 2진수의 4개의 비트 값이 16진수의 한 개의 비트의 값과 동일하다. 바로 위의 과정과 동일하지만, 2진수의 비트를 처음부터 차례대로 4개 씩 묶어야 한다.
ex) 2진수 : '0100''0001', 8진수 : 41
3. 변수와 데이터 입력
3.1 정수 자료형
1 byte: char
2 byte: short
4 byte: int
4 byte: long
8 byte: long long
3.2 정수 자료형 특징
1) 특별한 경우가 아니라면 정수형은 int를 사용한다. short는 int보다 2 byte 메모리의 크기가 적지만 연산과정에서 int형으로 변환되기 때문에 실행속도가 느려질 수 있다.
2) long형은 int형이 2바이트로 구현된 컴파일러일 때만 사용한다. 서로 크기가 같은 컴파일러라면 더 이상 long을 사용할 필요가 없다. sizeof(int)를 사용해보기!
3.3 unsigned 정수 자료형
정수형은 보통 양수와 음수를 모두 저장하지만, 양수만을 저장하면 두 배 더 넓은 범위의 값을 저장할 수 있다. 따라서 양수값만 필요한 나이나 몸무게 같은 값을 저장할 때는 unsigned를 사용한다. unsigned가 없으면 자동으로 signed로 선언된다. 하지만 큰 양수를 저장하고, &d로 출력하면 음수가 출력될 가능성이 있으며, 음수를 저장하고 %u로 출력하면 양수가 출력된다. %d는 부호 비트를 고려하고, %u는 부호 비트를 고려하지 않기 때문이다.
3.4 실수 자료형 특징
1) 정수형을 기본으로 사용하고, 실수형은 꼭 필요한 경우에만 사용한다.
2) 실수형은 유효 숫자가 많은 double형을 기본으로 사용한다.
3.5 문자열 저장
문자열을 저장할 배열의 크기는 문자열의 길이보다 하나 더 크게 잡아야 한다. 왜냐하면 컴파일러가 문자열의 끝에 \0(널 문자)를 자동으로 추가하기 때문이다.
3.6 배열에는 대입 연산자(=)를 사용할 수 없습니다.
대입 연산은 대상 자료형의 크기가 일정해야 하는데 선언에 따라 크기가 달라지는 char 배열은 대입 연산을 사용할 수 없다. 또한 배열명은 주소 상수이므로 변수만 가능한 대입 연산자 왼쪽에 쓸 수 없다. 이는 뒤에 배울 포인터 밴수를 이용하여, 변수의 성질을 사용해야 한다. 배열명은 상수의 성질을 갖고 있다.
그래서 char 배열에 새로운 문자열을 저장하려면 <string.h> 헤더파일 안에 있는 stcpy 함수를 사용해야 한다.
함수 사용법: stcpy(변수명, "변환할 문자열");
참고로 메모리에 직접 접근하는 함수(gets, strcpy, scanf 등)는 보안 에러를 불러 일으킬 수 있는데, 전처리 과정에서 해석할 #define _CRT_SECURE_NO_WARNINGS를 가장 위에 붙이면 해결된다. scanf_s 함수의 사용을 VC++ 컴파일러에서 권장하기는 하지만 다른 컴파일러에서 호환성 문제가 생길 수 있다.
3.7 예약어와 식별자
예약어는 컴파일러와 사용 방법이 약속된 단어이고, 식별자는 사용자가 만들어 사용하는 단어이다. 식별자는 다음과 같은 규칙이 있다.
1) 알파벳 대문자, 소문자, 숫자 그리고 밑줄(_)로 만든다. 즉 중간에 빈칸 띄어쓰기가 안 된다.
2) 숫자로 시작할 수 없다.
3) 대문자와 소문자는 서로 다른 식별자로 인식한다.
4) 예약어는 식별자로 사용할 수 없다.
3.8 scanf 함수를 이용한 데이터의 입력
1) scanf 함수로 입력 받는 값을 어떤 데이터로 변환할 것인지는 변환 문자를 통해 결정한다.
2) 두 개 이상의 값을 한 번에 입력 받으려면 변환 문자들을 이어서 나열하며, 변수 사이는 콤마로 구분한다.
3) 문자열을 입력할 때에는 배열명에 &기호를 붙이지 않는다.
4) 스페이스나 엔터, 탭 등을 만나면 바로 전까지만 저장된다. 즉 공백 없이 연속으로 입력해야 한다.
5) 한글은 2바이트, 영문은 1바이트 문자이다.
6) char형 변수를 scanf 함수로 입력할 때는 %c 변환 문자를 사용해야만 한다. printf 함수에서는 아스키 코드를 숫자로 인식 가능하여 %d로 출력 가능하지만, 주소연산을 하는 scanf 함수는 %d를 사용할 때 할당하지 않은 메모리를 침범하기 때문에 문제가 발생한다.
'C언어' 카테고리의 다른 글
[백준] 2588번 : 곱셈 c언어 (0) | 2021.08.27 |
---|---|
[혼자 공부하는 c언어] 9장 포인터 정리 (0) | 2021.08.26 |
[모두의 C언어] <2장> 3주 동안 C언어 부시기 요약(7월 1일~7월 21일) (0) | 2021.07.16 |
[모두의 C언어] <1장> 3주 동안 C언어 부시기 요약(7월 1일~7월 21일) (0) | 2021.07.16 |
[모두의 C언어] 210702 C언어 공부 (0) | 2021.07.02 |