<4D F736F F F696E74202D20C1A635C0E520BCF6BDC4B0FABFACBBEAC0DA>

Similar documents
쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap-05.pptx

OCW_C언어 기초

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Microsoft PowerPoint - chap04-연산자.pptx

<4D F736F F F696E74202D2032C1D6C2F72D32C2F7BDC32028B0ADC0C7C0DAB7E D20BAAFBCF6BFCD20BFACBBEAC0DA>

PowerPoint 프레젠테이션

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

4.0 개요 p.116 수식 (expression) 연산자 (operator) 와피연산자 (operand) 로구성 수식은평가 (evaluate) 되어최종적으로 1 개의결과값이됨 피연산자 : 상수, 변수, 또다른수식 sum - 10 (a+b) / 2 연산자 2

Microsoft PowerPoint - ch07 - 포인터 pm0415

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

11장 포인터

중간고사

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap-06.pptx

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

쉽게 풀어쓴 C 프로그래밊

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - chap03-변수와데이터형.pptx

untitled

untitled

Microsoft PowerPoint - Chapter_04.pptx

06 세상을 변화시키는 연산자

Microsoft PowerPoint - [2009] 02.pptx

프로그래밍 및 연습 1

Microsoft PowerPoint - Chapter_02.pptx

C 언어의구성요소인상수, 변수, 입 출력함수에 대하여학습

untitled

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 제11장 포인터(강의)

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - chap06-2pointer.ppt

11장 포인터

제 15 장전처리및비트연산 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

C 프로그래밊 개요

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - chap-11.pptx

C 언어 프로그래밊 과제 풀이

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint Presentation

Microsoft PowerPoint - gnu-w10-c-chap11

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

본 강의에 들어가기 전

1.1.1 컴퓨터의 구성 p.19

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap-03.pptx

JAVA PROGRAMMING 실습 02. 표준 입출력

ch15

Microsoft PowerPoint - chap-04.pptx

C++ Programming

슬라이드 1

Microsoft PowerPoint - chap-04.pptx

02장.배열과 클래스

Microsoft PowerPoint - 2주차-1차시 (강의자료) ch01 - C Programming 기초 (part 2)

TEST BANK & SOLUTION

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

Microsoft PowerPoint - Lesson2.pptx

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint 프레젠테이션

ABC 3장

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - gnu-w10-c-chap12

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - c2.ppt

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

PowerPoint Presentation

PowerPoint Presentation

<4D F736F F F696E74202D20C1A634C0E520BAAFBCF6BFCDC0DAB7E1C7FC>

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap-07.pptx

Microsoft PowerPoint - 2장 변수와 자료형 pptx

쉽게 풀어쓴 C 프로그래밍

컴파일러

PowerPoint 프레젠테이션

KNK_C03_Expr_kor

Data Structure

Microsoft PowerPoint Predicates and Quantifiers.ppt


Microsoft PowerPoint - C_Programming_Basics.ppt [호환 모드]

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

ABC 3장

쉽게

Microsoft PowerPoint - Lesson6.pptx

Microsoft PowerPoint - KNK_C03_Expr_kor

Transcription:

쉽게풀어쓴 C 언어 Express 제 5 장수식과연산자

이번장에서학습할내용 * 수식과연산자란? * 대입연산 * 산술연산 * 논리연산 * 관계연산 * 우선순위와결합법칙 이번장에서는수식과연산자를살펴봅니다.

수식의예

수식 수식 (expression) x + y x*x + 5*x + 6 (principal * interest_rate * period) / 12.0 수식 (expression) 상수, 변수, 연산자의조합 연산자와피연산자로나누어진다. 3.14 radius * 피연산자연산자피연산자

기능에따른연산자의분류 연산자의분류 연산자 의미 대입 = 오른쪽을왼쪽에대입 산술 + - * / % 사칙연산과나머지연산 부호 + - 증감 ++ -- 증가, 감소연산 관계 > < ==!= >= <= 오른쪽과왼쪽을비교 논리 &&! 논리적인 AND, OR 조건? 조건에따라선택 콤마, 피연산자들을순차적으로실행 비트단위연산자 & ^ ~ << >> 비트별 AND, OR, XOR, 이동, 반전 sizeof 연산자 sizeof 자료형이나변수의크기를바이트단위로반환 형변환 (type) 변수나상수의자료형을변환 포인터연산자 * & [] 주소계산, 포인터가가리키는곳의내용추출 구조체연산자. -> 구조체의멤버참조

