• 검색 결과가 없습니다.

제04장-연산자

N/A
N/A
Protected

Academic year: 2021

Share "제04장-연산자"

Copied!
45
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)
(2)

(1) C 프로그램에서 식과 문장의 표현방법에 대해 설명할 수 있다 . (2) C 에서 제공하는 연산자의 종류와 활용방법을 설명할 수 있다 .

(3)

4.1 식과 문장

4.2 연산자

(4)

(1)

식 (expression) 이란 ?

- C 프로그램에서 식은

변수 또는 상수가 연산자와 결합된 형태를 말한다 . - 이때 연산자와 결합 없이 단순히 변수

(5)

10       

a       

a = 10         

c = a * 5       

c = getchar()

printf("%d“, a)

예 ) 프로그램에서 식의 표현

← 상수만으로 표현된 형태 ← 변수만으로 표현된 형태 ← 연산자와 결합하여 표현된 형태 ← 연산자와 결합하여 표현된 형태 ← 표준 입력함수를 호출하는 형태 ← 표준 출력함수를 호출하는 형태

(6)

(2) 문장 (statement) 이란 ?

- C 프로그램에서 문장은 변수 또는 상수가 연산자와 결합되어진 식에 세미콜론 (;) 을 붙여 표현한 형태를 말한다 . - 그러나 문장은 식의 끝에 세미콜론 (;) 을 붙인다고 해서 모든 식들이 모두 문장이 되는 것은 아니다 - 예를 들어 , 문장은 단순히 상수를 표현한 식 또는 단순히 변수를 표현한 식은 문장이 될 수 없다 .

(7)

종류 사용 예 공문 ; 단문 a = 10; 복문 { a = 10; printf(“%d”, a); } 문장이 1 개이다 . 블록 안에 포함된 문장이 1 개 이상이 다 . 복문을 만들 때에는 반드시 { 와 } 로 식이 없는 문장을 말한다.

(8)

퀴즈 풀어보기

교제

103 쪽 ( 1 번 ~ 2

)

(9)

구 분 연산자 (1) 대입 연산자 (2) 산술 연산자 (3) 관계 연산자 (4) 논리 연산자 (5) 증가 , 감소 연산자 (6) 비트 연산자 (7) 복합 대입 연산자 (8) 조건 연산자 (9) 열거 연산자 (10) 자료형 크기 연산자 (11) 포인터 연산자 (12) 형 변환 연산자 = + - * / % < <= == => > != ! && || ++ & | ^ ~ << >> += -= *= /= %= ? : , sizeof & * ( 데이터형 ) 3 장의 3-6.C 예제에서 설명되었 음 . 8 장에서 자세히 설명 함 .

(10)

(1) 대입 연산자

종류 기능 보기

= 대입 x = 3;

(11)

실행결과 a=3 b=15 #include <stdio.h> void main() { int a, b; a = 3; b = a * 5; printf("a=%d \n", a); printf("b=%d \n", b); } 우측의 3 값을 좌측의 변수 a 대입(assign) 시키라 . 는 문 장이다. 우측 식 a*3 을 먼저 계산한 후에 그 결과를 좌측의 변수 b 에 대입 (assign) 시키라는 문장이다.

(12)

- 대입연산자를 중심으로 좌측 항은 반드시 1 개의 변수로만 지정되어야만 한다 . - 이때 우측 항에는 어떤 형태의 식이 나와도 상관없다 .

[ 대입 연산자의 사용 조건

]

[ 사용 예 ] a = 20; a = b + C; a = b * 5 + C / 5; a = getchar();

(13)

(2) 산술 연산자

종류 기능 보기 + -* / % 덧셈 뺄셈 곱셈 나눗셈 나머지 a + b a - b a * b a / b a % b 2 개의 데이터 항이 필요한 이항 연산자이다 .

(14)

#include <stdio.h> void main() { int a=5, b=2, c; c = a + b; printf(" 덧셈 결과 : %d \n", c); c = a - b; printf(" 뺄셈 결과 : %d \n", c); c = a * b; printf(" 곱셈 결과 : %d \n", c); c = a / b; printf(" 나눗셈 결과 : %d \n", c); c = a % b; printf(" 나머지 결과 : %d \n", c); } ◀4-2.C▶  실행결과 덧셈 결과: 7 뺄셈 결과: 3 곱셈 결과: 10 나눗셈 결과 : 2 나머지 결과 : 1 c= 정수 / 정수 ; 형태의 계산이 이루어지므로 우측 항의 계산결과는 정수 값으로 나온다. 따라서 좌측 항의 변수 c 에는 나눗셈의 몫이 대입된다 . 변수 a 값 5 에 변수 b 값 2 를 나눈 나머지 값을 구하여 좌측 변수 c 에 대입시킨다.

(15)

① c = a / b;          

② c = b / a;        

