제 4 장 연산자와 수식

Download Report

Transcript 제 4 장 연산자와 수식

제 4 장 연산자와 수식
1
목 차
•
•
•
•
•
•
•
•
•
대입 연산자
사칙 연산자와 나머지 연산자
증가 연산자, 감소 연산자
관계 연산자, 상등 연산자
논리 연산자
조건 연산자
비트 연산자
캐스트 연산자
sizeof 연산자
연산자의 종류
기능별 분류
기호
부호 연산자
+
-
산술 연산자
+
- * /
관계 연산자
! <
논리 연산자
&& ||
캐스트 연산자
<= >
%
>=
(형명)
증감 연산자
++ --
비트 연산자
& | ^ <<
대입 연산자
= += -= *=
조건 연산자
?|
쉼표 연산자
,
sizeof 연산자
== !=
>> ~
/=
sizeof
3
연산자의 우선순위
연산순위
연산자 종류
1
()
[]
->
2
!
~
++
3
*
/
%
4
+
-
5
<<
6
<
7
==
8
&
9
^
10
|
11
&&
12
||
13
?|
14
=
15
.
.
--
-
*
&
sizeof
>>
<=
>
>=
!=
+=
-=
*=
/=
%=
4
대입연산자
5
대입 연산자의 종류
• 대입 연산자의 종류
1. =
2. +=, -=, *=, /=, %=
…
• 예제
one = 0;
two = 0;
three = 0;
one = 1;
two = 2;
three = 3;
one = two = three = 0;
three = (two = (one = 1) + 1) +
1;
6
대입 연산자의 종류
• 축약형 대입 연산자
일반
연산식
축약형
연산식
i = i + 2;
i += 2;
x = x – 10;
x -= 10;
y = y * 5;
y *= 5;
설
명
i의 값을 2씩 증가 시킨다.
x의 값을 10씩 감소 시킨다.
y의 값을 5의 배수로 증가 시킨다.
7
주의사항
• 연산자 우선순위에 의한 위험성
#include <stdio.h>
main()
{
int
imsi = 3;
imsi += 5 * 2;
printf("1. imsi = %d\n", imsi);
imsi = 3
imsi *= 5 + 2;
printf("2. imsi = %d\n", imsi);
// ①
// ②
}
1. imsi = 13
2. imsi = 21
8
사칙연산자
9
사칙 연산자의 종류
• + - * /
• 예제
–
–
–
–
imsi
imsi
imsi
imsi
=
=
=
=
5 + 45;
12 – 6;
76 * 29;
66 / 22;
//
//
//
//
50
6
2204
3
10
나누기연산
• 주의사항
– 정수 나누기 정수는 정수이다.
– 0으로 나눌 수 없다.
• 예제 (수학적인 경우)
–
–
–
–
5.0 / 2.0
5.0 / 2
5 / 2.0
5. / 2.
: 2.5
: 2.5
: 2.5
: 2.5
11
사칙 연산자
• 주의사항 (C언어의 경우:시스템마다 다른 결과)
#include <stdio.h>
#define PRINTF(a, b) printf(#a” / “#b” = %.1f\n”, a / b)
#define PRINTD(a, b) printf(#a” / “#b” = %d\n”, a / b)
main()
{
PRINTF(5.0, 2.0);
PRINTF(5.0, 2);
PRINTF(5, 2.0);
PRINTF(5., 2.);
PRINTF(5, 2);
PRINTD(5.0, 2.0);
PRINTD(5.0, 2);
PRINTD(5, 2.0);
PRINTD(5., 2.);
PRINTD(5, 2);
}
5.0 / 2.0 = 2.5
5.0 / 2 = 2.5
5 / 2.0 = 2.5
5. / 2. = 2.5
5 / 2 = 0.0
5.0 / 2.0 = 2.5
5.0 / 2 = 2.5
5 / 2.0 = 2.5
5. / 2. = 2.5
5 / 2 = 2.5
5.0 / 2.0
5.0 / 2 =
5 / 2.0 =
5. / 2. =
5 / 2 = 2
5.0 / 2.0
5.0 / 2 =
5 / 2.0 =
5. / 2. =
5 / 2 = 2
= 1074003968
1074003968
1074003968
1074003968
= 0
0
0
0
12
사칙 연산자
• 주의사항-해결방안
1. printf(“5.0 / 2.0 = %.1f, %d\n”, 5.0 / 2.0, 5.0 /
2.0);
2. printf(“5.0 / 2 = %.1f, %d\n”, 5.0 / 2, 5.0 / 2);
3. printf(“5 / 2.0 = %.1f, %d\n”, 5 / 2.0, 5 / 2.0);
4. printf(“5. / 2. = %.1f, %d\n”, 5. / 2., 5. / 2.);
5. printf(“5 / 2 = %.1f, %d\n”, 5 / 2, 5 / 2);
– 1번과 같이 인자(5.0/2.0)에 정확한 소수점을 사용하
고 출력 시에는 %f를 사용하면 됨.
13
나머지 연산자
• 숫자를 나눈 후 발생하는 나머지를 구하는
연산자
• 정수연산만 가능하며 실수연산 불가
• 예)
–5%4
–7%3
– 10 % 7
결과값 : 1 (나머지)
결과값 : 1 (나머지)
결과값 : 3 (나머지)
14
나머지 연산자
• 예제 (10문자마다 개행문자 넣기)
#include <stdio.h>
main()
{
int
i;
for(i = 0;i < 26;i++)
{
printf("%c ", 'a' + i);
if(((i + 1) % 10) == 0) putchar('\n');
}
}
a b c d e f g h i j
k l m n o p q r s t
u v w x y z
15
나머지 연산자
• 예제 (시, 분, 초 구하기)
#include <stdio.h>
#define MIN
60
#define HOUR
3600
main()
{
int
int
int
초를 입력하시오 (< 86400) : 7000
7000초는 1시간 56분 40초 입니다.
seconds;
hours, minutes;
min_left, sec_left;
printf(“초를 입력하시오 (< 86400) : “);
scanf(“%d”, &seconds);
hours = seconds / HOUR;
minutes = seconds / MIN;
min_left = minutes % MIN;
sec_left = seconds % MIN;
puts(“HOUR : 시간을 초로 환산한 매크로 변수”);
puts(“MIN : 분을 초로 환산한 매크로 변수"
printf(“%d 초는 %d 시간 %d 분 %d 초 입니다.\n”,
seconds, hours, min_left, sec_left);
}
16
나머지 연산자
• 예제 (배수 구하기)
#include <stdio.h>
#define MULTIPUL
7
main()
{
int
int
i;
num;
puts(“1부터 100사이의 정수를 입력하시오.”);
scanf(“%d”, &num);
for(i = 1;i <= num;i++)
if((i % MULTIPUL) == 0)
printf(“%d의 배수 %d\n”, MULTIPUL, i);
}
1부터 100사이의 정수를 입력하시오.
77
7의 배수 7
7의 배수 14
7의 배수 21
…
17
증가, 감소 연산자의 종류
• 증가 연산자 (++)
– 변수의 값을 하나 증가 시킴
• 감소 연산자 (--)
– 변수의 값을 하나 감소 시킴
• 전치 증가 연산자 (++i)
– ++ 연산자가 인자의 앞에 존재
• 후치 증가 연산자 (i++)
– ++ 연산자가 인자의 뒤에 존재
• 전치 감소 연산자 (--i)
– -- 연산자가 인자의 앞에 존재
• 후치 감소 연산자 (i--)
– -- 연산자가 인자의 뒤에 존재
18
전치, 후지 증감 연산자
• ++i : 전치 증가 연산 (i = i + 1과 같음)
– i의 값을 바로 증가 시킴
• i++ : 후치 증가 연산
– i의 값을 나중에 증가 시킴
• --i : 전치 감소 연산 (i = i – 1과 같음)
– i의 값을 바로 감소 시킴
• i-- : 후치 감소 연산
– i의 값을 나중에 감소 시킴
19
증가연산자의 증가시점
• i가 5일 때,
• j = ++i;
// j에 6이 할당
– 전치 연산의 경우 변수가 할당되기 전에 바로
증가
• j = i++;
// j에 5가 할당
– 후치 연산의 경우 변수가 할당된 다음 증가
20
예 제
• 전치, 후치 연산에 의한 값 변환
i = 7, j = 5 일 때
1. a = i++
2. b = ++i
3. c = i++
d = i++
4. e = --i
1.
2.
3.
4.
a
b
c
e
=
=
=
=
*
*
*
*
+
3;
3;
3;
3;
j++;
21
24
21, d = 24
30
21
예 제
• 증가 연산자
#include <stdio.h>
main()
{
puts(“1 번”);
{
printf(“1 2 3 4 5\n”);
}
puts(“2 번”);
{
int
one = 1, two = 2, three =3, four = 4, five = 5;
printf(“%d %d %d %d %d\n”, one, two, three, four, five);
}
puts(“3 번”);
{
int
one = 1;
printf(“%d ”, one++);
printf(“%d ”, one++);
printf(“%d ”, one++);
printf(“%d ”, one++);
printf(“%d\n”, one++);
}
22
예 제
puts(“4 번”);
{
int
i;
int
one = 1;
for(i = 0;i < 5;i++)
printf(“%d “, one++);
puts(“”);
}
puts(“5 번”);
{
int
i;
for(i = 0;i < 5;i++)
printf(“%c “, ‘1’ + i);
}
puts(“6 번”);
{
int
i;
for(i = 1;i <= 5;i++)
printf(“%d “, i);
}
}
23
주의사항
• 절대 사용하지 말아야 하는 곳
– 증감 연산자를 하나 이상 같은 수식에 사용할 때
• 예제
– i=
j=
j=
j=
…
7일 때,
j++ + ++i;
i++ + i++;
i-- + ++i;
24
관계 연산자
25
관계 연산자의 종류
관계 연산자
내 용
a>b
a가 b보다 크다.
a<b
a가 b보다 작다.
a <= b
a가 b보다 작거나 같다. (수학적 표기와 다름)
a >= b
a가 b보다 크거나 같다. (수학적 표기와 다름)
상등 연산자
내
용
a == b
a와 b가 같다. (수학적 표기와 다름)
a != b
a와 b가 같지 않다. (수학적 표기와 다름)
26
관계 연산자의 핵심
• C에서 0은 거짓을 0 이외의 수는 거짓을 의미함
• 관계 연산자의 결과 값은 1아니면 0 임
• 예제
1.if(a > 5) puts(“a가 5보다 크다.”);
2.while(1) { puts(“forever”); }
3.if((grade <= 100) && (grade >= 90))
puts(“당신은 우수한 성적입니다.”);
// 무한루프
27
관계 연산자의 핵심
• 예제 (관계 연산자의 결과 값 출력)
#include <stdio.h>
main()
{
int
a = 7;
printf(“%d”, a > 5);
}
1
28
주의사항
• 비교대상의 형(Type)이 다를 경우
#include <stdio.h>
main()
{
int
x = 1000;
unsigned
y = -1;
if(x > y)
puts(“x가 y보다 크다.”);
else
puts(“x가 y보다 작다.”);
printf(“x = %u, y = %u\n”, x, y);
}
x가 y보다 작다.
x = 1000, y = 4294967295
29
논리 연산자
30
논리 연산자의 종류
• 논리합 (||)
– 두 항 중에 하나라도 참이면 그 결과값이 참
• 논리곱 (&&)
– 두 항이 모두 참일 때만 그 결과값이 참이 되고 둘 중
에 하나라도 거짓인 항이 있으면 전체 결과값이 거짓
• 논리부정 (!!)
– 항의 결과 값을 반대로 만듦
31
논리 연산 방법
x
y
논리합
논리곱
논리부정 (x)
0
0
0
0
1
0
1
1
0
1
1
0
1
0
0
1
1
1
1
0
32
논리 연산 방법
• 예제 (논리연산 결과 출력)
#include <stdio.h>
main()
{
puts(“논리곱 (&&)”);
printf(“0 && 0 = %d\n”,
printf(“0 && 1 = %d\n”,
printf(“1 && 0 = %d\n”,
printf(“1 && 1 = %d\n”,
0
0
1
1
&&
&&
&&
&&
0);
1);
0);
1);
puts(“”);
puts(“논리합 (||)”);
printf(“0 || 0 = %d\n”,
printf(“0 || 1 = %d\n”,
printf(“1 || 0 = %d\n”,
printf(“1 || 1 = %d\n”,
0
0
1
1
||
||
||
||
0);
1);
0);
1);
puts(“”);
puts(“논리부정 (!)”);
printf(“!0 = %d\n”, !0);
printf(“!1 = %d\n”, !1);
}
논리곱 (&&)
0 && 0 = 0
0 && 1 = 0
1 && 0 = 0
1 && 1 = 1
논리합 (||)
0 || 0 = 0
0 || 1 = 1
1 || 0 = 1
1 || 1 = 1
논리부정 (!)
!0 = 1
!1 = 0
33
논리 연산 방법
• 예제 (점수 입력 후 학점 출력)
#include <stdio.h>
main()
{
int
score;
printf(“점수를 입력하시오 (0 ~ 100) : “);
scanf(“%d”, &score);
if((score <= 100) && (score > 90)) puts(“A 학점”);
else
if((score <= 90) && (score > 80)) puts(“B 학점”);
else
if((score <= 80) && (score > 70)) puts(“C 학점”);
else
if((score <= 70) && (score > 60)) puts(“D 학점”);
else
if(score <= 60) puts(“F 학점”);
}
점수를 입력하시오 (0 ~ 100) : 75
C 학점
34
단축연산 및 주의사항
• 단축 연산
– 첫 번째 항의 결과에 따라서 다음 항을 검사할지 말지
결정
– if((a > 5) && (b < 5)) puts("…");
• a가 5보다 크지 않다면 첫 번째 항의 결과 값이 거짓이 되므
로 두 번째 항인 b < 5를 검사할 필요가 없어짐
• 주의사항
– if((a > 5) && (b++ < 5)) puts("…");
• if()문을 수행하고 나면 b는 항상 증가할 것이라고 생각할 수
있는 경우
• a가 5보다 크지 않는 순간 두 번째 항이 처리되지 않기 때문
에 a의 값에 따라서 b++는 수행되기도 하고 안되기도 함
35
단축연산 및 주의사항
• 예제 (단축연산에 의한 위험성)
#include <stdio.h>
main()
{
int
a = 7, b = 5, c = 9;
if((a > 8) && (++b > 3)) puts(“첫 번째 if()문 수행”);
printf(“%d %d %d\n”, a, b, c);
}
7 5 9
36
조건 연산자
37
조건 연산자의 개념
• 3개의 항을 이용함 ( ? : )
• 삼항 연산자라고도 부름
• 조건 연산자는 복잡해 보이고 개념이 바로
와 닿지 않으며 실수할 확률이 높아 고급
문법책에서는 사용의 자제를 당부하기도
함
38
표현식
• result = (expression) ? (value1) : (value2) ;
– expression에서 수식을 검사하고 만약 참이면 바로 뒤에 있는
value1의 값을 result에 할당하고 그렇지 않으면 value2를 result
에 할당함 (value는 수식이나 할당 문도 올 수 있음)
• x = y ? 10 : 100;
–
// x가 int형일 경우
y의 값이 0보다 크면 10이 X에 할당되고 그렇지 않으면 100이 할당됨
• x = (y > 10) ? (y + 10) : (y – 10);
–
y가 10보다 크면 y + 10한 결과가 x에 할당되고 그렇지 않으면 y - 10한 결과가 x에 할당됨
• x = (y > 10) ? “OK” : “NO”;
–
// x가 int형일 경우
// x가 포인터변수인 경우
y가 10보다 크면 OK라는 문자열이 x에 할당(주소 값이 할당됨)되고 그렇지 않으면 NO가 할당됨
39
예 제
• 입력 값 중에서 큰 값 구하기
#include <stdio.h>
main()
{
int
one, two, result;
puts("두 수를 입력하시오.");
scanf("%d %d", &one, &two);
result = (one > two) ? one : two ;
printf("두 수중에서 더 큰 수는 %d 입니다.\n", result);
}
두 수를 입력하시오.
35 85
두 수중에서 더 큰 수는 85 입니다.
40
예 제
• 절대값 구하기 (조건 연산자 미 사용)
#include <stdio.h>
main()
{
int
one;
puts("하나의 수를 입력하시오.");
scanf("%d", &one);
if(one > 0)
printf("절대값 : %d\n", one);
else
printf("절대값 : %d\n", one * -1);
}
하나의 수를 입력하시오.
-345
절대값 : 345
41
예 제
• 절대값 구하기 (조건 연산자 사용)
#include <stdio.h>
main()
{
int
one;
puts("하나의 수를 입력하시오.");
scanf("%d", &one);
printf("절대값 : %d\n", (one > 0) ? one : (one * -1));
}
두 수를 입력하시오.
35 85
두 수중에서 더 큰 수는 85 입니다.
42
예 제
• 점수 입력 후 학점 출력
#include <stdio.h>
main()
{
int
score;
printf(“점수를 입력하시오 (0 ~ 100) : “);
scanf(“%d”, &score);
(score
(score
(score
(score
<=
<=
<=
<=
100)
90 )
80 )
70 )
&&
&&
&&
&&
(score
(score
(score
(score
>
>
>
>
90)
80)
70)
60)
?
?
?
?
puts("A
puts("B
puts("C
puts("D
학점")
학점")
학점")
학점")
:
:
:
: puts("F 학점");
}
점수를 입력하시오 (0 ~ 100) : 75
C 학점
43
비트연산자
44
비트연산자
•
•
•
•
•
•
~ : 1의 보수비트
^ : XOR 비트
| : OR 비트
& : AND
<< : 왼쪽shift
>> : 오른쪽 shift
45
비트연산자
•
•
~ 5 : 0000 0000 0000 0101  1111 1111 1111 1010
5^7 : 0000 0101 ^ 0000 0111  1111 1101
– 같은 위치의 비트가 같으면 1 다르면 0
•
5|7 :
– 둘 다 0 미면 0 둘 중하나라도 1 이면 1
•
5&7 :
– 둘 다 1 미면 1 둘 중 하나라도 0 이면 0
•
Imsi = 5; imsi <<2 :
– Imsi 의 bit를 모두 왼쪽으로 2씩 이동 비어있는 곳은 0 으로
– 0000 0000 0000 0101  0000 0000 0001 0100
46
캐스트 연산자
int a;
float b;
a = 10;
b=a/3;
printf(“%f, %f”,b, (float)a/3);
47
sizeof 연산
• sizeof(double)
• int a;
• sizeof(a);
48
연습문제
49
1. 전처리기가 무슨 일을 하는지
2. 매크로 변수와 매크로 함수의
설명하시오.
3. 매크로 함수에서 다음과 같이
략했을 때와 생략하지 않았을
점을 기술하시오.
설명하시오.
차이점을
괄호를 생
때의 차이
1. #define MUL(x, y) x * y
2. #define MUL(x, y) ((x) * (y))
4. scanf()를 이용하여 세 숫자를 받아 들이
고 이들의 합과 곱을 출력하시오.
50
1. 두 수를 입력 받아 다음과 같이 출력 하시
오. (단, 매크로 함수를 사용한다)
입력 :
46
출력 :
4 * 6 = 24
4 + 6 = 10
2. 반지름의 값을 입력하면 원의 부피에 대
한 결과를 출력하시오. (단, 매크로 함수
를 사용한다.)
입력 :
35
출력 :
35 * 35 * 3.14 = 3846.5
51
3. 다음의 공란을 채우시오.
#include <stdio.h>
#define PRINT(x) (
main()
{
PRINT(5, 7);
PRINT(9, 10);
PRINT(34, 76);
}
)
result = 12
result = 19
result = 110
52
1. 두 수를 입력 받고 다음과 같이 출력하시
오. (단, 더하고 빼고 곱하고 나누는 함수
는 매크로 함수를 사용한다)
입력 :
12 6
출력 :
12 + 6 = 18
12 – 6 = 6
12 * 6 = 72
12 / 6 = 2
2. 생년월일을 입력하면 나이를 출력하는 프
로그램을 작성하시오. (단, 나이를 계산하
는 알고리즘은 매크로 함수로 작성한다.)
53