250 likes | 406 Views
제 3 장 전처리기와 입출력 함수. 전처리기 개요. 전처리기의 유래 pre-processor 에 의해서 생긴 말 pre( 전 - 앞 ), processor( 처리기 ) 컴파일러 앞에서 먼저 처리함 전처리기가 처리하는 내용 전처리 지시자를 처리 (# 으로 시작 ) #define , #include, #ifdef, #else, #endif, #ifndef, #if, #elif, #line, #error, #pragma 함수를 처리
E N D
전처리기 개요 • 전처리기의 유래 • pre-processor에 의해서 생긴 말 • pre(전-앞), processor(처리기) • 컴파일러 앞에서 먼저 처리함 • 전처리기가 처리하는 내용 • 전처리 지시자를 처리 (#으로 시작) #define , #include, #ifdef, #else, #endif, #ifndef, #if, #elif, #line, #error, #pragma • 함수를 처리 sqrt(), atan(), atan2(), exit(), atexit(), memcpy(), memmove(), va_start(), va_arg() … • 주석 제거
전처리 지시자의 종류 • #define • #include • #ifdef ~ #endif • #if defind(XXX) ~ #endif • #if !defined(XXX) ~ #endif • #undef
#include • ‘이러 이러한 파일을 포함시켜라’의 의미를 가짐 • 예 제 • #include <stdio.h> -시스템 디렉토리에서 찾음 • #include “my_header.h” -현재의 디렉토리에서 찾음
#define • #define • #include에 비해서 주의 사항이 많음 • ‘이러한 것을 다음부터 이렇게 사용하겠다’는 의미를 가짐 • #define에서 정의한 모든 것들은 전처리기가 지정한 문자열로 치환함 • 예제 • #define SIZE 1024 • 1024라는 수치 대신에 SIZE라는 문자열을 사용하겠다는 의미 • #define PIE 3.141592 • 3.141592라는 수치 대신에 PIE라는 문자열을 사용하겠다는 의미
매크로 변수 정의 • #define YEAR 2007 • #define TIME 60 • #define MIN 60 • #define TIME_VLUE TIME * MIN • #define PRINT printf(“%d\n”, TIME_VALUE) • #define PI 3.141519 • #define TRUE 1
주의사항 • 여러 라인에 걸쳐서 매크로를 정의할 수 없음 • #define MAX 100 * 200 * 300 • 매크로 변수에 공백을 삽입할 수 없음 • #define M AX 100 * 200 * 300 ( X ) • #define MAX 100 * 200 * 300 ( O )
매크로 함수 개념 • #define ADD(x, y) x + y #define : 매크로 지시자 ADD : 매크로 함수 명 (중간에 공백이 있으면 안됨) (x, y) : 매크로 함수 인자 x + y : 매크로 몸체 • 예제 • define MAX(x, y) (x > y) ? x : y
매크로 함수의 위험성 • 우선 순위에 의한 위험성(1/2) • 예제 #define MUL(x, y) x * y • printf(“%d\n”, MUL(4, 6)); • printf(“%d\n”, MUL(2+2, 3+3)); • 1번의 결과: 24 • 2번의 결과: 24가 아님. 2번은 다음과 같이 전개되어 결과값이 14가 됨 • printf(“%d\n”, 2 + 2 * 3 + 6); • 해결 방법 (괄호 사용) #define MUL(x, y) (x) * (y) printf(“%d\n”, MUL(2+2, 3+3)); printf(“%d\n”, (2 + 2) * (3 + 3));
매크로 함수의 위험성 • 우선 순위에 의한 위험성(2/2) • 예제 #define MUL(x, y) (x) * (y) • printf(“%d\n”, 300 / MUL(10, 10)); • printf(“%d\n”, 300 / (10) * (10)); • 해결 방법 (전체 괄호 사용) • #define MUL(x, y) ((x) * (y)) • printf(“%d\n”, 300 / MUL(10, 10)); printf(“%d\n”, 300 / ((10) * (10)));
전처리 지시자 • #ifdef … #endif • 조건부 컴파일 지시자 • 매크로 변수 정의 여부에 따라서 컴파일이 수행되거나 수행되지 않도록 함 • 조건적으로 컴파일 되기 때문에 범위가 필요함 (#endif로 처리) • 예제 #ifdef DEBUG … (프로그래머가 작성한 프로그램) … #endif • DEBUG가 매크로 정의되어 있다면 #endif까지 컴파일 되며 매크로 정의되어 있지 않다면 컴파일되지 않음
입출력 함수의 개요 • printf()/scanf() • 키보드 입력 및 출력 함수 • 파일 입력 및 출력 함수 • 입출력은 파일, 키보드, 화면, 테이프 드라이브 등을 뜻함 • 화면 입출력만 뜻하지 않음 (화면 입출력은 ‘표준 입출력함수’라고 함)
printf() • printf() 란? • printf: print와 formatted의 합성어 • 표준 입출력 함수 • 문자, 숫자, 문자열, 부동형 숫자 등 다양하게 출력 가능 • 자동 개행을 해 주지 않음 • 자동개행함수:puts() • printf() –형식 • printf("서식 문자열", 인자1, 인자2, 인자3 …); • 서식 문자열은 항상 큰 따옴표를 사용함 • 서식 문자열에 따라서 인자가 있을 수도 있고 없을 수도 있음 • 서식 문자열 안에 변환형식문자가 존재하면 인자와 1:1 대응
printf() • printf() –변환형식문자가 없는 경우 • printf("I'm archie."); printf("You are a girl."); • printf("I'm archie. You are a girl."); • printf("I'm archie.\nYou are a girl."); • printf("I'm archie.\n\n\nYou are a girl."); • printf("I'm archie.\tYou are a girl."); • I’m archie. You are a girl. • I’m archie. You are a girl. • I'm archie. You are a girl. • I’m archie. You are a girl. • I’m archie. You are a girl.
printf() • 변환 형식 문자
printf() • 서식 지정 문자 • 출력의 모양을 결정 • %[flags][width][.prec][F|N|h|l]type flags : '-', '+', ' ', '#' 등이 있으며 숫자에 음수기호나 주소를 표시하는 역할을 함 width : 출력의 폭을 지정 prec : 출력되는 값의 정밀도를 지정함.부동형에서 주로 많이 사용 F, N, h, l: 입력 크기 지정자 type : 변환형식문자를 지정
printf() • flags - :문자와 숫자가 모두 왼쪽 맞춤. 숫자보다도 문자열 출력에 많이 쓰임 • flags + : 문자나 문자열인 경우는 사용할 일이 없으며 주로 숫자에서 부호를 같이 출력하고 싶을 때 사용 • flags # : 10진수보다는 16진수를 출력할 때 많이 사용하며 특히 포인터(주소)를 출력하기 위하여 사용됨. 출력되는 값이 주소라는 것을 명시하기 위하여 0x를 추가하는 경우가 많은데 이때 #을 추가하여 0x를 대신함 • width : 출력의 폭을 지정하는데, 출력되는 값보다 크게 잡으면 나머지는 공백으로 채워짐. • prec :소수점 이하의 정밀도를 지정할 때 사용함. 지정하지 않으면 소수점 이하 6자리까지 출력하며 ‘.f’를 사용하면 소수점 이하는 잘려나감.
scanf() • 표준 입력 함수 • scan과 formatted의 합성어 • 문자열 입력은 자제하는 것이 좋음 • 문자열 입력은 논리 에러를 유발하거나 사용법에 상당한 제약을 가져옴 • 문자열 입력은 fgets() 사용하는 것이 좋음
scanf() • 주의사항 • 숫자(정수, 부동형 상수)를 입력 받을 때 '&' 기호를 잊지 말아야 함 • 문자 하나를 입력 받을 때에도 '&' 기호를 사용해야 함 • 문자열을 입력 받는데 사용하지 말아야 함
scanf() • 숫자(정수, 부동형 상수)를 입력 받을 때 '&' 기호를 잊지 말아야 함
scanf() • 문자 하나를 입력 받을 때에도 '&' 기호를 사용해야 함
scanf() • 문자열을 입력 받는데 사용하지 말아야 함