③ c = a % b;        

④ c = b % a;        

int a=7, b=2, c; 인 경우 , 다음 각 문항을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

3

0

1

2

(16)

(3) 관계 연산자

종류 기능 보기 > >= < <= == != 보다 크다 보다 크거나 같다 보다 작다 보다 작거나 같다 같다 (equal) 같지 않다 (not equal) a > b a >= b a < b a <= b a == b a != b ( 주의 !) 관계연산자의 연산결과는 논리적으로 올바르면 () 숫자 1, 논리적으로 틀리면 ( 거짓 ) 숫자 0 값으로 나타난다 . 2 개의 데이터 항이 필요한 이항 연산자이다 .

(17)

#include <stdio.h> void main() { int a=10, b=3, c; c = a > b; printf("a 가 b 보다 큰가 ? %d \n", c); c = a < b; printf("a 가 b 보다 작은가 ? %d \n", c); c = a == b; printf("a 가 b 와 같은가 ? %d \n", c); c = a != b; printf("a 가 b 와 같지 않는가 ? %d \n", c); } 변수 a 값이 b 값보다 크기 때문에 논리적으로 참이다 . 따라서 우측 항의 결과 1 로 표시된다 . 그래서 좌측 항 변수 c 에 1 값이 기억된다 . 실행결과

(18)

① c = 7 > 5;         

② c = 7 < 5;         

③ c = 7 == 5;         

④ c = 7 != 5;         

⑤ c = (7/2) >= (7%2);         

교제

123 쪽

[ 연습문제

2

번 ]

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

1

0

0

1

1

(19)

종류 기능 보기 && || ! 논리곱 (AND) 논리합 (OR) 논리부정 (NOT) a && b a || b !a ( 주의!) 논리적으로 참 (1) 이라는 것은 0 이 아닌 값을 지닌 때를 말하며 , 논리적으로 거짓 (0) 이라는 것은 0 값을 지닐 때를 말한다 . - 주어진 데이터 항이 논리적으로 조건이 맞는지 틀렸는지 결정할 때 사용한다 . - 논리연산자도 관계연산자와 같이 연산결과를 참 (1) 과 거짓 (0) 으로 표시한다 .

(20)

논리 연산자는 논리 값 ( 참과 거짓 ) 들을 연산하는 것이다 . 즉 , 논리 연산자는 각 데이터 항목을 논리적으로 평가하여 참 (1) 또는 거짓 (0) 값으로 표기하여 연산을 하게 된다 .  && 연산자의 특징 1 && 1  1 1 && 0  0 0 && 1  0 0 && 0  0  || 연산자의 특징 1 || 1  1 1 || 0  1 0 || 1  1 0 || 0  0  ! 연산자의 특징 !1  0 !0  1

[ 논리 연산자의 연산방법

]

(21)

#include <stdio.h> void main() { int a=10, b=3, c; c = a && b; printf(" 논리곱 결과 : %d \n", c); c = a || b; printf(" 논리합 결과 : %d \n", c); c = !a; printf(" 논리부정 결과 : %d \n", c); } 변수 a 값은 10 이므로 논리적으로 참 (1) 이고 , b 값도 논리적으로 참 (1) 이므로 AND 연산을 수행한 결과는 참 (1) 이다 . 따라서 c=1&&1; 로 연산되어 좌측 항의 변수 c 에는 숫자 1(참 ) 값이 기억된 다 . 실행결과 논리곱 결과 : 1

(22)

#include <stdio.h> void main()

{

int a=10, b=3, c;

c = (a>b) && (a<b);

printf(" 첫 번째 결과 : %d \n", c); c = (a>5) || (b==5); printf(" 두 번째 결과 : %d \n", c); c = !a && b; printf(" 세 번째 결과 : %d \n", c); } ◀4-5.C▶  실행결과 첫 번째 결과 : 0 두 번째 결과 : 1

(23)

① c = 3 && 5;         

② c = 3 || 5         

③ c = !3         

④ c = (3<2) && (3>2);         

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

1

1

0

0

(24)

(5) 비트 논리 연산자

종류 기능 보기 & | ^ ~ 비트단위 AND 비트단위 OR 비트단위 XOR 비트단위 NOT a & b a | b a ^ b ~a 이 연산자는 대상이 되는 데이터 항을 비트 대 비트 단위로 연산을 수행한다 . ( 주의 !) 비트 논리 연산자는 실수형 데이터에는 사용되지 못하고 , 정수형 데이터에서만 사용 가능한 연산자이다 .

(25)

