C Primer Plus - 2장: C 첫걸음

요나·2023년 5월 14일
0

C Primer Plus

목록 보기
2/3

본 포스팅은 Stephen Prata의 C Primer Plus를 읽고 요약한 글입니다.


#include <stdio.h>

int main(void)
{
	int num;
	num = 1;
	printf("%d을 출력합니다.\n", num);

	return 0;
}

#include 지시자와 헤더 파일

  • 컴파일러에게 stdio.h 파일에 있는 코드를 포함시키라고 지시한다.
  • #include 문은 C 전처리기 지시자(preprocessor directive)의 한 예로, 전처리란 컴파일 전 소스 코드를 대상으로 행하는 사전 작업을 의미한다.
  • studuio.h (standard input/output header)은 header 파일로, 헤더는 모든 C 컴파일러 패키지의 일부로 여러 개 제공되며, 이 안에는 컴파일러가 사용하는 여러 함수들에 대한 정보가 들어 있다.
  • 헤더 파일에는 상수의 정의와 함수의 이름 및 어떻게 사용되어야하는지를 지시하는 등 컴파일러가 최종 실행 프로그램을 만드는 데 사용하는 정보가 들어 있는데, 함수의 실제 코드는 헤더 파일이 아닌 사전에 컴파일되어 라이브러리 파일에 들어있다.
  • 헤더 파일은 컴파일러가 프로그램을 바르게 구성하도록 안내하며, 필요한 라이브러리 코드를 찾는 일은 컴파일러의 링커 부분이 담당한다.
  • ANSI/ISO C(C90)는 컴파일러가 어떤 헤더 파일들을 사용할 수 있게 해야하는지에 대한 표준을 제시했다.
  • I/O 패키지와 같은 기본적인 기능도 포함되지 않은 이유는, 자원을 경제적으로 사용하는 C의 원칙 때문이다.
  • #include는 C의 문법이 아니며, # 기호는 해당 라인을 컴파일러에게 넘기기 전에 C 전처리기로 처리해야 한다고 지시한다.

main() 함수

  • C 프로그램은 (몇 가지 예외를 제외하고) 언제나 main() 함수로부터 실행을 시작한다.
  • 메인 함수는 int형 값을 리턴하는데, 그 대상은 운영체제이다.
  • 함수에 매개변수로 전달되는 값이 없을 때는 void 키워드를 쓴다.
    • C90까지는 void 없이 main() 만 작성할수도 있었고, 몇몇 컴파일러는 void main()을 지원하기도 하지만 C99 이후 표준은 무조건 int main(void)로 작성한다.

선언문

  • int num; : 선언문(declaration statement)이라 하며, C의 가장 중요한 특징 중 하나다.
  • 선언문은 변수의 타입을 결정하고, 컴파일러는 해당 변수를 저장할 메모리 공간을 할당하기 위해 이 정보를 사용한다.
  • 타입 뒤에는 식별자(identifier)가 위치하는데, 이는 변수, 함수, 기타 다른 개체를 식별하기 위해 사용자가 부여한 이름이다.
  • 선언문은 하나의 특정 식별자를 메모리 상의 특정 주소와 연결하고 그 위치에 저장할 데이터의 타입을 확정한다.
  • 모든 변수는 사용되기 전에 선언되어야 한다.
  • 블록의 가장 위에 사용되는 모든 변수를 사전에 선언해두는 것이 전통적인 규칙이었으나, C99 이후로는 사용되기 전에 선언되기만 한다면 위치는 상관없어졌다. (호환성과 가독성 위해 전자가 낫다)

대입문

  • num = 1; : 대입문(assignment statement)라고 하며, 변수 선언 시에 할당된 메모리 공간에 하나의 값을 저장한다.

printf() 함수

  • 개행 문자(\n)는 escape sequence의 한 예로, 탭(\t), 백스페이스(\b) 등이 있다.
  • printf() 함수의 f는 formatting을 뜻하며, 데이터형에 따라 %를 사용하여 10진수 정수, 16진수 정수, 부동소수점 수 등의 출력 포맷에 대한 포맷 지정자 옵션을 제공한다.

리턴문

  • main()에서 리턴문을 생략한 경우에, 블록의 끝에서 0을 리턴한다. (다른 함수는 불가)
  • Unix나 Linux 등 일부 운영체제에서는 0을 리턴하는 실제적인 용도가 존재한다.

여러 개의 함수

#include <stdio.h>

void butler(void); // ANSI/ISO C 함수 프로토타입

int main(void)
{
	printf("butler 함수 호출\n"); 
	butler();
	printf("butler 응답함.\n");

	return 0;
}

void butler(void) // 함수 정의 시작
{
	printf("butler: 주인님 안녕!\n");
}
  • 함수 프로토타입(prototype)은 사용될 함수에 대해서 컴파일러에게 미리 알려주며, 이후 함수 정의 부분에서 함수 자체의 소스 코드를 작성한다.
  • 프로토타입은 C90 표준에서 추가되었는데, 함수 선언(function declaration)이라고도 부른다.
  • 오래된 C 컴파일러들은 void butler() 식으로 리턴 타입만 상술하고 전달인자를 생략했기 때문에, 이러한 형식도 동작하기는 하지만 권장되지 않는다.
  • 함수의 실행 시기는 정의된 위치가 아니라 호출되는 위치에 의해서 결정되며, 프로그램의 기본 골격을 제공하는 main() 함수를 맨 앞에 위치시키는 것이 관행이다.
  • C 표준은 사용하는 모든 함수들의 프로토타입을 정의하기를 권장한다.
  • 표준 라이브러리 함수들의 프로토타입은 표준 include 파일들 안에 포함되어 있다.

연습문제 08

#include <stdio.h>

void one_three(void);
void two(void);

int main(void)
{
  printf("starting now:\n");
  one_three();
  printf("done!\n");
}

void one_three(void)
{
  printf("one\n");
  two();
  printf("three\n");
}

void two(void)
{
  printf("two\n");
}

/*
*starting now:
one
two
three
done!*
*/
profile
var yona = IOSDeveloper(stage: 0)

0개의 댓글