피연산자수에따른연산자분류 단항연산자 : 피연산자의수가 1 개 ++x; --y; 이항연산자 : 피연산자의수가 2 개 x + y x - y 삼항연산자 : 연산자의수가 3 개 x? y : z

중간점검 1. 수식 (expression) 이란어떻게정의되는가? 2. 상수 10도수식이라고할수있는가? 3. 아래의수식에서피연산자와연산자를구분하여보라. y = 10 + 20; 4. 연산자를단항연산자, 이항연산자, 삼항연산자로나누는기준은무엇인가?

산술연산자 덧셈, 뺄셈, 곱셈, 나눗셈등의사칙연산을수행하는연산자 연산자 기호 의미 예 덧셈 + x와 y를더한다 x+y 뺄셈 - x에서 y를뺀다. x-y 곱셈 * x와 y를곱한다. x*y 나눗셈 / x를 y로나눈다. x/y 나머지 % x를 y로나눌때의나머지값 x%y y mx b y = m*x + b y ax 2 bx c x y x m 3 y = a*x*x + b*x +c m = (x + y + z) / 3 ( 참고 ) 거듭제곱연산자는? C 에는거듭제곱을나타내는연산자는없다. x * x 와같이단순히변수를두번곱한다.

예제 #include <stdio.h> int main() { int x, y, result; printf(" 두개의정수를입력하시오 : "); scanf("%d %d", &x, &y); result = x + y; printf("%d + %d = %d", x, y, result); x y } result = x - y; // 뺄셈연산 printf("%d - %d = %d", x, y, result); result = x * y; // 곱셈연산 printf("%d + %d = %d", x, y, result); result = x / y; // 나눗셈연산 printf("%d / %d = %d", x, y, result); result = x % y; // 나머지연산 printf("%d %% %d = %d", x, y, result); return 0; 두개의정수를입력하시오 : 7 4 7 + 4 = 11 7-4 = 3 7 + 4 = 28 7 / 4 = 1 7 % 4 = 3

나눗셈연산자 정수형끼리의나눗셈에서는결과가정수형으로생성하고부동소수점형끼리는부동소수점값을생성된다. 정수형끼리의나눗셈에서는소수점이하는버려진다. 형변환에서자세히학습합니다.