#include <stdio.h> void main() { int a=5, b=3, c; c = a & b; printf(" 비트단위 AND 연산 결과 : %d \n", c); c = a | b; printf(" 비트단위 OR 연산 결과 : %d \n", c); c = a ^ b; printf(" 비트단위 XOR 연산 결과 : %d \n", c); c = ~0x0005; printf(" 비트단위 NOT 연산 결과 : %X \n", c); } 변수 a 값과 b 값을 먼저 2 진수로 바꾸 각각의 비트단위로 논리연산을 수행한 후, 그 결과를 다시 10 진수로 바꾸어 변수 c 기억시킨다. 실행결과

(26)

( 해설 ) 프로그램 예제 4-6.C 의 실행결과는 다음과 같이 계산되어 표시된 결과이다 .

(27)

( 주의 !) 비트 단위 XOR 연산자는 1 의 값을 갖는 데이터 항의 개수가 홀수 개일 때에는 연산결과가 1 로 나오고 , 짝수 개일 때에는 연산결과가 0 으로 나오는 특징을 가지고 있다 . 1 ^ 1  0 1 ^ 0  1 0 ^ 1  1 0 ^ 0  0

(28)

① c = 2 & 3;         

② c = 2 | 3;         

③ c = 2 ^ 3;         

④ c = (2 & 3) | 4;         

[ 연습문제

4

번 ]

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

2

3

1

6

교제

123

(29)

종류 기능 보기 >> << 오른쪽으로 비트 이동 왼쪽으로 비트 이동 a>>3; a<<2; - 이동연산자는 이항연산자이다 . - 이동연산자는 주어진 데이터 항에 대해 지정한 비트 수만큼 왼쪽 또는 오른쪽으로 이동시킬 때 사용하는 연산자이다 . - 이 연산자의 결과는 정수 값으로 표시된다 . - 이 연산자는 실수형 데이터 항에는 이용될 수 없다 .

(30)

#include <stdio.h> void main() { int a=10, c; c = a >> 2; printf(" 우측 이동결과 : %d \n", c); c = a << 2; printf(" 좌측 이동결과 : %d \n", c); } 변수 a 값을 먼저 , 2 진수로 바꾼 다음에 우측으로 2 비트만큼 이동시킨 후 , 그 결과 다시 10 진수로 바꾸어 변수 c 기억시킨 다 . ◀4-7.C▶  실행결과 우측 이동결과 : 2 좌측 이동결과 : 40

(31)

① c = 3 << 2;          

② c = 3 >> 2;          

③ c = 3 & (3 << 2);         

④ c = 3 | (3 >> 2);         

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 . 12 0 0 3

123 쪽

(32)

(7) 증감 연산자

종류 기능 보기 ++ 1 증가 1 감소 ++a; 또는 a++; --a; 또는 a--; 전치연산이라 함 . 후치연산이라 함. - 증감 연산자는 1 개의 데이터 항만 필요로 하는 단항 연산자이다 . - 증감 연산자는 주어진 데이터 항에 대해 그 값을 1 증가시키거나 감소시키는 동작을 수행한다 . - 따라서 이 연산자는 카운터의 기능을 하는 연산자이다 . - 이 연산자는 사용위치가 데이터 항 앞에 놓느냐 혹은 뒤에 놓느냐에 따라 실행방법은 달라진다 .

(33)

예 1) 전치일 경우 int a=5; b = ++a; 일 때 실행되는 순서는 ? a=a+1;  b=a; 의 순서로 처리되어 변수 a 에도 6 이 기억되고 , 변수 b 에도 6 이 기억된다 . 예 2) 후치일 경우 int a=5; b = a++; 일 때 실행되는 순서는 ? b=a;  a=a+1; 의 순서로 처리되어 변수 a 에는 6 이 기억되고 , 변수 b 에는 5 가 기억된다 .

(34)

#include <stdio.h> void main() { int a, b; a = 10; b = ++a; printf(" 첫 번째 결과 : a=%d b=%d \n", a, b); a = 10; b = a++; printf(" 두 번째 결과 : a=%d b=%d \n", a, b); } a=a+1; b=a; 순서로 처리되 므로 변수 b 에 대입되는 값은 11 이 다 . ◀4-8.C▶  실행결과 첫 번째 결과 : a=11 b=11 두 번째 결과 : a=11 b=10 b=a; a=a+1; 순서로 처리되 므로 변수 b 에 대입되는 값은 10 이 다 .

(35)

#include <stdio.h> void main() { int a, b, c; a=10; b=3; c = ++a + --b; printf(" 첫 번째 결과 : a=%d b=%d c=%d \n", a, b, c); a=10; b=3; c = a++ + b--; printf(" 두 번째 결과 : a=%d b=%d c=%d \n", a, b, c); } 실행결과 c=a+b; a=a+1; b=b-1 순서로 처 리된다. a=a+1; b=b-1 c=a+b; 순서로 처 리된다 .

(36)

① c = ++2;         

② c = 2++;         

③ c = ++2 + ++3;         

④ c = 2-- + 3--;         

[ 연습문제

6

번 ]

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

3

2

7

5

교제

