Chapter 1 : 언어 소개
1.1 시작
-
프로그램 실행 과정
- 프로그램이 들어 있는 텍스트 파일 작성
- 파일 컴파일
- 링크
- 실행
-
UNIX 에서는
cc filename명령어로 컴파일 -
함수의 이름은 원하는 대로 붙일 수 있지만 주프로그램(서브루틴이 아닌)의 이름은 꼭 main이라고 해줘야 함
-
함수들 사이에 데이터가 오고 갈 때는 매개변수를 사용
- 매개변수는 함수 이름 바로 뒤에 오는 괄호 속에 써야함
- 매개변수가 없을 때도 괄호는 꼭 써야함
-
중괄호
{ }는 문장들을 묶어서 하나의 덩어리(복합물 또는 블록)로 만들어 주는 역할 -
함수를 호출할 때 그 함수의 이름과 매개변수만 써 주면 됨
-
인용부호
“ “속에 있는 문자들은 “문자열" 또는 “스트링 상수"라고 불림 -
인용부호 사이에서는 줄을 바꿔 쓰면 안됨
-
\n에서 사용되는 \ 는 escape 문자로 출력의 양식을 정해주는 역할
1.2 변수와 수식 표현
/* */는 설명문으로 사이에 있는 모든 문자는 프로그램의 실행에 아무 영향을 미치지 못함- 프로그램 중간중간에 이런 설명문을 넣어서 프로그램을 알기 쉽게 하면 좋음
- 한 행 또는 여러 행을 차지할 수도 있고, 명령어의 뒤에 쓸 수도 있음
- C에서는 모든 변수는 사용되기 전에 선언해 주어야 함
- 변수를 선언해 주지 않으면 에러가 생김
- 변수를 선언해주면 프로그램 중간에 변수 이름 오타로 인한 에러를 막을 수 있음
- 변수형
- int : 정수형
- float : 실수형, 부동소수점형
- char : 문자형, 1바이트
- short : 단정도 정수형
- long : 배정도 정수형
- double : 배정도 부동소수점형
- 변수형들의 정밀도는 기종에 따라 다름
- ex) PDP-11에서 int는 16비트 부호 숫자(-32786 ~ 32767)
- 배열(array), 구조체(structure), 유니온(union), 포인터(pointer), 함수(function)
- 프로그램의 구조를 알기 쉽게 하기위해 들여쓰기(indentation)을 함
- 몇 칸을 넣느냐는 전혀 상관이 없음
- C언어 자체에는 입출력 기능이 없음
printf는 표준 입출력 라이브러리에 들어 있는 함수. C언어 자체에 포함되어 있는 명령어가 아님
1.3 for 문
- for 문 구조
- 첫 번째 부분은 루프의 내용이 실행되기 전에 한 번만 실행됨
- 두 번째 부분은 조건을 나타내고 이 조건이 만족되면 몸체 부분이 실행됨
- 두 번째 부분이 실행되고 세 번째 부분이 실행되고 두 번째 부분의 조건이 맞는지 검사함
1.4 상수 정의
#define으로 상수를 정의함- 상수는 변수와 달리 프로그램 내에서 항상 같은 값을 가짐
- 상수는 숫자뿐만 아니라 문자나 문자열(string)도 될 수 있음
- 보통 변수 이름은 소문자, 상수 이름은 대문자로 씀
#define뒤에는 세미콜론을 붙이지 않음
1.5 문자 입출력
- 문자들로 이루어진 파일이 있을 때 표준 입출력 라이브러리 함수를 사용하여 처리를 할 수 있음
- 파일은 여러 개의 행으로 이루어져 있고 한 행에는 여러 개의 문자가 있음
- 행과 행 사이에는 새로운 행의 시작임을 알려주는 기호가 있음 (개행 문자)
- 파일의 맨 끝에는 파일의 끝임을 알려주는 기호가 있음 (EOF)
- C로 파일을 처리하는 프로그램을 작성할 때 행의 길이나 파일의 길이는 신경쓰지 않아도 됨
- getchar와 putchar
- getchar : 문자 하나를 받아들이는 함수
- putchar : 문자 하나를 출력하는 함수
- putchar에 정수형 변수를 넣으면 해당 ASCII 값에 해당하는 문자가 출력됨
1.5.1 파일의 복사
-
getchar와 putchar를 사용하면 입출력 구조를 몰라도 입출력 프로그램을 작성할 수 있음
-
입력을 그대로 출력으로 내보내는 프로그램
- 문자를 읽어 들임
- while (문자가 파일의 끝을 나타내는 기호가 아닌 동안)
- 문자를 출력
- 다음 문자를 읽음
-
EOF
-
프로그램에서 파일의 끝을 나타내는 기호
-
파일의 끝을 나타내는 기호는 -1 또는 0
-
#define EOF -1또는#define EOF 0을 써주어야 함 -
EOF의 값은
<stdio.h>에서 정의하고 있음 -
EOF는 문자가 아니므로 ASCII에 지정되어 있지 않음
-
EOF를 인식하기 위해 getchar의 변수를 정수형으로 선언
-
-
≠는 =보다 우선순위가 높음
1.5.2 문자의 개수 세기
- ++n :
n = n + 1과 같음 - ++n는 n을 사용하기 전에 1을 증가시키고 n++는 사용 후에 1을 증가시킴
1.5.3 행의 개수 세기
- 파일의 각 행 사이에는 행을 바꾸는 기호(\n)가 들어 있음
- 행의 개수를 세기 위해 \n의 개수를 세면 됨
- while문의 몸체에는 if문이 들어 있음
- if 뒤의 괄호 속 조건이 만족되면 그다음 문장(중괄호)이 실행됨
- 만족되지 않으면 그냥 그다음으로 넘어감
- 문자에 작은따옴표를 붙이면 그 문자에 해당하는 값을 얻을 수 있음
- ASCII 문자를 사용하는 컴퓨터의 경우 ‘A’는 65와 같음
- ASCII 이외의 문자에서는 A의 값이 65가 아니므로 A를 나타내기 위해 65를 사용하는 것은 추천하지 않음
- C에서 문자를 표현할 때는 작은따옴표를 사용
- 문자열을 사용할 때는 큰따옴표를 사용
1.5.4 단어 개수 세기
- &&나 ||로 연결된 조건들은 왼쪽에서부터 검사됨
1.6 배열
- C에서 배열의 첨자는 0부터 시작됨
- 첨자는 정수형 변수, 정수형 상수, 정수 수식도 가능
1.7 함수
- 프로그램 내에서 여러 번 해야 할 동작을 하나의 함수로 만들어두면 그 함수의 내부가 어떻게 되었는지 몰라도 그 동작을 시킬 수 있음
- C에는 제곱계산을 위한 연산자가 없으므로 함수로 처리해야함
- 함수들은 어떤 순서로 기록되어 있어도 상관 없음
- main과 같은 파일 내에 있어도 되고 다른 파일에 들어 있어도 됨
- C에서 변수는 그 함수 내에서만 의미를 가짐
- 한 함수에서 i의 값을 아무리 바꾸더라도 다른 함수의 i는 바뀌지 않음
- 함수를 호출할 때 쓰는 매개변수 : augument 혹은 actual argument
- 함수 내에서는 매개변수 : parameter 또는 farmal augument
- 함수의 연산 결과를 나타내는 문장 return문
- return의 뒤에는 변수가 올수도, 수식이 올 수도 있음
- main에서의 return문은 프로그램이 정상적으로 끝나도록 확인해 주는 것
1.8 매개변수 값 전달
- C가 다른 언어와 크게 다른 점 중 하나는 함수를 호출할 때 매개변수의 값을 전달해 주는 방법임
- main 함수의 i와 다른 함수의 i가 별개의 것인 이유
- 함수를 호출할 때 변수명을 넘겨주는 것이 아니라 값만 넘겨주기 때문
- 변수명을 넘겨주는 것을 “call by reference”
- 값을 넘겨주는 것을 “call by value”
- C에서는 호출된 함수가 변수의 값을 변화시킬 수 없음
- call by value를 사용하면 변수를 적게 사용할 수 있어 더 간결한 프로그램을 짤 수 있음
- 지역(local) 변수 : 함수 내에서만 변화시킬 수 있는 변수
- 함수에서 그 함수 바깥에 있는 변수 값을 변화시키는 방법
- 포인터 사용
- 배열
1.9 문자 배열
- C에서 가장 많이 사용되는 배열은 문자 배열
- getchar() : 한 문자만 가져옴
- 문자열의 끝에는 ‘\0’이 붙어있음
1.10 외부변수
- 지역변수는 또 다른 말로 자동(automatic)변수라고도 부름
- 여러 함수에서 공통으로 사용하는 변수를 공통(global)변수라고 함
extern이라는 명령어를 사용하여 공통변수를 정의- ex)
extern int max;
- ex)
- 공통변수는 함수의 바깥에서도 정의해야하고 그 변수를 사용하는 각 함수에서도 정의되어야 함
- 공통변수를 사용하는 함수가 공통변수 선언과 같은 파일에 들어 있는 경우에는 함수내에
extern선언을 해주지 않아도 됨 - 라이브러리의 함수의 공통변수를 선언하는 방법
#include <stdio.h>를 선언하면 라이브러리에 있는 함수에서 사용되는 공통변수는 다 선언됨
- 공통변수를 사용하면 함수의 매개변수 부분이 없어 편리함
- 하지만 변수를 혼동하기 쉽고 일반성이 줄어들음
