쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express.

Slides:



Advertisements
Similar presentations
6 장. printf 와 scanf 함수에 대한 고찰 printf 함수 이야기 printf 는 문자열을 출력하는 함수이다. – 예제 printf1.c 참조 printf 는 특수 문자 출력이 가능하다. 특수 문자의 미 \a 경고음 소리 발생 \b 백스페이스 (backspace)
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Chapter 7. 조건문.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
제 9 장 구조체와 공용체.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
C 12장. 고급 기능 #include <stdio.h> int main(void) { int num;
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
누구나 즐기는 C언어 콘서트 제4장 수식과 연산자.
기초C언어 제14주 전처리 및 비트 필드, 스트림과 파일 입출력(15,16장) 컴퓨터시뮬레이션학과 2016년 봄학기
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
Chapter 04 C 연산자의 이해.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
07. 디바이스 드라이버의 초기화와 종료 김진홍
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
제15장 전처리 및 비트연산.
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트 필드 C Express.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
26. 매크로와 전처리기.
Error Detection and Correction
C언어 콘서트 제2장 기초 사항.
임베디드 실습 # LED, 7’Segment 제어
6장. printf와 scanf 함수에 대한 고찰
11장. 1차원 배열.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express Slide 1 (of 27)
제 11 장 전처리기.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
JA A V W. 03.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
제13장 전처리 및 기타기능.
C언어 프로그래밍의 이해 Ch13. 선행처리기와 주석문.
이름 : 황 상 두 전화번호 : 이메일 : PinTool 이름 : 황 상 두 전화번호 : 이메일 :
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
컴퓨터 프로그래밍 기초 - 4th : 수식과 연산자 -
연산자 (Operator).
쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express Slide 1 (of 29)
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
쉽게 풀어쓴 C언어 Express 제3장 C프로그램 구성요소 C Express.
Chapter 08. 함수.
Choi Seong Yun 컴퓨터 프로그래밍 기초 #03 : 변수와 자료형 Choi Seong Yun
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
7주차: Functions and Arrays
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 4 장 Record.
1장 C 언어의 개요 C 언어의 역사와 기원 C 언어의 특징 프로그램 과정 C 프로그램 구조 C 프로그램 예제.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
수업 내용 수업 목표 강의 내용 강의 계획서 교과서 및 참고도서 평가 방법 수강생의 학습 방법 제안 강의자료 사이트
개정판 누구나 즐기는 C언어 콘서트 제14장 전처리와 분할 컴파일리 출처: pixabay.
제 10 강 문자 입출력.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

쉽게 풀어쓴 C언어 Express 제15장 전처리 및 비트연산 C Express

전처리기란? 전처리기 (preprocessor)는 컴파일하기에 앞서서 소스 파일을 처리하는 컴파일러의 한 부분

전처리기의 요약 지시어 의미 #define 매크로 정의 #include 파일 포함 #undef 매크로 정의 해제 #if 조건이 참일 경우 #else 조건이 거짓일 경우 #endif 조건 처리 문장 종료 #ifdef 매크로가 정의되어 있는 경우 #ifndef 매크로가 정의되어 있지 않은 경우 #line 행번호 출력 #pragma 시스템에 따라 의미가 다름

단순 매크로 단순 매크로(macro): 숫자 상수를 기호 상수로 만든 것 (예) #define MAX_SIZE 100

단순 매크로의 장점 프로그램의 가독성을 높인다. 상수의 변경이 용이하다. 기호 상수를 사용하는 경우 숫자를 사용하는 경우

단순 매크로의 예 #define PRINT printf #define PI 3.141592 // 원주율 #define TWOPI (3.141592 * 2.0) // 원주율의 2배 #define MAX_INT 2147483647 // 최대 정수 #define EOF (-1) // 파일의 끝 표시 #define MAX_STUDENTS 2000 // 최대 학생 수 #define EPS 1.0e-9 // 실수의 계산 한계 #define DIGITS "0123456789" // 문자 상수 정의 #define BRACKET "(){}[]" // 문자 상수 정의 #define getchar() getc(stdin) // stdio.h에 정의 #define putchar() putc(stdout) // stdio.h에 정의 2147483647보다는 MAX_INT가 낫죠 사람은 숫자보다 기호를 잘 기억합니다.

예제 #1 #include <stdio.h> #define AND && #define OR || #define NOT ! #define IS == #define ISNOT != int search(int list[], int n, int key) { int i = 0; while( i < n AND list[i] != key ) i++; if( i IS n ) return -1; else return i; } int main(void) int m[] = { 1, 2, 3, 4, 5, 6, 7 }; printf("%d\n", search(m, sizeof(m)/sizeof(m[0]), 5)); return 0; C프로그램을 다른 언어처럼 작성할 수 있습니다.

#define SQUARE(x) ((x) * (x)) 함수 매크로 함수 매크로(function-like macro)란 매크로가 함수처럼 매개 변수를 가지는 것 (예) #define SQUARE(x) ((x) * (x)) #define 매크로(매개변수1, 매개변수2,...) 치환텍스트 #define SQUARE(x) ((x) * (x)) 전처리기 v = SQUARE(3); v = ((3)*(3));

