4장. 식과 연산자.(1)

Download Report

Transcript 4장. 식과 연산자.(1)

제 4장 식과 연산자
제 4장 식과 연산자
배우는 내용
• 식과 연산자
• 연산자의 종류
• 연산자 우선순위
• 형 변환
4.1
식과 연산자
• 컴퓨터는 "계산"으로 많은 일을 처리한다. 이러한 계산을 하려면 값과 식
이 필요하다.
1 + 2= ?
― 연산자 (operator): 연산하는 방식
― 피연산자(operand): 연산의 대상
피연산자
연산자
피연산자
1
+
2
평가
3
4.1
식과 연산자
• 화면에 출력하는 코드를 이용하여 식을 표기하는 코드를 작성해본다
식의 값 출력 (77p)
식이 평가되어 출력
• 출력결과
4.1
식과 연산자
• 일정한 상수 이외의 변수를 이용하여 식을 표기 가능하다.
변수 값의 이용(78p)
• 출력결과
4.1
식과 연산자
• 3장에서 배운 scanf 함수를 이용하여 입력 받은 값을 식에 이용할 수 있다
덧셈 프로그램(80p)
• 출력결과
4.2
연산자의 종류
• 앞에서 살펴본 + 연산자 이외에도 다양한 연산자가 존재한다.
<연산자 표>
연산자 종류
연산 기호
특징
산술 연산자
+, - , *, / , %
증감연산자
++, --
대입연산자
=, -=, +=, …
비교 연산자
<, <=, >, >=, ==,!=
연산 결과가 참이면 1을 거짓이면 0
논리 연산자
&&, ||, !
연산 결과가 참이면 1을 거짓이면 0
비트 연산자
&, |, ~, ^
쉬프트 연산
<<, >>
간접 연산자
*
피 연산자의 값이 메모리 주소일 때 유효하다.
주소 연산자
&
해당 변수가 할당된 주소를 확인
형변환 연산자
(변환할 type)
구분 연산자
. , ->
조건 연산자
조건?처리1:처리2
기타
(),[],{}
%(나머지) 연산자는 피연산자로 정수형이 온다.
단항 연산자로 피연산자의 위치에 따라 차이가 있다.
우항의 연산결과를 좌항의 변수에 대입한다.
변수 자체의 논리가 아닌 각 비트별 논리 연산
비트 단위의 쉬프트로 기본적으로 빈 곳은 0을 채움
명시적 형변환에 사용된다.
구조체나 공용체 처럼 변수와 멤버사이의 구분자
조건이 참이면 처리1을 거짓이면 처리2를 수행
괄호 연산자는 우선순위가 가장 높다.
4.2
연산자의 종류
• 다양한 연산자를 이용해서 프로그램을 작성해보자
두 변수를 이용하여 사칙 연산을 하는 프로그램(83p)
• 출력결과
4.2
연산자의 종류
• 앞서 사칙연산을 하는 프로그램을 작성해보았다. 여기서 마지막의 % 연
산자는 낯설 수 있는 연산자이다. 이는
num1 ÷ num2 = num3 …나머지 ●
라는 계산에서 ●을 구하는 연산자이다.
예1) 10 ÷ 5 = 2 …나머지 0
예2) 10 ÷ 3 = 3 …나머지 1
printf("num1%%num2는 %d입니다. \n", num1%num2);
% 기호를 나타내려면 %를 두 개 이어서 표기하여야한다.
4.2
연산자의 종류
• 증가ㆍ감소 연산자
변수의 값을 1 증가 또는 1 감소 시키는 연산자
a++;
변수 a의 값을 1증가 시킨다.
++연산자를 증가 연산자(increment operator)라고 한다.
a--;
변수 a의 값을 1감소 시킨다.
--연산자를 감소 연산자(decrement operator)라고 한다.
변수 a
++
변수 a
<증가 연산>
변수 a
--
변수 a
<감소 연산>
4.2
연산자의 종류
• 증가ㆍ감소의 전치와 후치
증가ㆍ감소 연산자는 피연산자의 앞뒤에 사용할 수 있다.
a++;
++a;
후치 증가
전치 증가
• 이 표기의 차이로 프로그램의 실행 결과가 바뀌는 경우가 있다.
후치 증가의 경우
전치
전치
후치증가의
증가의경우
경우
전치 증가 연산잔는 증가시킨 후에 대입
후치 증가 연산자는 대입한 후에 증가
4.2
연산자의 종류
• 대입 연산자
좌변의 변수에 우변의 값을 대입하는 기능을 갖는 연산자
지금까지 사용해왔던 '='라는 기호를 말한다.
• 대입 연산자는 다른 연산자와 조합하여 복합 대입 연산자도 존재한다.
<복합 대입 연산자>
기호
이름
+=
덧셈 대입
-=
뺄셈 대입
*=
곱셈 대입
/=
나눗셈 대입
%=
나머지 대입
&=
논리곱 대입
^=
배타적 논리합 대입
|=
논리합 대입
<<=
좌 시프트 대입
>>=
우 시프트 대입
4.2
연산자의 종류
• 복합 대입 연산자의 사용법
a += b;
a+b 한 값을 a에 대입한다.
― 두 가지 문 모두 변수 a 값과 변수 b값을 더해서 변수 a에 대입한다.
a += b;
a = a+b;
― 덧셈 이외에도 다른 연산자도 같은 방식으로 연산된다.
a ●= b;
a = a●b;
4.2
연산자의 종류
• 복합 대입 연산자를 사용하여 3개의 수를 입력 받고 더하는 프로그램
복합 대입 연산자(p91)
4.2
연산자의 종류
• sizeof 연산자
여러 가지 형이나 식의 메모리 크기를 알 수 있다.
sizeof( ● ) : ●의 크기를 알 수 있다.
int 형
char 형
sizeof 연산을 하여 정수형태로 표현하면 다음과 같이
sizeof( int ) = 4byte
sizeof(char) = 1byte
의 값을 출력한다는 것을 알 수 있다.
변수의 타입마다 담을 수 있는 크기가 모두 다르고 컴파일러마다 다를 수 있다.
4.2
연산자의 종류
• sizeof 연산자를 직접 사용해보자
sizeof 연산자(92p)
4.2
연산자의 종류
• 시프트(shift) 연산자
— 수치를 2진수로 표시할 때 자릿수를 왼쪽 또는 오른쪽으로 지정한 수만큼
이동시키는 연산
• << 왼쪽 시프트 연산자
• >> 오른쪽 시프트 연산자
숫자 5 -> 2진수 변환 00000101
5<<1 한번 좌시프트
00001010 십진수10이됨
숫자 10-> 2진수 변환 00001010
10>>1 한번 우시프트
00000101 십진수 5가됨
4.3
연산자의 우선순위
• 다음 식을 보자
a+2*5
어떤 식이 먼저 계산될까?
• 일반적인 사칙연산에서 덧셈보다 곱셈을 먼저 계산한다. 이것은 곱셈
의 우선순위가 높기 때문인데 C언어 연산자의 경우도 마찬가지로 우
선순위가 적용된다.
a=(b+2)*5;
• 괄호의 연산부터 진행 후 곱셈, 그리고 =연산자가 이루어진다.
4.3
연산자의 우선순위
우선 순위
연산자
결합 규칙
1
() [] -> . ++(후위) --(후위)
->(좌에서 우)
2
sizeof &(주소) ++(전위) --(전위) ~ !
*(역참조) +(부호) -(부호), 형변환
<-(우에서 좌)
3
*(곱셈) / %
->(좌에서 우)
4
+(덧셈) -(뺄셈)
->(좌에서 우)
5
<< >>
->(좌에서 우)
6
< <= >= >
->(좌에서 우)
7
== !=
->(좌에서 우)
8
&(비트연산)
->(좌에서 우)
9
^
->(좌에서 우)
10
|
->(좌에서 우)
11
&&
->(좌에서 우)
12
||
->(좌에서 우)
13
?(삼항)
->(우에서 좌)
14
= += *= /= %= &= ^= |= <<= >>=
->(우에서 좌)
15
,(콤마)
->(좌에서 우)
4.4
형 변환
• 다음 소스코드는 int형 변수의 데이터를 double형 변수에 대입하는
코드이다
크기가 큰 형의 대입(p101)
4.4
형 변환
• 작은 형의 변수에 크기가 큰 형의 값을 대입하면 어떻게 될지 다음
코드를 작성하여 실행해보자
크기가 작은 형의 대입(p101)
4.4
형 변환
• 크기가 작은 형으로 대입하면 값을 그대로 저장할 수 없기 때문에 소
수점 아래는 버리고 160이라는 정수를 저장하였다
int 형
double
형
소수점을 버림
double
형
int 형
• 자동으로 형이 변환되어 대입되기 때문에 값의 일부가 없어지는 경우
가 있다.
4.4
형 변환
• 캐스트 연산자
— 사용법
(형) 식
— 지정한 식의 형을 ( ) 내에 지정한 형으로 변환하는 연산이다
inum = (int)dnum;
dnum의 값을 int형으로 변환한다
• 앞의 소스를 변경하여도 실행 결과는 같다. 그러나 이렇게 변환되는
것을 코드 안에 명시적으로 표기할 수 있다
4.4
형 변환
• 서로 다른 형의 연산
— 형 변환은 대입뿐 아니라 사칙연산 등을 처리할 때도 발생한다.
형이 다를 때의 연산(p106)
int형 d가 double형으로 변환되어 연산함
4.4
형 변환
• 같은 형인 int형 변수를 나눗셈 연산하고 결과를 예측해보자
동일한 형의 연산(p107)
원했던 값은 1.25 그러나 결과는 1
int형 변수끼리의 연산으로 소수점이 버려진 후
연산되었기 때문에 연산 전 미리 캐스팅
연산자를 이용하여야 한다
4.4
형변환
• 변수 div에 double형 값을 저장하려면 변수 num1과 num2 가운데
적어도 한쪽은 double형으로 변환해야함
― 캐스트 연산자를 사용해서 올바른 출력 실행하기
캐스트연산 사용(p108)