Kernighan의 C언어 프로그래밍

Chapter 1 : 언어 소개

1.1 시작

  • 프로그램 실행 과정

    • 프로그램이 들어 있는 텍스트 파일 작성

    • 파일 컴파일

    • 링크

    • 실행

  • UNIX 에서는 cc filename 명령어로 컴파일

  • 함수의 이름은 원하는 대로 붙일 수 있지만 주프로그램(서브루틴이 아닌)의 이름은 꼭 main이라고 해줘야 함

    Coroutine(코루틴)과 Subroutine(서브루틴)의 차이

  • 함수들 사이에 데이터가 오고 갈 때는 매개변수를 사용

    • 매개변수는 함수 이름 바로 뒤에 오는 괄호 속에 써야함

    • 매개변수가 없을 때도 괄호는 꼭 써야함

  • 중괄호 { }는 문장들을 묶어서 하나의 덩어리(복합물 또는 블록)로 만들어 주는 역할

  • 함수를 호출할 때 그 함수의 이름과 매개변수만 써 주면 됨

  • 인용부호 “ “ 속에 있는 문자들은 “문자열" 또는 “스트링 상수"라고 불림

  • 인용부호 사이에서는 줄을 바꿔 쓰면 안됨

  • \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를 사용하면 입출력 구조를 몰라도 입출력 프로그램을 작성할 수 있음

  • 입력을 그대로 출력으로 내보내는 프로그램

    1. 문자를 읽어 들임

    2. while (문자가 파일의 끝을 나타내는 기호가 아닌 동안)

    3. 문자를 출력

    4. 다음 문자를 읽음

  • EOF

    • 프로그램에서 파일의 끝을 나타내는 기호

    • 파일의 끝을 나타내는 기호는 -1 또는 0

    • #define EOF -1 또는 #define EOF 0 을 써주어야 함

    • EOF의 값은 에서 정의하고 있음

    • EOF는 문자가 아니므로 ASCII에 지정되어 있지 않음

      What is the ascii value of EOF in c?

    • 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;

  • 공통변수는 함수의 바깥에서도 정의해야하고 그 변수를 사용하는 각 함수에서도 정의되어야 함

  • 공통변수를 사용하는 함수가 공통변수 선언과 같은 파일에 들어 있는 경우에는 함수내에 extern 선언을 해주지 않아도 됨

  • 라이브러리의 함수의 공통변수를 선언하는 방법

    • #include 를 선언하면 라이브러리에 있는 함수에서 사용되는 공통변수는 다 선언됨

  • 공통변수를 사용하면 함수의 매개변수 부분이 없어 편리함

  • 하지만 변수를 혼동하기 쉽고 일반성이 줄어들음