42
1 Part 05 순수한 연산자

05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

1

Part 05 순수한 연산자

Page 2: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

2

이 장의 내용

C 언어의 연산자와 수식

산술연산자

형 변환

관계 연산자

논리 연산자

2진수를 위한 비트 연산

Page 3: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

3

5.1 연산자와 수식

Page 4: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

4

연산자와 수식

수식

값을 나타내기 위해서 사용된 연산자들과 피연산자들의 조합

연산자(operator)

이미 정의된 산술 혹은 논리 연산을 수행하는 기호

피연산자

연산의 대상이 되는 리터럴, 상수, 변수, 혹은 다른 수식 등

종류 연산자

산술 연산자 + - * / %

관계 연산자 > < == != >= <=

논리 연산자 && || !

증감 연산자 ++ --

비트 연산자 & | ^ ~ << >>

Page 5: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

5

연산자

피연산자 수에 따라

단항연산자(unary operator): 하나의 피연산자에 대해 연산

이항연산자 (binary operator): 두 개의 피연산자에 대해 연산

분류 연산자

단항 연산자 ++ -- ! & * + - sizeof(형)

이항 연산자 + - * / % == != > < >= <= && || & | ^

Page 6: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

6

5.2 산술 연산자

Page 7: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

7

산술 연산자

덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%) 연산

정수형과 부동소수형에 대해서 가능

연산 연산자 피연산자 자료형 결과 값

단항 플러스 +a 정수형, 부동소수형 a의 값 그대로

단항 마이너스 -a 정수형, 부동소수형 a의 부호를 변경한 값

덧셈 a + b 정수형, 부동소수형 a와 b의 합

뺄셈 a - b 정수형, 부동소수형 a에서 b를 뺀 값

곱셈 a * b 정수형, 부동소수형 a와 b의 곱

나눗셈 a / b 정수형 a를 b로 나눈 몫

부동소수형 a를 b로 나눈 값

나머지 a % b 정수형 a를 b로 나눈 나머지

Page 8: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

8

나머지 연산(remainder operation)

정수에 대한 나머지 연산

첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지 정수 값

14 % 3 = 2

-20 % 6 = -2

10 % -3 = 1

2 % 7 = 2

Page 9: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

9

arithmetic.c

실행결과: 145 + 20 = 165 145 - 20 = 125 145 * 20 = 2900 145 / 20 = 7 145 % 20 = 5

Page 10: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

10

부동소수형 연산

이항 산술연산자

두 개의 피연산자가 모두 정수형이면 결과도 정수형

한 개 이상의 피연산자가 부동소수형이면 그 결과는 부동소수형

예를 들어

2 + 3.14 ⇒ 2.0 + 3.14 = 5.14

12.0/5 ⇒ 12.0/5.0 = 2.4

주의

정수 나눗셈의 결과는 정수 값이 되고

부동소수형 나눗셈의 결과는 부동소수점 값이 된다.

Page 11: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

11

conversion.c

실행결과: 화씨온도를 입력하세요 62 화씨온도 62도는 섭씨온도 16.666666도입니다

Page 12: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

12

연산자 우선순위

연산자 우선순위

한 수식 내에서 연산자의 계산 순서

괄호를 이용한 연산 순서 조정

수식을 계산할 때 괄호로 묶인 수식은 먼저 수행된다.

(fahrenheit - BASE) * 5.0 / 9.0 vs

fahrenheit - BASE * 5.0 / 9.0

산술 연산자 우선순위

우선순위 연산자

1순위 단항 + 단항 -

2순위 * / %

3순위 + -

Page 13: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

13

결합순서(associativity)

좌우선 결합(left associative)

우선순위가 같은 이항 산술연산자들은 좌측에서 우측 순서로 계산한다

a / b * c (a / b) * c

우우선 결합(right associative)

단항 산술연산자는 우측에서 좌측 순서로 계산한다

- + - a - (+ (- a))

Page 14: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

14

circle.c

실행결과: 원의 반지름을 입력하세요 10 원의 둘레: 62.800003 원의 면적: 314.000000

Page 15: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

15

5.3 형 변환

Page 16: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

16

묵시적 형 변환

질문?

만일, 2 * 1.5를 계산하면 어떻게 될까 ?

int * double과 같이 서로 다른 형의 값을 곱하면 어떻게 될까?

결과는 int 형이 될까 아니면 double 형이 될까 ?

묵시적 형 변환

서로 다른 형의 혼합연산을 하면 필요한 기억장소의 크기가 작은 쪽에서 큰 쪽으로 묵시적으로 확장 변환(widening conversion)

변수 내의 값 자체는 변화가 없고, 단지 그 값을 계산할 때 변환해서 사용. 주의 !

Page 17: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

17

확장 변환(widening conversion)

확장 변환

자료형의 값을 저장하는 데 필요한 기억장소의 크기가 같거나 큰 다른 자료형으로 변환

char(1) < short(2) < int(4) ≤ long(4) ≤ float(4) < double(8) ≤ long double(8)

수식에서 여러 타입이 사용되면 자동 확장 변환이 일어난다.