int main() { double x, y, result; 나눗셈연산자 printf(" 두개의실수를입력하시오 : "); scanf("%lf %lf", &x, &y); result = x + y; // 덧셈연산을하여서결과를 result에대입 printf("%f / %f = %f", x, y, result); }... result = x / y; printf("%f / %f = %f", x, y, result); return 0; 두개의실수를입력하시오 : 7 4 7.000000 + 4.000000 = 11.000000 7.000000-4.000000 = 3.000000 7.000000 + 4.000000 = 28.000000 7.000000 / 4.000000 = 1.750000

나머지연산자 나머지연산자 (modulus operator) 는첫번째피연산자를두번째피연산자로나누었을경우의나머지를계산 10 % 2는 0이다. 5 % 7는 5이다. 30 % 9는 3이다. 아주유용한연산자나머지연산자를이용한짝수와홀수를구분입니다. x % 2가 0이면짝수 나머지연산자를이용한 5의배수판단 x % 5가 0이면 5의배수

나머지연산자 // 나머지연산자프로그램 #include <stdio.h> #define SEC_PER_MINUTE 60 // 1 분은 60 초 int main(void) { int input, minute, second; 70 1 input minute 10 second 60 SEC_PER_ MINUTE printf(" 초단위의시간을입력하시요 :(32 억초이하 ) "); scanf("%d", &input); // 초단위의시간을읽는다. minute = input / SEC_PER_MINUTE; // 몇분 second = input % SEC_PER_MINUTE; // 몇초 } printf("%d 초는 %d 분 %d 초입니다. \n", input, minute, second); return 0; 초단위의시간을입력하시요 :(32 억초이하 ) 70 70 초는 1 분 10 초입니다.

부호연산자 변수나상수의부호를변경 x = -10; y = -x; // 변수 y의값은10이된다. 10-20 - 10 이항연산자단항연산자 - 는이항연산자이기도하고단항연산자이기도하죠 -10 x -x 10 y

증감연산자 증감연산자 ++x x++ --x x-- 의미 x 값을먼저증가한후에다른연산에사용한다. 이수식의값은증가된 x 값이다. x 값을먼저사용한후에, 증가한다. 이수식의값은증가되지않은원래의 x 값이다. x 값을먼저감소한후에다른연산에사용한다. 이수식의값은감소된 x 값이다. x 값을먼저사용한후에, 감소한다. 이수식의값은감소되지않은원래의 x 값이다. ++x : 11 x++ : 10 --x : 9 x-- : 10 10 10 1 11 109 9 x + - = 11 9

주의할점 x = 1; y = 1; nextx = ++x; // x의값이증가된후에사용된다. nextx는 2가된다. nexty = y++;// y의값이사용된후에증가된다. nexty는 1이된다.

예제 : 증감연산자 #include <stdio.h> int main(void) { int x=10, y=10; printf("x=%d\n", x); printf("++x의값 =%d\n", ++x); 10 x -x 10 y printf("x=%d\n\n", x); printf("y=%d\n", y); printf("y++ 의값 =%d\n", y++); printf("y=%d\n", y); x=10 ++x 의값 =11 x=11 } return 0; y=10 y++ 의값 =10 y=11

대입 ( 배정, 할당 ) 연산자 왼쪽에있는변수에오른쪽의수식의값을계산하여대입 변수 (variable) = 수식 (expression); x = 10; // 상수 10을변수x에대입한다. y = x; // 변수 x의값을변수y에대입한다. z = 2 * x + y; // 수식 2 * x + y를계산하여변수 z에대입한다. 2 * 10 + 10 = 30 x 10 y z

대입연산자주의점 왼쪽에는항상변수가와야한다. x + 2 = 0; // 왼편이변수이름이아니기때문에잘못된수식!! 2 = x; // 왼편이변수이름이아니기때문에잘못된수식!! 다음의문장은수학적으로는올바르지않지만 C 에서는가능. x = x + 1; // x 의값이하나증가된다. 10 x + 1 = 11

대입연산의결과값 덧셈연산의결과값은 9 모든연산에는결과값이있고대입연산도결과값이있습니다. y = 10 + ( x = 2 + 7 ); 대입연산의결과값은 9 덧셈연산의결과값은 19 대입연산의결과값은 19 ( 현재는사용되지않음 )

대입연산의결과값 y = x = 3; y = x = 3 3 3

/* 대입연산자프로그램 */ #include <stdio.h> int main(void) { int x, y; x y 예제 수식의결과값을출력하여보는예제입니다. x = 1; printf(" 수식 x+1 의값은 %d\n", x+1); printf(" 수식 y=x+1 의값은 %d\n", y=x+1); printf(" 수식 y=10+(x=2+7) 의값은 %d\n", y=10+(x=2+7)); printf(" 수식 y=x=3 의값은 %d\n", y=x=3); } return 0; 수식 x+1 의값은 2 수식 y=x+1 의값은 2 수식 y=10+(x=2+7) 의값은 19 수식 y=x=3 의값은 3

복합대입연산자 복합대입연산자란 += 처럼대입연산자 = 와산술연산자를합쳐놓은연산자 복합대입연산자 x += y x -= y x *= y 의미 x = x + y x = x - y x = x * y 소스를간결하게만들수있음 x /= y x %= y x &= y x = x / y x = x % y x = x & y x = y x = x y x ^= y x = x ^ y x >>= y x = x >> y x <<= y x = x << y x += 1 // x = x + 1 x *= y + 1 // x = x * (y + 1) x %= x + y // x = x % (x + y)

복합대입연산자 x += 1 // x = x + 1 x *= 5 // x = x * 5 x -= y + 1 // x = x - (y + 1) 10 11 x 10 11 y

// 복합대입연산자프로그램 #include <stdio.h> 복합대입연산자 int main(void) { int x = 10, y = 10, z = 33; 10 11 20 10 33 2 x y z x += 1; // x = x + 1; y *= 2; // y = y * 2; z %= x + y; // z = z % (x + y ); 주의!! } printf("x = %d y = %d z = %d \n", x, y, z); return 0; x = 11 y = 20 z = 2

복합대입연산자 // 증감연산자를이용한프로그램 #include <stdio.h> int main(void) { int x = 10; } x 12 10 11 printf(" 수식 x++ 의값 : %d \n", x++); printf(" 현재 x 의값 : %d \n", x); printf(" 수식 ++x 의값 : %d \n", ++x); printf(" 현재 x 의값 : %d \n", x); printf(" 수식 x-- 의값 : %d \n", x--); printf(" 현재 x 의값 : %d \n", x); printf(" 수식 --x 의값 : %d \n", --x); printf(" 현재 x 의값 : %d \n", x); 수식 x++ 의값 : 10 현재 x 의값 : 11 수식 ++x 의값 : 12 현재 x 의값 : 12 수식 x-- 의값 : 12 현재 x 의값 : 11 수식 --x 의값 : 10 현재 x 의값 : 10

형변환 연산시에데이터의유형이변환되는것 대입연산시형변환 자동적인형변환 정수연산시형변환 형변환 명시적인형변환 수식연산시형변환 자동으로변환되기도하고사용자가바꾸어주기도하죠

대입연산시의자동적인형변환 올림변환 double f; f = 10 + 20; // f에는 30.0이저장된다. 내림변환 int i; i = 3.141592; // i에는 3이저장된다. 10+20 = 30.0 3.141592 3 f i

올림변환과내림변환 #include <stdio.h> int main(void) { char c; int i; float f; 10000 11.23456 16 11 c i f 30.000000 } c = 10000; // 내림변환 i = 1.23456 + 10; // 내림변환 f = 10 + 20; // 올림변환 printf("c = %d, i = %d, f = %f \n", c, i, f); return 0; c:\...\convert1.c(10) : warning C4305: '=' : 'int' 에서 'char'( 으 ) 로잘립니다. c:\...\convert1.c(11) : warning C4244: '=' : 'double' 에서 'int'( 으 ) 로변환하면서데이터가손실될수있습니다. c=16, i=11, f=30.000000

정수연산시의자동적인형변환 정수연산시 char 형이나 short 형의경우, 자동적으로 int 형으로변환하여계산한다. char x = 10; short y = 20; z = x + y; 10 x char + 20 y short 10 x int + 20 y int z 30

수식에서의자동적인형변환 서로다른자료형이혼합하여사용되는경우, 더큰자료형으로통일된다. int 형이 double 형으로승급된다. 10 int + 1.2345 double 10.0 double + 1.2345 double 11.2345 전체수식의결과값도 double 형이된다. double

명시적인형변환 형변환 (type cast): 사용자가데이터의타입을변경하는것 ( 자료형 ) 상수또는변수 (int) 1.23456 (double) x // double형으로변환 (long) (x+y) // long형으로변환 1.23456 (int) 1.23456

예제 1. int i; 2. double f; 3. f = 5 / 4; 4. f = (double)5 / 4; 5. f = 5 / (double)4; 6. f = (double)5 / (double)4; 7. i = 1.3 + 1.8; 8. i = (int)1.3 + (int)1.8; i 23 1.25 1.0 f 1. 정수형변수 i 선언 2. 부동소수점형변수 f 선언 3. ( 정수 / 정수 ) 는정수지만 f에저장되면서 1.0으로변환된다. 4. 5를부동소수점으로변환하여계산, 전체는부동소수점형이됨 5. 4를부동소수점으로변환하여계산, 전체는부동소수점형이됨 6. 5와 4를모두부동소수점으로변환하여계산 7. 1.3+1.8은 3.1로계산되고정수형변수에대입되므로 i는 3 8. (int)1.3 + (int)1.8은 1+1로되어서 i는 2

관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) 연산자기호 의미 사용예 == x와 y가같은가? x == y!= x와 y가다른가? x!= y > x가 y보다큰가? x > y < x가 y보다작은가? x < y >= x가 y보다크거나같은가? x >= y <= x가 y보다작거나같은가? x <= y