함수 매크로의 예 #define SUM(x, y) ((x) + (y)) #define AVERAGE(x, y, z) (( (x) + (y) + (z) ) / 3 ) #define MAX(x,y) ( (x) > (y) ) ? (x) : (y) #define MIN(x,y) ( (x) < (y) ) ? (x) : (y) #define SQUARE(x) x*x // 위험 !! v = SQUARE(a+b); v = a + b*a + b; 함수 매크로에서는 매개 변수를 괄호로 둘러싸는 것이 좋습니다.

예제 #1 ((++x) * (++x)) // 매크로 예제 #include <stdio.h> #define SQUARE(x) ((x) * (x)) int main(void) { int x = 2; printf("%d\n", SQUARE(x)); printf("%d\n", SQUARE(3)); printf("%f\n", SQUARE(1.2)); // 실수에도 적용 가능 printf("%d\n", SQUARE(x+3)); printf("%d\n", 100/SQUARE(x)); printf("%d\n", SQUARE(++x)); // 논리 오류 return 0; } ((++x) * (++x)) 4 9 1.440000 25 16

함수 매크로의 장단점 함수 매크로의 장단점 함수 호출 단계가 필요없어 실행 속도가 빠르다. 소스 코드의 길이가 길어진다. 간단한 기능은 매크로를 사용 #define MIN(x, y) ((x) < (y) ? (x) : (y)) #define ABS(x) ((x) > 0 ? (x) : -(x))

내장 매크로 내장 매크로: 미리 정의된 매크로 printf("컴파일 날짜=%s\n", __DATE__); 설명 __DATE__ 이 매크로를 만나면 현재의 날짜(월 일 년)로 치환된다. __TIME__ 이 매크로를 만나면 현재의 시간(시:분:초)으로 치환된다. __LINE__ 이 매크로를 만나면 소스 파일에서의 현재의 라인 번호로 치환된다. __FILE__ 이 매크로를 만나면 소스 파일 이름으로 치환된다. printf("컴파일 날짜=%s\n", __DATE__); printf("치명적 에러 발생 파일 이름=%s 라인 번호= %d\n", __FILE__, __LINE__);

예제: ASSERT 매크로 #include <stdio.h> #define DEBUG #ifdef DEBUG #define ASSERT(exp) { if (!(exp)) \ { printf("가정(" #exp ")이 소스 파일 %s %d번째 줄에서 실패.\n"\ ,__FILE__, __LINE__), exit(1);}} #else #define ASSERT(exp) #endif int main(void) { int sum; // 지역 변수의 초기값은 0이 아님 ASSERT(sum == 0); // sum의 값은 0이 되어야 함. return 0; } 매크로를 다음 줄로 연장할 때 사용 가정(sum == 0)이 소스 파일 c:\cprogram\test\test.c 17번째 줄에서 실패.

#ifdef 조건부 컴파일을 지시 어떤 조건이 만족되었을 경우에만 컴파일 (예) #ifdef 매크로 문장1 // 매크로가 정의되었을 경우 #else 문장2 // 매크로가 정의되지 않았을 경우 #endif

#if 기호가 참으로 계산되면 컴파일 조건은 상수이어야 하고 논리, 관계 연산자 사용 가능 #if 조건 문장들 #endif #define METHOD 1 ... #if METHOD == 1 printf("방법 1이 선택되었습니다.\n"); #endif #if 조건1 문장1 #elif 조건2 문장2 #else 문장3 #endif else if를 줄인 것

다양한 예 #if (VERSION > 3) // 버전이 3 이상이면 컴파일 ... #endif #if (AUTHOR == "CHULSOO") // 오류 !! #if (AUTHOR == KIM) // 가능!! KIM은 다른 매크로 #if (VERSION*10 > 500 && LEVEL == BASIC) // 가능!! #if (VERSION > 300 || defined(DELUXE) ) #if 0 // 소스의 일부분을 주석 처리하는 방법

조건부 컴파일을 이용하는 디버깅 #define DEBUG 1 ... #if DEBUG == 1 printf("현재 counter의 값은 %d입니다.\n", counter); #endif #define DEBUG #ifdef DEBUG #if defined(DEBUG)

헤더 파일 이중 포함 방지 /*** *stdio.h - definitions/declarations for standard I/O routines ****/ #ifndef _INC_STDIO #define _INC_STDIO .... #endif 헤더 파일이 포함되면 매크로가 정의되어서 이중 포함을 방지합니다.

#undef, #pragma #undef: 매크로의 정의를 취소 #include <stdio.h> #define DEBUG int main(void) { #ifdef DEBUG printf("DEBUG이 정의되었습니다.\n"); #endif #undef DEBUG // DEBUG 매크로의 정의를 취소 printf("DEBUG이 정의되었습니다.\n"); // 컴파일되지 않는다. return 0; }

#include 지정된 파일을 읽어서 그 위치에 삽입 표준 디렉토리 INCLUDE라는 환경변수가 지정하는 디렉토리이다. 보통은 “C:\Program Files\Microsoft Visual Studio\VC98\include” 하부 디렉토리를 지정할 수 있다. #include "graphic/point.h"