확장 변환 예

int won, rate = 960;

float dollar;

won = dollar * rate;

Page 18: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

18

대입 변환(assignment conversion)

대입 변환 어떤 형의 값이 다른 형의 변수에 대입될 때 자동적으로 일어나며, 이 과정에서 값이 대입될 변수 형으로 자동 변환된다.

예 dollar = won / rate;

won / rate 값이 36이면, 부동소수점 값 36.0으로 변환 후 dollar에 대입

축소 변환(narrowing conversion) won = dollar * rate;

소숫점 이하 값은 버리고 정수 값만 대입한다.

축소 변환은 정보를 손실시키므로 주의!

Page 19: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

19

명시적 형 변환

타입 캐스팅은 명시적으로 형을 변환하는 방법이다.

타입 캐스팅 형식

(형 이름) 변수 혹은 수식

예를 들어

dollar = (float) won / rate;

캐스트 연산자가 나눗셈 연산자보다 우선순위가 높다

캐스트가 won의 값에 먼저 적용되어 won 값의 부동소수점 버전을 반환

rate가 산술 확장 변환을 통해서 부동 소수점 값으로 변환

나눗셈 연산자는 부동 소수점 나눗셈을 수행

Page 20: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

20

명시적 형 변환 예

달러를 원으로 변환하는 경우

won = (int) (dollar * rate);

dollar * rate를 계산하면 부동소수점 값 계산

이 값을 won에 저장하기 위해서 int 형으로 변환

만약 계산된 값이 34999.968이면, 대입 후에 won의 값 34999

주의

묵시적 형 변환 혹은 캐스팅은 대상이 되는 변수나 수식 값 자체를 변경하지 않는다.

Page 21: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

21

exchange.c

실행결과: won: 35000 dollar: 36.0000 won: 35000 dollar: 36.4583 won: 34999 dollar: 36.4583 won: 34999 dollar: 36.4583 won: 34560 dollar: 36.4583

Page 22: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

22

5.4 관계 연산자

Page 23: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

23

관계 연산자

C 언어의 관계 연산자

두 값의 동치 관계나 두 값 간의 대소 관계를 비교한다.

연산 연산자 자료형 결과값

같다 a == b 정 수 형 , 부동소수형

a 값과 b 값이 같으면 1(참) 그렇지 않으면 0(거짓)

다르다 a != b 정 수 형 , 부동소수형

a 값과 b 값이 같지 않으면 1(참) 그렇지 않으면 0(거짓)

작다 a < b 정 수 형 , 부동소수형

a 값이 b 값보다 작으면 1(참) 그렇지 않으면 0(거짓)

작거나 같다

a <= b 정 수 형 , 부동소수형

a 값이 b 값보다 작거나 같으면 1(참) 그렇지 않으면 0(거짓)

크다 a > b 정 수 형 , 부동소수형

a 값이 b 값보다 크면 1(참) 그렇지 않으면 0(거짓)

크거나 같다

a >= b 정 수 형 , 부동소수형

a 값이 b 값보다 크거나 같으면 1(참) 그렇지 않으면 0(거짓)

Page 24: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

24

relation.c

실행결과: (10 > 11) = 0 (10 >= 11) = 0 (10 == 11) = 0 (10 != 11) = 1 (10 < 11) = 1 (10 <= 11) = 1

Page 25: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

25

관계 연산자

관계 연산은 산술 연산보다 우선순위가 낮다.

a + b > 0

산술연산 a + b를 먼저 수행한 후 그 값이 0보다 큰지 검사

따라서 (a + b) > 0과 같이 해석된다.

만약 관계연산을 먼저 수행하기 원하면 a + (b > 0) 형태로 사용

if 문이나 while 문의 조건

int val, abs_val;

...

if (val > 0)

abs_val = val;

else

abs_val = -val;

Page 26: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

26

5.5 논리 연산자

Page 27: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

27

C 언어의 논리 연산자

논리 NOT 연산자(!), 논리 AND 연산자(&&), 논리 OR 연산자(||)

연산 연산자 결과

논리 NOT ! a a가 거짓이면 1(참)이고, 그렇지 않으면 0(거짓)이다.

논리 AND a && b a, b 모두 참이면 1(참)이고, 그렇지 않으면 0(거짓)이다.

논리 OR a || b a, b 중 적어도 한 개가 참이면 1(참)이고, 그렇지 않으면 0(거짓)이다.

논리 연산자

Page 28: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

28

scoreInput.c

실행결과:

점수를 입력하세요: 80 80은 범위 내의 점수입니다.

Page 29: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

29

단락회로 계산

&&와 || 연산자는 단락회로 계산(short-circuit evaluation) 을 한다

단락회로 계산

왼쪽 피연산자가 연산의 결과 값을 결정하는 데 충분하면,

오른쪽 피연산자는 계산하지 않는다.

score >= 0 && score <= 100

score <=100 참

score >=0

거짓 ~

Page 30: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

30

5.6 비트 연산자

Page 31: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

31

비트 연산자

C 언어