관계연산자사용예 1 == 1 // 참 (1) 1!= 2 // 참 (1) 2 > 1 // 참 (1) x >= y // x가 y보다크거나같으면참 (1) 1 1 == 1 0 == 1 0

#include <stdio.h> int main(void) { int x, y; 예제 printf(" 두개의정수를입력하시오 : "); scanf("%d%d", &x, &y); 3 >= == <=!= x3 y 4 4 } printf("x == y 의결과값 : %d", x == y); printf("x!= y 의결과값 : %d", x!= y); printf("x > y 의결과값 : %d", x > y); printf("x < y 의결과값 : %d", x < y); printf("x >= y 의결과값 : %d", x >= y); printf("x <= y 의결과값 : %d", x <= y); return 0; 두개의정수를입력하시오 : 3 4 x == y 의결과값 : 0 x!= y 의결과값 : 1 x > y 의결과값 : 0 x < y 의결과값 : 1 x >= y 의결과값 : 0 x <= y 의결과값 : 1

주의할점! (x = y) x의값을y에대입한다. 이수식의값은 x의값이다. (x == y) x와 y가같으면 1, 다르면 0이수식의값이된다. if( x==y) 를 if( x=y ) 로잘못쓰지않도록주의!

관계연산자사용시주의점 잘못된방법 : 2 < x < 5 올바른방법 : (2 < x) && (x < 5)

