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