510 likes | 830 Views
4. 연산자의 이해. 산술 연산자. 논리 연산자. 1. 3. 이 장에서 다룰 내용. 관계 연산자. 2. 비트 연산자. 4. 연산자 우선순위. 5. 01_ 산술 연산자. 기본적인 연산자. 01 #include <stdio.h> 02 03 int main() 04 { 05 int a, b = 5 , c = 3; 06 07 a = b + c; 08 printf(" %d + %d = %d <br>", b, c, a );09 10 a = b - c;
E N D
산술 연산자 논리 연산자 1. 3. 이 장에서 다룰 내용 관계 연산자 2. 비트 연산자 4. 연산자 우선순위 5.
01_산술 연산자 • 기본적인 연산자
01 #include <stdio.h> 02 03 int main() 04 { 05 int a, b = 5 , c = 3; 06 07 a = b + c; 08 printf(" %d + %d = %d \n", b, c, a );09 10 a = b - c; 11 printf(" %d - %d = %d \n", b, c, a ); 12 13 a = b * c; 14 printf(" %d * %d = %d \n", b, c, a ); 15 16 a = b / c; 17 printf(" %d / %d = %d \n", b, c, a ); [기본예제 4-1] 산술 연산자 사용 예 더하기 빼기 곱하기 나누기
18 19 a = b % c; 20 printf(" %d %% %d = %d \n", b, c, a ); 21 } [기본예제 4-1] 산술 연산자 사용 예 나머지
01_산술 연산자 • 연산자 우선순위 • 괄호 > 곱셈, 나눗셈 > 덧셈, 뺄셈 • 연산자가 모두 동일한 경우에는 왼쪽에서 오른쪽으로 계산 진행(→) • 강제 형변환 • 프로그래머에 의해서형이 변환되는 것 • 변환하려는 변수 또는 상수 앞에 ‘(형이름)’을 붙임 • 캐스트(cast) 연산자 : 기존의 데이터형을 변환하는 연산자
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 2 , b = 3 , c = 4; 06 int result1, mok, namugi; 07 float result2; 08 09 result1 = a + b - c; 10 printf(" %d + %d - %d = %d \n", a, b, c, result1 ); 11 12 result1 = a + b * c; 13 printf(" %d + %d * %d = %d \n", a, b, c, result1 ); 14 15 result2 = a * b / (float) c; [응용예제 4-2] 우선순위와 강제 형변환 예 정수형 변수 선언 실수형 변수 선언 더하기와 빼기 더하기와 곱하기 강제 형변환
16 printf(" %d * %d / %d = %f \n", a, b, c, result2); 17 18 mok = [ ① ] 19 printf(" %d / %d 의 몫은 %d \n", c, b, mok ); 20 21 namugi =[ ② ] 22 printf(" %d / %d 의 나머지는 %d \n", c, b, namugi ); 23 } [응용예제 4-2] 우선순위와 강제 형변환 예 c / b; 몫 구하기 c % b; 나머지 구하기
01_산술 연산자 • 간단한 연산자 우선순위 • 9행 : + 와 - 연산자 사용 시 우선 순위 우선순위 동일함 • 12행 : + 와 * 연산자 사용 시 우선 순위 * 이 + 보다 우선순위 높음 어떤 것을 먼저 계산하든지 결과는 동일 곱셈 먼저 계산
01_산술 연산자 • 강제 형변환수행 시(15행)
01_산술 연산자 • 강제 형변환을 하지 않은 경우
01_산술 연산자 • 대입 연산자와 증감 연산자 • 대입 연산자 : =, +=, -=, *=, /=, %= • 증감 연산자 : ++, --
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 10; 06 07 a++; 08 printf ( " a ++ ==> %d \n", a); 09 10 a--; 11 printf ( " a -- ==> %d \n", a); 12 13 a += 5; 14 printf ( " a += 5 ==> %d \n", a); 15 16 a -= 5; [기본예제 4-3] 대입연산자와 증감연산자 사용 예 a = a + 1 a = a - 1 a = a + 5 a = a - 5
17 printf ( " a -= 5 ==> %d \n", a); 18 19 a *= 5; 20 printf ( " a *= 5 ==> %d \n", a); 21 22 a /= 5; 23 printf ( " a /= 5 ==> %d \n", a); 24 25 a %= 5; 26 printf ( " a %%= 5 ==> %d \n", a); 27 } [기본예제 4-3] 대입연산자와 증감연산자 사용 예 a = a * 5 a = a / 5 a = a % 5
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 10, b; 06 07 b = a++; 08 printf ( " %d \n", b); 09 10 [ ① ] 11 printf ( " %d \n", b); 12 } [응용예제 4-4] 증감 연산자 사용 예 b = a를 수행한 후 b = a + 1 수행 b = ++a; a=a+1를 수행한 후 b =a 수행
a++와 ++a의 차이 7행, 10행 01_산술 연산자
관계 연산자의 기본 개념 비교 연산자 : 어떤 것이 큰지, 작은지, 같은지 비교 결과는 참(1, true), 거짓(0, false) 주로 조건식에 사용, 단독으로는 쓰이지 않음 관계 연산자 종류 참 : 1 거짓 : 0 a < b = 02_관계 연산자
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 100 , b = 200; 06 07 printf(" %d == %d는 %d 이다.\n", a, b, a==b); 08 printf(" %d > %d는 %d 이다.\n", a, b, a>b); 09 printf(" %d < %d는 %d 이다.\n", a, b, a<b); 10 printf(" %d >= %d는 %d 이다.\n", a, b, a>=b); 11 printf(" %d <= %d는 %d 이다.\n", a, b, a<=b); 12 printf(" %d != %d는 %d 이다.\n", a, b, a!=b); 13 printf(" %d = %d는 %d 이다.\n", a, b, a=b); 14 } [기본예제 4-5] 관계 연산자 사용 예 같다 크다 작다 크거나 같다 작거나 같다 같지 않다 대입(?)
대입 연산자의 작동 13행 : 의도와 다르게 작동 ‘==’ 연산자 대신 ‘=’ 연산자를 사용한 결과 == : 값이 같은지 체크하는 연산자 = : 오른쪽의 값을 왼쪽에 대입하는 연산자 02_관계 연산자
논리 연산자의 기본 개념 여러 조건을 복합하여 사용 &&(그리고), ||(또는), !(부정) 연산자의 종류와 예 03_논리 연산자 참이 되려면 두 조건이 모두 참이어야 함
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 99; 06 07 printf(" AND 연산 : %d \n", (a >= 100) && (a <= 200) ); 08 printf(" OR 연산 : %d \n", (a >= 100) || (a <= 200) ); 09 printf(" NOT 연산 : %d \n", !(a==100) ); 10 } [기본예제 4-6] 논리 연산자 사용 예 ① 그리고(AND) 또는(OR) 부정(NOT)
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 100, b = -200; 06 07 printf(" 상수의 AND 연산 : %d \n", a && b ); 08 printf(" 상수의 OR 연산 : %d \n", [ ① ]); 09 printf(" 상수의 NOT 연산 : %d \n", [②]); 10 } [응용예제 4-7] 논리 연산자 사용 예 ② 그리고(AND) a || b 또는(OR) !a 부정(NOT)
04_비트 연산자 • 비트 연산자 • 정수나 문자 등을 2진수로 변환한 후 각 비트끼리 연산 수행 • 비트 연산자의 종류와 예
04_비트 연산자 • 비트 논리곱(&) 연산 • 10진수를 2진수로 변환한 후 각 비트에 AND 연산 수행 • 결과 : 2진수로는 00102 , 10진수로는 2 • 두 수의 자릿수가 다를 때는 빈 자리에 0을 채운 후 연산 진행
01 #include <stdio.h> 02 03 int main() 04 { 05 printf(" 10 & 7 = %d \n", 10 & 7 ); 06 printf(" 123 & 456 = %d \n", 123 & 456 ); 07 printf(" 0xFFFF & 0000 = %d \n ", 0xFFFF & 0000 ); 08 } [기본예제 4-8] 비트 논리곱 연산자 사용 예 10 & 7 수행 123 & 456 수행 FFFF & 0000 수행
04_비트 연산자 • 비트 논리합(|) 연산 • 10진수를 2진수로 변환한 후 각 비트에 OR 연산 수행 • 결과 : 2진수로는 11112 , 10진수로는 15
01 #include <stdio.h> 02 03 int main() 04 { 05 printf(" 10 | 7 = %d \n", 10 | 7 ); 06 printf(" 123 | 456 = %d \n", 123 | 456 ); 07 printf(" 0xFFFF | 0000 = %d \n ", 0xFFFF | 0000 ); 08 } [기본예제 4-9] 비트 논리합 연산자 사용 예 10 | 7 수행 123 | 456 수행 FFFF | 0000 수행
04_비트 연산자 • 비트 배타적 논리합(^) 연산 • 두 값이 다르면 참(1), 같으면 거짓(0) • 결과 : 2진수로는 11012 , 10진수로는 13
01 #include <stdio.h> 02 03 int main() 04 { 05 printf(" 10 ^ 7 = %d \n", 10 ^ 7 ); 06 printf(" 123 ^ 456 = %d \n", 123 ^ 456 ); 07 printf(" 0xFFFF ^ 0000 = %d \n ", 0xFFFF ^ 0000 ); 08 } [기본예제 4-10] 비트 배타적 논리합 연산자 사용 예 10 ^ 7 수행 123 ^ 456 수행 16진수 FFFF ^ 0000 수행
01 #include <stdio.h> 02 03 int main() 04 { 05 char a = 'A', b, c; 06 char mask = 0x0F; 07 08 printf(" %X & %X = %X \n", a, mask, a & mask); 09 printf(" %X | %X = %X \n", a, mask, a | mask); 10 11 mask = 'a' - 'A'; 12 13 b = [ ① ] 14 printf(" %c ^ %d = %c \n", a, mask , b); 15 a = [ ② ] 16 printf(" %c ^ %d = %c \n", b, mask , a); 17 } [응용예제 4-11] 비트 연산에 마스크를 사용한 예 마스크 값을 설정 ‘A’ & 0xFF 수행 ‘A’ | 0xFF 수행 a ^ mask; b ^ mask;
04_비트 연산자 • 마스크(mask)를 사용한 비트 연산 • 6행 • 마스크 값 선언 : 16진수 0x0F16 • 8행 : 마스크를 사용한 비트 논리곱 결과
04_비트 연산자 • 9행 : 마스크를 사용한 비트 논리합 결과 • 11행 : 마스크 값 선언 • 13행, 15행 : 마스크를 사용하여 ‘a’, ‘A’의 비트 배타적 논리합 수행
04_비트 연산자 • 비트 부정 연산자(~) • 두 수에 대한 연산이 아니라 비트 하나의 값을 반대로 만듦 1의 보수 • 0 1로 , 1 0으로 • 해당 값의 음수(-) 값을 찾을 때 사용 + 1 = 2의 보수(음수) 1의 보수(각 비트의 값을 반전시킨 값)
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 12345; 06 07 printf(" %d \n", ~a + 1); 08 } [기본예제 4-12] 비트 부정 연산자 사용 예 2의 보수 구하기
04_비트 연산자 • 왼쪽 시프트 연산자(<<) • 나열된 비트를 왼쪽으로 이동시키는 연산자 • 시프트할 때마다 2n(21, 22, 23…)을 곱한 효과 • 2610 의 왼쪽 시프트 연산 예 • 0000 11012로 변환한 후 비트 이동
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 10; 06 printf ("%d 를 왼쪽 1회 시프트하면 %d 이다.\n", a, a<<1); 07 printf ("%d 를 왼쪽 2회 시프트하면 %d 이다.\n", a, a<<2); 08 printf ("%d 를 왼쪽 3회 시프트하면 %d 이다.\n", a, a<<3); 09 } [기본예제 4-13] 왼쪽 시프트 연산자 사용 예 왼쪽 시프트시킬 때마다 결과 출력
04_비트 연산자 • 오른쪽 시프트 연산자(>>) • 나열된 비트를 오른쪽으로 이동시키는 연산자 • 시프트할 때마다 2n(21, 22, 23…)으로 나눈 효과 • 2610 의 오른쪽 시프트 연산 예
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 10; 06 printf ("%d 를 오른쪽 1회 시프트하면 %d 이다.\n", a, a>>1); 07 printf ("%d 를 오른쪽 2회 시프트하면 %d 이다.\n", a, a>>2); 08 printf ("%d 를 오른쪽 3회 시프트하면 %d 이다.\n", a, a>>3); 09 printf ("%d 를 오른쪽 4회 시프트하면 %d 이다.\n", a, a>>4); 10 } [기본예제 4-14] 오른쪽 시프트 연산자 사용 예 오른쪽 시프트시킬 때마다 결과 출력
01 #include <stdio.h> 02 03 int main() 04 { 05 int a = 100, result; 06 07 int i; 08 09 for (i = 1 ; i <= 5 ; i ++) 10 { 11 [ ① ] 12 printf ("%d << %d = %d\n", a, i, result); 13 } 14 15 for (i = 1 ; i <= 5 ; i ++) 16 { 17 [ ② ] 18 printf ("%d >> %d = %d\n", a, i, result); 19 } 20 } [응용예제 4-11] 비트 연산에 마스크를 사용한 예 왼쪽 시프트 연산을 5회 반복하여 출력 result = a << i; 오른쪽 시프트 연산을 5회 반복하여 출력 result = a >> i;
우선순위가 적용되는 연산자 목록 05_연산자 우선순위
[예제모음_07] 입력된 두 실수의 산술 연산 • 예제설명 • 숫자 실수를 입력받고 두 수의 다양한 연산을 출력하는 프로그램이다. • 나머지를 구하는 식에서는 강제 형변환을 사용한다. 실행결과
01 #include <stdio.h> 02 03 int main() 04 { 05 float a, b; 06 float result; 07 08 printf("첫번째 계산할 값을 입력하세요 ==> "); 09 scanf("%f", &a); 10 printf("두번째 계산할 값을 입력하세요 ==> "); 11 scanf("%f", &b); 12 13 result = a + b; 14 printf(" %5.2f + %5.2f = %5.2f \n", a, b, result); 15 result = a - b; 16 printf(" %5.2f - %5.2f = %5.2f \n", a, b , result); 예제모음_07 소스 실수 변수 선언 키보드로 실수를 입력받음 키보드로 실수를 입력받음 실수 덧셈 실수 뺄셈
17 result = a * b; 18 printf(" %5.2f * %5.2f = %5.2f \n", a, b, result); 19 result = a / b; 20 printf(" %5.2f / %5.2f = %5.2f \n", a, b, result); 21 result = (int)a % (int)b; 22 printf(" %d %% %d = %d \n", (int)a, (int)b, (int)result); 23 } 예제모음_07 소스 실수 곱셈 실수 나눗셈 나머지 연산을 위해 강제 형변환
[예제모음_08] 동전 교환 프로그램 • 예제설명 • 입력된 액수만큼 500원, 100원, 50원, 10원짜리 동전으로 교환해주는 프로그램이다. • 동전의 총 개수는 최소화한다. • 고액의 동전을 먼저 바꿔준다. 실행결과
01 #include <stdio.h> 02 03 int main() 04 { 05 int coin, remain; 06 int c500, c100, c50, c10; 07 08 printf(" ## 교환할 돈은 ? "); 09 scanf("%d", &coin); 10 11 c500 = coin / 500; 12 coin = coin % 500; 13 14 c100 = coin / 100; 15 coin = coin % 100; 16 예제모음_08 소스 동전, 남은 돈 변수 각 동전 개수 변수 교환할 금액 입력 500원짜리 동전 개수 나머지 금액 100원짜리 동전 개수 나머지 금액
17 c50 = coin / 50; 18 coin = coin % 50; 19 20 c10 = coin / 10; 21 coin = coin % 10; 22 23 printf("\n 오백원짜리 ==> %d 개 \n", c500); 24 printf(" 백원짜리 ==> %d 개 \n", c100); 25 printf(" 오십원짜리 ==> %d 개 \n", c50); 26 printf(" 십원짜리 ==> %d 개 \n", c10); 27 printf(" 바꾸지 못한 잔돈 ==> %d 원 \n", coin); 28 } 예제모음_08 소스 50원짜리 동전 개수 나머지 금액 10원짜리 동전 개수 나머지 금액
[예제모음_09] 윤년 계산 프로그램 • 예제설명 • 입력된 년도가 윤년인지 계산하는 프로그램이다. • 4로 나누어 떨어지고, 100으로 나누어 떨어지지 않으면 윤년 • 400으로 나누어 떨어지는 것도 윤년 실행결과
01 #include <stdio.h> 02 03 int main() 04 { 05 int year; 06 07 printf("년도를 입력하세요. : "); 08 scanf("%d", &year); 09 10 if ( ((year % 4 == 0) && ( year % 100 != 0 )) || ( year % 400 == 0) ) 11 printf ("%d 년은 윤년입니다. \n", year); 12 else 13 printf ("%d 년은 윤년이 아닙니다. \n", year); 14 } 예제모음_09 소스 키보드로 년도 입력 입력된 년도가 윤년인지 판단하여 출력
요약 • +, -, *, / 등의 기호로, 계산을 수행하는 기본적인 연산자 • 우선순위 : *, /가 +, -보다 높음, 괄호가 가장 우선 • 캐스트 연산자 : 데이터형을 강제로 바꾸는 연산자 산술 연산자
요약 대입 연산자 관계 연산자