실수를비교하는경우 (1e32 + 0.01) > 1e32 -> 양쪽의값이같은것으로간주되어서거짓 실수는약간의오차가있을수있죠!

중간점검 1. 관계수식의결과로생성될수있는값은무엇인가? 2. (3 >= 2) + 5의값은?

논리연산자 여러개의조건을조합하여참과거짓을따지는연산자 결과값은참 (1) 아니면거짓 (0) 연산자기호 사용예 의미 && x && y AND 연산, x와 y가모두참이면참, 그렇지않으면거짓 x y OR 연산, x 나 y 중에서하나만참이면참, 모두거짓이면거짓!!x NOT 연산, x 가참이면거짓, x 가거짓이면참

논리연산자의예 마차 > 2 대 && 시종 > 10 명 &&

논리연산의결과값 x y x&&y x y 참 참 참 참 참 거짓 거짓 참 거짓 참 거짓 참 거짓 거짓 거짓 거짓

참과거짓의표현방법 관계수식이나논리수식이만약참이면 1 이생성되고거짓이면 0 이생성된다. 피연산자의참, 거짓을가릴때에는 0이아니면참이고 0이면거짓으로판단한다. 음수는거짓으로판단한다. ( 예 ) NOT 연산자를적용하는경우!0 // 식의값은 1!3 // 식의값은 1!0 == 참 (true)!-3 // 식의값은 1

논리연산자의계산과정 논리연산의결과값은항상 1 또는 0이다. ( 예 ) (1 == 2) (2 == 2) 0 이아닌값을참으로취급하지만논리연산의결과값은항상 1 또는 0 입니다. 1 2 == 2 2 == 0 1 1

AND 연산자 27 800 (age <= 30) && (toeic >= 700) 참 (1) 참 (1) 참 (1)

OR 연산자 27 699 (age <= 30) (toeic >= 700) 참 (1) 거짓 (0) 참 (1)

NOT 연산자 피연산자의값이참이면연산의결과값을거짓으로만들고, 피연산자의값이거짓이면연산의결과값을참으로만든다. result =!1; // result에는 0가대입된다. result =!(2==3); // result에는 1이대입된다.

논리연산자의예 x 는 1, 2, 3 중의하나인가 (x == 1) (x == 2) (x == 3) x 가 60 이상 100 미만이다. (x >= 60) && (x < 100) x가 0도아니고 1도아니다. (x!= 0) && (x!= 1) // x 0 이고 x 1이다.

예제 #include <stdio.h> int main(void) { int x, y; printf(" 두개의정수를입력하시오 : "); scanf("%d%d", &x, &y); printf("%d && %d 의결과값 : %d", x, y, x && y); printf("%d %d 의결과값 : %d", x, y, x y); printf("!%d 의결과값 : %d", x,!x); } return 0; 두개의정수를입력하시오 : 1 0 1 && 0 의결과값 : 0 1 0 의결과값 : 1!1 의결과값 : 0

실습 : 윤년 윤년의조건 연도가 4로나누어떨어진다. 100으로나누어떨어지는연도는제외한다. 400으로나누어떨어지는연도는윤년이다. 연도를입력하시오 : 2012 result=1