시스템 프로그래밍 언어로 설계

다양한 비트 연산들을 제공

하드웨어를 다루는데 필요

구분 종류 연산자 자료형 결과

비트 이동 연산자

좌로 이동 (left shift)

a << n 정수형 a를 n 비트만큼 좌측으로 이동하고 오른쪽 끝은 이동한 수만큼 0으로 채운다

우로 이동 (right shift)

a >> n 정수형 a를 n 비트만큼 우측으로 이동하고 왼쪽 끝은 이동한 수만큼 0 혹은 1로 채운다

비트 논리 연산자

비트 AND a & b 정수형 a와 b의 비트 AND 값

비트 OR a | b 정수형 a와 b의 비트 OR 값

비트 XOR a ^ b 정수형 a와 b의 비트 XOR 값

1의 보수 연산 ~a 정수형 a의 1의 보수 값

Page 32: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

32

비트 이동 연산자

비트 이동 연산자 <<와 >>

비트를 좌로 혹은 우로 이동시키는 연산자이다.

비트 이동 예

11 = 0000 0000 0000 1011

17 = 0000 0000 0001 0001

0000 0000 0000 1011 << 2 = 0000 0000 0010 1100 = 44

0000 0000 0001 0001 >> 3 = 0000 0000 0000 0010 = 2

Page 33: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

33

shift.c

실행결과: 11 << 2 = 44 17 >> 3 = 2

Page 34: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

34

비트 연산자 진리표

a b a & b a | b a ^ b

0 0 0 0 0

0 1 0 1 1

1 0 0 1 1

1 1 1 1 0

a ~a

0 1

1 0

Page 35: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

35

bit.c

실행결과: 1f05 & 31a1 = 1101 1f05 | 31a1 = 3fa5 1f05 ^ 31a1 = 2ea4 ~1f05 = ffffe0fa

Page 36: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

36

비트 연산 예

비트 연산 예 16진수 값 2진수 값

a 0x1f05 0001 1111 0000 0101

b 0x31a1 0011 0001 1010 0001

~a 0xe0fa 1110 0000 1111 1010

a & b 0x1101 0001 0001 0000 0001

a | b 0x3fa5 0011 1111 1010 0101

a ^ b 0x2ea4 0010 1110 1010 0100

Page 37: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

37

Key Point

Page 38: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

38

Key Point 1

수식 값을 나타내기 위해서 사용된 연산자들과 피연산자들의 조합

덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 연산 정수형과 부동소수형에 대해서 가능하다.

정수에 대한 나머지 연산 첫 번째 피연산자를 두 번째 피연산자로 나눈 나머지 정수 값

정수 나눗셈의 결과는 정수 값이 되고 부동소수형 나눗셈의 결과는 부동소수점 값이 된다.

연산자 우선순위(operator priority) 한 수식 내에서 연산자의 계산 순서

수식에서 여러 타입이 사용되면 자동으로 확장 변환이 일어난다.

Page 39: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

39

Key Point 2

대입 변환

어떤 형의 값이 다른 형의 변수에 대입될 때 자동으로 일어나며,

이 과정에서 값이 대입될 변수 형으로 자동 변환된다.

타입 캐스팅은 명시적으로 형을 변환하는 방법이다.

C 언어의 관계 연산자들

두 값의 동치 관계나 두 값 간의 대소 관계를 비교한다.

C 언어는 논리 연산자

논리 NOT 연산자(!), 논리 AND 연산자(&&), 논리 OR 연산자(||)

단락회로 계산

왼쪽 피연산자가 연산의 결과 값을 결정하는 데 충분하면,

오른쪽 피연산자는 계산하지 않는다.

비트를 좌로 혹은 우로 이동시키는 연산자 <<와 >>

Page 40: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

40

프로그래밍 실습

Page 41: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

41

▶ 프로그래밍 실습

환율계산기 프로그램을 작성해보자. 이 프로그램은 다음과 같이 동작한다.

(1) 먼저 기준 환율을 입력받는다.

1달러 기준 환율을 입력하세요: 960

(2) 메뉴를 출력한다.

1. 기준 환율 출력

2. 원화를 달러화로 변환

3. 달러화를 원화로 변환

메뉴를 선택하세요:

Page 42: 05 순수한 연산자 - GWNUcadcam.gwnu.ac.kr/subject/pwc/chap5.pdf2 이 장의 내용 C 언어의 연산자와 수식 산술연산자 형 변환 관계 연산자 논리 연산자

42

▶ 프로그래밍 실습

(3.1) 1번 메뉴를 선택한 경우

(4.1) 다음과 같이 결과를 출력한다.

오늘의 기준환율은 1달러 960원입니다.

(3.2) 2번 메뉴를 선택한 경우

원화를 입력하세요: 35000

(4.2) 다음과 같이 결과를 출력한다.

35000원은 36.46 달러입니다.

(3.3) 3번 메뉴를 선택할 경우

달러화를 입력하세요: 120.99

(4.3) 다음과 같이 결과를 출력한다.

120.99 달러는 116150 원입니다.