• Tidak ada hasil yang ditemukan

4장. 연산자

N/A
N/A
Protected

Academic year: 2023

Membagikan "4장. 연산자"

Copied!
59
0
0

Teks penuh

(1)

4. 연산자

#include <stdio.h>

int main(void) {

int num;

printf(“Please enter an integer: ");

scanf("%d", &num);

if ( num < 0 )

printf("Is negative.\n");

printf("num = %d\n", num);

return 0;

}

(2)

■ 수식의 개념과 연산자 , 피연산자에 대해서 알아본다 .

■ C 의 연산자의 종류를 알아본다 .

■ 연산자의 우선 순위와 결합 방향에 대하여 알아본다 .

학습목표

(3)

연산자의 기본 개념

• 수식

• 연산자와 피연산자

연산자의 종류

• 산술 연산자 / 증감 연산자

• 관계 연산자 / 논리 연산자

• 비트 연산자 / 대입 연산자

• 조건 연산자 / 형변환 연산자

연산자의 우선순위와 결합 방향

목차

(4)

수식(expression)

값을 갖는 요소

수식의 값을 구하는 것을 ‘수식을 평가한다’고 한다.

연산식 : 연산자를 이용한 수식

연산자(operator)와 하나 이상의 피연산자(operand)로 구성

수식

연산자의 기본개념

(5)

연산자(operator)

연산에 사용되는 기호

+, -, ++, --, ==, >, <, &&, ||, <<, >> 등

피연산자(operand)

연산의 대상이 되는 값

연산자와 피연산자

연산자의 기본개념

(6)

연산자의 종류(1/2)

피연산자의 개수에 따른 연산자의 종류

연산자와 피연산자

연산자의 기본개념

(7)

연산자의 종류(2/2)

연산자의 기능에 따른 연산자의 종류

연산자와 피연산자

연산자의 기본개념

(8)

산술 연산자

기본적인 사칙 연산 기능을 제공하는 연산자

산술 연산자

연산자의 종류

(9)

산술 연산자의 사용 예(1/2)

산술 연산자

연산자의 종류

01: /* Ex04_01.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int num1, num2;

07: int result;

08:09: printf("두 개의 정수를 입력하세요 : ");

10: scanf("%d %d", &num1, &num2);

11:12: result = num1 + num2;

13: printf("%d + %d = %d\n", num1, num2, result);더하기

(10)

산술 연산자의 사용 예(2/2)

산술 연산자

연산자의 종류

18: result = num1 * num2;

19: printf("%d * %d = %d\n", num1, num2, result);

20:21: result = num1/ num2;

22: printf("%d / %d = %d\n", num1, num2, result);

23:24: result = num1 % num2;

25: printf("%d %% %d = %d\n", num1, num2, result);

26:27: return 0;

28: }

곱하기

나누기

나머지

(11)

나누기 연산자(/)

정수에 대하여 나누기 연산자(/)를 사용하면, 소수점 이하는 버리고(truncation) 몫을 정수로만 구한다.

나머지 연산자(%)

정수형에 대해서만 사용 가능

산술 연산자

연산자의 종류

(12)

나머지 연산자의 사용 예

산술 연산자

연산자의 종류

01: /* Ex04_02.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int num;

07: int thousands, tens;

08:09: printf("6자리 정수를 입력하세요 : ");

10: scanf("%d", &num);

11:12: thousands = num / 1000;

13: tens = num % 1000;

14: printf("%d,%d\n", thousands, tens);

15:16: return 0;

나머지 연산자 사용

(13)

증감 연산자

변수의 값을 1만큼 증가시키거나 감소시킨다.

증감 연산자는 반드시 변수에만 사용해야 한다.

전위형과 후위형

증감 연산자

연산자의 종류

(14)

증감 연산자의 사용 예(1/2)

증감 연산자

연산자의 기본개념

01: /* Ex04_03.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int count;

07: int value1, value2;

08: float temperature = 10.5f;

09:10: count = 10;

11: value1 = ++count;

12: printf("value1 = %d, count = %d\n", value1, count);

13:14: count = 10;

15: value2 = count++;

16: printf("value2 = %d, count = %d\n", value2, count);

전위형

후위형

(15)

증감 연산자

연산자의 기본개념

18: count = 10;

19: ++count;

20: printf("count = %d\n", count);

21:22: count = 10;

23: count++;

24: printf("count = %d\n", count);

25:26: temperature++;

27: printf("temperature = %f\n", temperature);

28:29: return 0;

30: }

전위형

후위형

실수형에도 증감 연산자를 사용할 수 있다.

증감 연산자의 사용 예(2/2)

(16)

관계 연산자(1/2)

두 수의 값을 비교할 때 사용되는 연산자 수식의 값이 항상 참 또는 거짓이 된다.

관계 연산자

연산자의 종류

(17)

관계 연산자(2/2)

두 수의 값이 같은지 비교할 때는 = 연산자가 아니라 == 연산자를 사용해야 한 다.

관계 연산자

연산자의 종류

(18)

관계 연산자의 사용 예

관계 연산자

연산자의 종류

01: /* Ex04_04.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int a = 10;

07: int b = 20;

08:09: printf("a = %d, b = %d\n", a, b);

10: printf("a > b = %d\n", a > b);

11: printf("a >= b = %d\n", a >= b);

12: printf("a < b = %d\n", a < b);

13: printf("a <= b = %d\n", a <= b);

14: printf("a == b = %d\n", a == b);

15: printf("a != b = %d\n", a != b);

16:

관계 연산자

(19)

논리 연산자(1/2)

참과 거짓을 이용한 논리 연산 기능을 제공 AND(&&), OR(||), NOT(!) 연산

논리 연산자를 사용하지 않으면 잘못된 수식을 만들 수 있으므로 주의해야 한다.

논리 연산자

연산자의 종류

(20)

논리 연산자(2/2)

논리 연산자의 연산 결과

논리 연산자

연산자의 종류

(21)

논리 연산자의 사용 예

논리 연산자

연산자의 종류

01: /* Ex04_05.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int score = 95;

07:08: printf("90점 이상 100점 이하인가? : %d\n", 09: score >= 90 && score <= 100);

10:11: printf("0점 또는 100점인가? : %d\n", 12: score == 0 || score == 100);

13:

논리 연산자

논리 연산자

(22)

논리 연산자의 우선순위

논리 연산자는 관계 연산자보다 우선순위가 낮다.

&& 연산자가 || 연산자보다 우선순위가 높고, ! 연산자는 관계 연산자보다 우선순 위가 높다.

논리 연산자

연산자의 종류

(23)

비트 연산자

연산자의 종류

비트 AND 연산자(&)

각 비트 단위로 AND 연산을 수행

int a = 10;

int b = 12;

(24)

16진수와 2진수 변환

2진수는 0과 1만을 사용하고, 16진수는 0~9, A~F를 사용한다.

16진수를 2진수로 변환하려면, 16진수 1자리를 이진수 4자리로 나타내면 된다.

비트 연산자

연산자의 종류

(25)

비트 OR 연산자(|)

피연산자의 같은 위치에 있는 비트에 대해서 비트 OR 연산을 수행

비트 연산자

연산자의 종류

int a = 10;

int b = 12;

(26)

비트 XOR 연산자(^)

피연산자의 같은 위치에 있는 비트에 대해서 비트 XOR 연산을 수행

비트 연산자

연산자의 종류

int a = 10;

int b = 12;

int c = a ^ b;

(27)

비트 NOT 연산자(~)

피연산자의 각 비트를 반전시킨다. 즉, 0은 1로, 1은 0으로 만든다.

비트 연산자

연산자의 종류

int a = 10;

int c = ~a;

(28)

비트 연산자의 사용 예

비트 연산자

연산자의 종류

01: /* Ex04_06.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int a = 10; // 0x0a 07: int b = 12; // 0x0c

08: int c;

09:10: c = a & b;

11: printf("a & b = %08x(%d)\n", c, c);

12:13: c = a | b;

14: printf("a | b = %08x(%d)\n", c, c);

15:16: c = a ^ b;

17: printf("a ^ b = %08x(%d)\n", c, c);

18:

비트AND 연산자

비트OR 연산자

비트XOR 연산자

(29)

비트 이동 연산자(1/2)

비트 왼쪽 이동을 할 때는 왼쪽으로 밀려난 비트가 사라져 버리고, 오른쪽 빈자리 에는 0이 채워진다.

비트 왼쪽 이동은 2N을 곱하는 것이다.

비트 연산자

연산자의 종류

10 << 2

(30)

비트 이동 연산자(2/2)

비트 오른쪽 이동을 할 때는 오른쪽으로 밀려난 비트가 사라져 버리고, 왼쪽 빈자 리에는 부호 비트가 채워진다.

비트 오른쪽 이동은 2N으로 나누는 것이다.

비트 연산자

연산자의 종류

10 >> 2

(31)

비트 이동 연산자의 사용 예

비트 연산자

연산자의 종류

01: /* Ex04_07.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int a = 10; // 0x0a 07: int b;

08:09: b = a << 2;

10: printf("a << 2 = %08x(%d)\n", b, b);

11:12: b = a >> 2;

13: printf("a >> 2 = %08x(%d)\n", b, b);

비트 왼쪽 이동 연산자

비트 오른쪽 이동 연산자

(32)

대입 연산자(1/4)

대입 연산자(=)는 연산자의 좌변(변수)에 우변의 값을 저장한다.

대입 연산자의 좌변(l-value)에는 반드시 변수만 사용해야 한다.

대입 연산자

연산자의 종류

(33)

대입 연산자(2/4)

대입 연산을 수행하면, 대입 연산자의 좌변에 있는 l-value의 값이 연산의 결과가 된다.

대입 연산자

연산자의 종류

(34)

대입 연산자(3/4)

대입 연산자는 산술 연산자, 비트 연산자와 결합해서 복합 대입 연산자로 사용될 수 있다.

대입 연산자

연산자의 종류

(35)

대입 연산자(4/4)

복합 대입 연산자를 다른 연산자와 함께 사용할 때는 복합 대입 연산자는 다른 연 산자에 비해서 우선순위가 낮기 때문에 주의해야 한다.

대입 연산자

연산자의 종류

(36)

대입 연산자의 사용 예

대입 연산자

연산자의 종류

01: /* Ex04_08.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int num;

07:08: num = 5;

09: printf("num = %d\n", num);

10:11: num += 2;

12: printf("num = %d\n", num);

13:14: num *= 2;

15: printf("num = %d\n", num);

16:17: num |= 3;

18: printf("num = %d\n", num);

19:20: num <<= 2;

21: printf("num = %d\n", num);

대입 연산자

복합 대입 연산자

복합 대입 연산자

복합 대입 연산자

복합 대입 연산자

(37)

조건 연산자

유일한 삼항 연산자

조건 연산자

연산자의 종류

(38)

조건 연산자의 사용 예

조건 연산자

연산자의 종류

01: /* Ex04_09.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int a, b;

07: int min, max;

08:09: printf("두 개의 정수를 입력하세요 : ");

10: scanf("%d %d", &a, &b);

11:12: min = a < b ? a : b;

13: max = a > b ? a : b;

14:15: printf("min = %d, max = %d\n", min, max);

16:

조건 연산자

(39)

암시적인 형 변환

컴파일러에 의해서 자동으로 처리되는 형 변환 형 변환이 일어나는 경우

서로 다른 형의 값을 혼합 연산하는 경우

변수에 다른 형의 값을 대입할 때

형 변환 연산자

연산자의 종류

(40)

승진에 의한 자동 형 변환 예

형 변환 연산자

연산자의 종류

01: /* Ex04_10.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: short a = 500;

07: short b = 800;

08: short c;

09:10: printf("a * b = %d\n", a * b);

11:12: c = a * b;

13: printf("c = %d\n", c);

14:15: return 0;

16: }

승진에 의한 형변환

(41)

승진에 의한 형 변환

형 변환 연산자

연산자의 종류

(42)

대입 연산 시 형 변환 예

형 변환 연산자

연산자의 종류

01: /* Ex04_11.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int num;

07: double f;

08:09: num = 3.14;

10: printf("num = %d\n", num);

11:12: f = 123;

13: printf("f = %f\n", f);

14:15: return 0;

16: }

대입 연산 시 자동 형변환

대입 연산 시 자동 형변환

(43)

명시적인 형 변환(1/2)

프로그래머가 명시적으로 형 변환을 하고 싶을 때, 형 변환 연산자를 이용한다.

형 변환 연산자

연산자의 종류

(44)

명시적인 형 변환(2/2)

형 변환 연산자를 사용하면, 연산의 결과가 달라질 수 있으므로 주의해야 한다.

연산 전에 형 변환을 하는지, 연산 후에 형 변환을 하는지에 따라 연산의 결과가 달라질 수 있다.

형 변환 연산자

연산자의 종류

(45)

명시적인 형 변환 예(1/2)

형변환 연산자

연산자의 종류

01: /* Ex04_12.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int num;

07: float f;

08:09: f = 10 / 3;

10: printf("f = %f\n", f);

11:12: f = (float) 10 / 3;

13: printf("f = %f\n", f);

int / int로 처리

명시적인 형변환

(46)

명시적인 형 변환 예(2/2)

형변환 연산자

연산자의 종류

18: num = (int) (12.5 + 10.7);

19: printf("num = %d\n", num);

20:21: num = (int)12.5 + (int)10.7;

22: printf("num = %d\n", num);

23:24: return 0;

25: }

명시적인 형변환

명시적인 형변환

(47)

연산자의 우선순위(1/2)

단항 > 산술 > 관계 > 논리 > 대입 > 콤마 연산자

연산자의 우선순위

연산자의 우선순위와 결합 방향

우선순위 연산자 결합 방향

1 ( ) [ ] -> .

2 ++ -- +(부호) -(부호) sizeof ~ ! * & (type)

3 * / %

4 + -

5 << >>

6 < <= > >=

7 == !=

8 &

9 ^

10 |

11 &&

(48)

연산자의 우선순위(2/2)

기본적인 연산자의 우선순위와는 다른 순서로 연산을 수행하려면 ( )를 사용한다.

연산자의 우선순위

연산자의 우선순위와 결합 방향

(49)

연산자의 결합 방향

같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지 여부

연산자의 결합 방향

연산자의 우선순위와 결합 방향

(50)

연산자의 우선순위와 결합 방향 예 연산자의 우선순위와 결합 방향

01: /* Ex04_13.c */

02: #include <stdio.h>

03:04: int main(void) 05: {

06: int a = 1, b = 2, c = 3;

07: int result;

08:09: result = a + b * c % 2;

10: printf("result = %d\n", result);

11:12: result = a > b || c > 0;

13: printf("result = %d\n", result);

14:15: result = a > b || c > 0 && b > c;

16: printf("result = %d\n", result);

17:18: result = ++a * b--;

19: printf("result = %d\n", result);

20:21: result = a = b = c;

(51)

연산자의 기본 개념

수식 : C 프로그램에서 값을 갖는 요소

연산자 : +, -, *, /처럼 연산에 사용되는 기호 피연산자 : 연산의 대상이 되는 값

학습정리

(52)

연산자의 종류

연산자의 우선 순위와 결합 방향

우선 순위

단항 > 산술 > 관계 > 논리 > 대입 > 콤마

결합 방향 : 같은 우선순위의 연산자에 대해서 어느 방향으로 연산을 수행할지

학습정리

(53)

4. 연산자

NEXTChapter 5. 제어문

수고하셨습니다.

질문 있습니까?

(54)

6VPJ7-H3CXH-HBTPT-

X4T74-3YVY7

(55)

실습(1)

1. 다음과 같이 변수들이 정의되어 있는 경우, 각 변수에는 어떤 값이 저장되는

가?

int x=10, y=3, z=2;

(a) x+=y-=2 (b) x*=y+2 (c) z=x++ + ++y

2. a=3, b=5일때, 다음 각 수식의 실행 결과를 나타내시오.

(a)a<<2 (b)a & b (c)a || b (d)~a & b 3 다음 프로그램의 결과값을 구하세요.

int a=3, b=7, c=1;

int max;

max=(a>b) ? a : b; //두 수 중 큰 수를 구하는 방법

(56)

세 수중 가장 큰 수를 구하는 방법

int max, a, b, c;

printf(“세 수를 차례로 입력하세요>>> :");

scanf("%d %d %d", &a, &b, &c);

max=((a>b?a:b)>c) ? ((a>b)?a:b) : c ;

printf("가장 큰 수는 %d 입니다\n", max);

#define max(x,y) ((x>y) ? x : y)

int main(void)

{

int i, j, k;

printf(“세 정수를 입력하세요. ");

scanf("%d %d %d", &i, &j, &k);

printf("입력한 세 정수 중 가장 큰 수는%d입니다.\n", max(max(i,j),k));

(57)

⋇ 아래 ①~⑥에서까지 결과를 구하세요.

int a=10;

printf("%d\n", a++); //①출력값?

printf("%d\n", a); //②출력값?

a=10;

printf("%d\n", ++a); //③출력값?

printf("%d\n", a); //④출력값?

실습(2)

(58)

4. 3개의 정수를 입력 받아서 합계와 평균, 최대값과 최소값을 구해서 출력하는 프로그램을 작성하시오.(단, 평균은 소수점 이하까지 구하도록 한다)

5. 정수를 하나 입력 받아서, 그 정수에 2, 4, 8, 16, 32, 64, 128을 곱한 값을 각각 구해서 출력하는 프로그램을 작성하시오. (단, 곱을 구할 때 비트 이동연산자 를 이용한다.

6. 시간(시, 분, 초)을 입력받아 몇 초인지를 계산하는 프로그램을 작성하세요 .(ex.200초는 3분 20초이다, 3600초는 1시간이다)

-> printf(“시간을 입력하세요”), scanf(“%d”, &sec)

실습(3)

(59)

7. 연도를 입력받아서 윤년인지 아닌지를 확인하는 프로그램을 작성하세요

(윤년 : 4로 나누어 떨어지는 해는 윤년입니다.

4로 나누어 떨어지는 연도중에서 100으로 나누어 떨어진 연도는 윤년이 아닙니다.

400으로 나누어 떨어지는 연도는 윤년입니다.)

정수로 나누어 떨어지는지를 확인하려면 나머지 연산자 %를 이용한다.

scanf(“%d”, &year);

if( ) //조건을 만족시키면 printf(:%d년은 윤년입니다\n”, year); //현재 문장을 수행

else //위 조건이 만족되지 않으면 printf(:%d년은 윤년이 아닙니다\n”, year);//현재 문장을 수행

8. 세자리 정수를 입력 받은 후에 각각의 자리 수를 분리하고 이 자리 수를 출력 하는 프로그램을 작성하시오.

실습(4)

Referensi

Dokumen terkait