123

(37)

종류 기능 보기 += -= *= /= %= 더한 후 대입 뺀 후 대입 곱한 후 대입 나눈 후 대입 나머지를 구한 후 대입 a += b; a -= b; a *= b; a /= b; a %= b; - 복합대입연산자는 서로 다른 기능을 가진 어떤 연산자와 대입연산자 (=) 를 서로 결합하여 만든 연산자이다 . - 이 연산자는 2 가지 연산기능을 동시에 갖고 있는 연산자이다 . - 이 연산자는 이항연산자이다 .

(38)

[ 복합대입 연산자의 동작 설명 ]

예 1) a+=b; 이라면 그 동작은 ? a=a+b; 의 형태로 처리된다 . 예 2) c=a+=b; 이라면 동작순서 는 ?  a=a+b;  c=a; 의 순서로 처리된다 .

(39)

#include <stdio.h> void main() { int a=10, b=3, c; c = a += b; printf(" 복합 덧셈 결과 : a=%d b=%d c=%d \n", a, b, c); c = a -= b; printf(" 복합 뺄셈 결과 : a=%d b=%d c=%d \n", a, b, c); c = a *= b; printf(" 복합 곱셈 결과 : a=%d b=%d c=%d \n", a, b, c); c = a /= b; printf(" 복합 나눗셈 결과 : a=%d b=%d c=%d \n", a, b, c); c = a %= b; printf(" 복합 나머지 결과 : a=%d b=%d c=%d \n", a, b, c); } a=a+b; c=a; 순서로 처리되므 로 , a=10+3; c=13; 형식으로 처리되어 좌측 항의 변수 c 에는 13 이 대입된 다 .

(40)

① a += b;                    

② a -= b--;                    

③ a *= --b;                

④ a /= b++;              

⑤ a %= ++b;                

[ 연습문제

7

번 ]

int a=7, b=2; 라고 프로그램 된 경우 , 다음 각 문항을 수행한 후 , 변수 a, b 에 기억되는 값을 각각 보이시오 .

a=9 b=2

a=5 b=1

a=7 b=1

a=3 b=3

a=1 b=3

교제

123

(41)

종류 기능 보기 ? : 조건적 선택 (a>3)? 10 : 20; - 주어진 조건식의 만족 여부에 따라 선택적으로 처리하는 연산자이다 . - 이 연산자는 조건식의 만족여부에 따라 사용되는 2 개의 식이 있다 . - 이 2 개의 식은 콜론 (:) 으로 구분되어 표현된다 . [ 사용형식 ] ( 조건식 )? 식 1 : 식 2 [ 사용 예 ] b = ( a>3 )? b : c; 잠깐 !!! ( 보충설명 ) 여기서 설명하는 조건연산자는 5 장에서 배울 조건 명령어인 if~else 명령과 유사하게 동작하는 연산자이다 .

(42)

#include <stdio.h> void main() { int a=5, b=3, c; c = (a>b)? a : b; printf(" 첫 번째 결과 : %d \n", c); c = (a<b)? a*10 : b*10; printf(" 두 번째 결과 : %d \n", c); } 변수 a 값이 b 값보다 크기 때문 조건식의 결과는 참(1) 이 된다 . 그러므로 변수 a 값이 변수 c 에 대입되므로 c 에는 10 이 기억 된다. 실행결과 첫 번째 결과 : 5 두 번째 결과 : 30 ◀4-11.C▶ 

(43)

① c = (2) ? 3 : 4;         

② c = (!0) ? ++3 : --3;         

③ c = (2 && 0) ? 2/3 : 2%3;         

int c; 인 경우 , 다음 각 문항의 수식을 수행한 후 , 변수 c 에 기억되는 값을 각각 보이시오 .

3

4

2

교제

123 쪽

(44)

퀴즈 풀어보기

교제

120 쪽 ( 3 번 ~ 19

)

(45)

참조

관련 문서

두 쌍의 대각의 크기가 각각 같은

[r]

두 쌍의 대각의 크기가 각각 같은

입출력 연산자 오버로딩을 이용한 cin, cout의 구현 friend 함수를 사용한 입출력 연산자 오버로딩.

– Banner 클래스라는 기존의 클래스를 이용해서, Print 인터페이스 를 충족시키는(즉, 구현하는) 클래스를 만들고자 한다... 

 피연산자의 값이 참이면 연산의 결과값을 거짓으로 만들고, 피연산 자의 값이 거짓이면 연산의 결과값을 참으로 만든다... 다음의

• 정수형끼리의 나눗셈에서는 결과가 정수형으로 생성하고 부동소수 점형끼리는 부동소수점 값을 생성된다.. •

 호출 명령어(CALL 명령어)는 현재 PC 내용을 스택에 저장하고 서브 루틴의 시작 주소로 분기하는 명령어다.. 그러나