실습 : 윤년 윤년의조건을수식으로표현 ( (year % 4 == 0 ) && (year % 100!= 0) ) (year % 400 == 0) 괄호가꼭필요한가요?

실습 : 윤년 // 윤년프로그램 #include <stdio.h> int main(void) { int year, result; printf(" 연도를입력하시오 : "); scanf("%d", &year); result = ((year % 4 == 0) && (year % 100!= 0)) (year % 400 == 0); printf("result=%d ", result); } return 0; 연도를입력하시오 : 2012 result=1

단축계산 && 연산자의경우, 첫번째피연산자가거짓이면다른피연산자들을계산하지않는다. ( 2 > 3 ) && ( ++x < 5 ) 연산자의경우, 첫번째피연산자가참이면다른피연산자들을계산하지않는다. ( 3 > 2 ) ( --x < 5 ) 첫번째연산자가거짓이면다른연산자는계산할필요가없겠군!! ++ 나 는실행이안될수도있으니주의하세요.

중간점검 1. 다음의조건에해당하는논리연산식을만들어보시오. 변수는적절하게선언되어있다고가정한다. 무주택기간 3년이상, 가구주의연령이 40세이상, 가족의수가 3명이상 2. 상수 10은참인가거짓인가? 3. 수식!3의값은? 4. 단축계산의예를들어보라.

조건연산자 x > y 가참이면 x 가수식의값이된다. max_value = (x > y )? x : y; x > y 가거짓이면 y 가수식의값이된다. absolute_value = (x > 0)? x: -x; // 절대값계산 max_value = (x > y)? x: y; // 최대값계산 min_value = (x < y)? x: y; // 최소값계산 (age > 20)? printf( 성인 \n ): printf( 청소년 \n );

#include <stdio.h> int main(void) { int x,y; 예제 첫번째수 = 2 두번째수 = 3 큰수 =3 작은수 =2 printf(" 첫번째수 ="); scanf("%d", &x); printf(" 두번째수 ="); scanf("%d", &y); } printf(" 큰수 =%d \n", (x > y)? x : y); printf(" 작은수 =%d \n", (x < y)? x : y); 2 >< 3 2 3 x y

콤마연산자 콤마로연결된수식은순차적으로계산된다. 먼저계산된다. 나중에계산된다. 어떤문장이던지순차적으로실행됩니다. x++, y++ ; 21 23 x y

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

비트 AND 연산자 0 AND 0 = 0 1 AND 0 = 0 0 AND 1 = 0 1 AND 1 = 1

비트 OR 연산자 0 OR 0 = 0 1 OR 0 = 1 0 OR 1 = 1 1 OR 1 = 1

비트 XOR 연산자 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 1 = 1 1 XOR 1 = 0

비트 NOT 연산자 NOT 0 = 1 NOT 1 = 0

예제 : 비트연산자 #include <stdio.h> int main(void) { int x = 9; // 1001 int y = 10; // 1010 printf(" 비트 AND = %08X", x & y); // 00001000 printf(" 비트 OR = %08X", x y); // 00001011 printf(" 비트 XOR = %08X", x ^ y); // 00000011 printf(" 비트 NOT = %08X", ~x ); // 11110110 } return 0; 비트 AND = 00000008 비트 OR = 0000000B 비트 XOR = 00000003 비트 NOT = FFFFFFF6

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

<< 연산자 비트를왼쪽으로이동 값은 2배가된다.

>> 연산자 비트를오른쪽으로이동 값은 1/2배가된다.

예제 : 비트이동연산자 #include <stdio.h> int main(void) { int x = 4; // 0100 printf(" 비트 << = %#08x", x << 1); // 1000 printf(" 비트 >> = %#08x", x >> 1); // 0010 } return 0; 비트 << = 0x000008 비트 >> = 0x000002

실습 : 픽셀의컬러표현 이미지의하나의픽셀이 32비트라고하면다음과같이수성되어있다. AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB ( 예 ) 순수한빨강색 : 0000 0000 1111 1111 0000 0000 0000 0000

빨강색성분만을추출 AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB RRRR RRRR 픽셀의색상을 16 진수로입력 : 00380000 입력된픽셀의색상 = 0x380000 추출된빨강색 = 0x000038