다중 소스 파일 단일 소스 파일 파일의 크기가 너무 커진다. 소스 파일을 다시 사용하기가 어려움 다중 소스 파일 서로 관련된 코드만을 모아서 하나의 소스 파일로 할 수 있음 소스 파일을 재사용하기가 간편함 소스 파일

예제 #1 power.h multiple_source.c power.c // power.c에 대한 헤더 파일 #ifndef POWER_H #define POWER_H double power(int x, int y); #endif multiple_source.c // 다중 소스 파일 #include <stdio.h> #include "power.h" int main(void) { int x,y; printf("x의 값을 입력하시오:"); scanf("%d", &x); printf("y의 값을 입력하시오:"); scanf("%d", &y); printf("%d의 %d 제곱값은 %f\n", x, y, power(x, y)); return 0; } power.c // 다중 소스 파일 #include "power.h" double power(int x, int y) { double result = 1.0; int i; for(i = 0;i < y; i++) result *= x; return result; }

비트 단위 연산자 C에서는 비트 단위의 연산도 가능하다. 비트 단위 연산자는 정수에만 적용이 가능하다. 연산자 연산자의 의미 설명 & 비트 AND 두개의 피연산자의 해당 비트가 모두 1이면 1, 아니면 0 | 비트 OR 두개의 피연산자의 해당 비트중 하나만 1이면 1, 아니면 0 ^ 비트 XOR 두개의 피연산자의 해당 비트의 값이 같으면 0, 아니면 1 << 왼쪽으로 이동 지정된 개수만큼 모든 비트를 왼쪽으로 이동한다. >> 오른쪽으로 이동 지정된 개수만큼 모든 비트를 오른쪽으로 이동한다. ~ 비트 NOT 0은 1로 만들고 1은 0로 만든다.

비트 논리곱 연산자 비트1 비트2 비트1 & 비트2 1 마스크 연산으로 많이 사용

bit_AND.c // 비트 단위 AND #include <stdio.h> int main(void) { int x = 13; // 00000000 00000000 00000000 00001101 int y = 15; // 00000000 00000000 00000000 00001110 int z = x & y; // 00000000 00000000 00000000 00001100 printf("%08X \n", z); return 0; } 0000000D

비트 논리합 연산자 비트1 비트2 비트1 | 비트2 1 비트설정연산으로 많이 사용

bit_OR.c // 비트 단위 OR #include <stdio.h> int main(void) { int x = 9; // 00000000 00000000 00000000 00001001 int y = 10; // 00000000 00000000 00000000 00001010 int z = x | y; // 00000000 00000000 00000000 00001011 printf("%08X \n", z); return 0; } 0000000B

비트 배타 논리합 연산자 비트1 비트2 비트1 ^ 비트2 1

비트 부정 연산자 비트1 ~비트1 1

bit_NOT.c // 비트 단위 NOT #include <stdio.h> int main(void) { int x = 9; // 00000000 00000000 00000000 00001001 int z = ~x; // 11111111 11111111 11111111 11110110 printf("%08X (%d)\n", z, z); return 0; } FFFFFFF6 (-10)

비트 이동 연산자 왼쪽 비트 이동 연산 연산자 기호 설명 왼쪽 비트 이동 << x << y x의 비트들을 y 칸만큼 왼쪽으로 이동 오른쪽 비트 이동 >> x >> y x의 비트들을 y 칸만큼 오른쪽으로 이동 왼쪽 비트 이동 연산

오른쪽 비트 이동 연산(양수) 오른쪽 비트 이동 연산(양수)

오른쪽 비트 이동 연산(음수) 오른쪽 비트 이동 연산(음수)

비트 필드 구조체 멤버가 비트 단위로 나누어져 있는 구조체 struct 태그이름 { 자료형 멤버이름1: 비트수; 자료형 멤버이름2: 비트수; ... }; struct product { unsigned style : 3; unsigned size : 2; unsigned color : 1; };

bit_field.c // 비트 필드 구조체 #include <stdio.h> struct product { unsigned style : 3; unsigned size : 2; unsigned color : 1; }; int main(void) { struct product p1; p1.style = 5; p1.size = 3; p1.color = 1; printf("style=%d size=%d color=%d\n", p1.style, p1.size, p1.color); printf("sizeof(p1)=%d\n", sizeof(p1)); printf("p1=%x\n", p1); return 0; } style=5 size=3 color=1 sizeof(p1)=4 p1=ccccccfd

비트 필드 사용시에 주의점 비트 필드의 응용 분야: 하드웨어 포트 제어 struct product { long code; // ① 일반 멤버도 가능하다. unsigned style : 3; unsigned : 5; // ② 자리만 차지한다. unsigned size : 2; unsigned color : 1; unsigned : 0; // ③ 현재 워드의 남아있는 비트를 버린다. unsigned state : 3; // 여기서부터는 다음 워드에서 할당된다. }; 비트 필드의 응용 분야: 하드웨어 포트 제어

Q & A