비트연산이용 color : AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB mask : 0000 0000 1111 1111 0000 0000 0000 0000 & ------------------------------------------- result: 0000 0000 RRRR RRRR 0000 0000 0000 0000 result : 0000 0000 RRRR RRRR 0000 0000 0000 0000 shift : >> 16 >> --------------------------------------- result: 0000 0000 0000 0000 0000 0000 RRRR RRRR

실습예제 #include <stdio.h> int main(void) { unsigned int color=0x00380000; unsigned int result; // 픽셀의색상 } result = color & 0x00ff0000; result = result >> 16; printf("%#08x", result); return 0; // 마스크연산 // 비트이동연산 픽셀의색상을 16 진수로입력 : 00380000 입력된픽셀의색상 = 0x380000 추출된빨강색 = 0x000038

우선순위 어떤연산자를먼저계산할것인지에대한규칙 -- ++ -- ++ / * / * % % + + - -

우선순위 우선순위연산자결합규칙 1 () [] ->. ++( 후위 ) --( 후위 ) ->( 좌에서우 ) 2 sizeof &( 주소 ) ++( 전위 )--( 전위 )~!*( 역참조 )+( 부호 )-( 부호 ), 형변환 <-( 우에서좌 ) 3 *( 곱셈 )/% ->( 좌에서우 ) 4 +( 덧셈 )-( 뺄셈 ) ->( 좌에서우 ) 5 << >> ->( 좌에서우 ) 6 < <= >= > ->( 좌에서우 ) 7 ==!= ->( 좌에서우 ) 8 &( 비트연산 ) ->( 좌에서우 ) 9 ^ ->( 좌에서우 ) 10 ->( 좌에서우 ) 11 && ->( 좌에서우 ) 12 ->( 좌에서우 ) 13?( 삼항 ) <-( 우에서좌 ) 14 =+=*=/=%=&=^= =<<=>>= <-( 우에서좌 ) 15,( 콤마 ) ->( 좌에서우 )

우선순위의일반적인지침 콤마 < 대입 < 논리 < 관계 < 산술 < 단항 괄호연산자는가장우선순위가높다. 모든단항연산자들은이항연산자들보다우선순위가높다. 콤마연산자를제외하고는대입연산자가가장우선순위가낮다. 연산자들의우선순위가생각나지않으면괄호를이용 ( x <= 10 ) && ( y >= 20 ) 관계연산자나논리연산자는산술연산자보다우선순위가낮다. x + 2 == y + 3

결합규칙 만약같은우선순위를가지는연산자들이여러개가있으면어떤것을먼저수행하여야하는가의규칙 * 와 % 의우선순위가같으므로왼쪽에서오른쪽으로연산을수행한다. = 연산자는오른쪽우선결합이므로오른쪽부터계산된다. x = y = z = 5 2 * 5 % 3 1 10 % 3 2 1 1 x = y = 5 2 x = 5 3 5

결합규칙의예 y = a % b / c + d * (e - f); 2 3 4 5 6 1

중간점검 1. 연산자중에서가장우선순위가낮은연산자는무엇인가? 2. 논리연산자인 && 과 중에서우선순위가더높은연산자는무엇인가? 3. 단항연산자와이항연산자중에서어떤연산자가더우선순위가높은가? 4. 관계연산자와산술연산자중에서어떤연산자가더우선순위가높은가?

예제 #include <stdio.h> int main(void) { int x=0, y=0; int result; result = 2 > 3 6 > 7; printf("%d", result); result = 2 3 && 3 > 2; printf("%d", result); result = x = y = 1; printf("%d", result); 0 1 1-1 result = - ++x + y--; printf("%d", result); } return 0;

실습 : 화씨온도를섭씨로바꾸기

잘못된부분은어디에? #include <stdio.h> int main(void) { double f_temp; double c_temp; printf(" 화씨온도를입력하시오 "); scanf("%lf", &f_temp); c_temp = 5 / 9 * (f_temp - 32); printf(" 섭씨온도는 %f입니다, c_temp); } return 0; 화씨온도를입력하시오 : 90 섭씨온도는 0.000000 입니다. c_temp = 5.0 / 9.0 * (f_temp - 32);

도전문제 위에서제시한방법외에다른방법은없을까? ((double)5 /(double)9 ) * (f_temp - 32); 가되는지확인하여보자. ((double)5 /9 ) * (f_temp - 32); 가되는지확인하여보자.

Q & A