Chapter 4 : 연산자(Operator)

Download Report

Transcript Chapter 4 : 연산자(Operator)

C Programming Language
Chap 4. 연산자
C언어 및 실습
C Language and Practice
Chap 4. 연산자(Operator)
WONKWANG UNIVERSITY
Dept. of Computer Engineering
1
C Programming Language
Chap 4. 연산자
단원의 개요
단원의 학습목표
1. C가 제공하는 연산자들의 종류와 사용 예를 알아본다.
2. 연산자들간에 우선 순위 관계를 알아본다.
학습 유의점
1. 전위형, 후위형의 증가 및 감소 연산자 사용에
대한 주의 점을 파악한다.
2. 비트 단위 연산은 컴퓨터마다 다를 수 있음을
주의 한다.
3. 논리 연산자와 비트 단위 논리 연산자의 혼동
에 주의 한다.
단원의 학습계획
1. 연산자의
우선 순위
2. 연산자들의
종류와 사용법
연산자들간의 우선 순위와 이들 간의 결
합성을 정확히 이해한다.
산술 / 관계 / 논리 / 비트 / 조건 / 증감
/ 나머지 / 콤마 / 복합 배정 / 캐스트
연산자 들
WONKWANG UNIVERSITY
Dept. of Computer Engineering
사용된 함수
함
수 : printf( ) : 1장
형 식 : printf(“%d %c”, (int)a, (char)b);
scanf( ) : 2장
형 식 : scanf(“%d”, &a);
scanf(“%s”, s);
2
C Programming Language
Chap 4. 연산자
연산자와 우선순위
 문장에서 사용되는 수식은 연산자(Operator : +, -, *, / 등 )와 연
산의 대상이 되는 피연산자(Operand : 숫자, 변수)로 구성된다.
Operator(연산자)
result = ( -x + y ) * z
#include <stdio.h>
void main()
{
int radius = 6;
int diameter = 12;
float pi = 3.14;
double result1, result2;
result1 = pi * radius * radius;
result2 = pi * diameter;
Operand(피연산자)
printf("원의면적= %f \n원둘레 = %f\n\n", result1, result2);
}
 하나의 수식(expression)에 여러 개의 연산자가 존재하는 경우에서
연산자의 우선순위에 따라 연산이 실행
 우선 순위가 높은 것이 먼저 처리되며, 우선순위가 같은 경우 결합
(associativity: 좌->우) 규칙에 따라 실행
WONKWANG UNIVERSITY
Dept. of Computer Engineering
3
C Programming Language
Chap 4. 연산자
연산자의 우선순위
연산자 이름
연산자
결합 방향
괄호 및 포인터 연산자
( ) [ ] -> .
→
단항 연산자
! ~ ++ -- * & (형명칭) sizeof
←
산술 승제 연산자
* / %
→
산술 가감 연산자
+ -
→
비트 쉬프트 연산자
<< >>
→
비교 연산자
< <= > >=
→
등가 연산자
== !=
→
비트곱 연산자
&
→
비트 XOR 연산자
^
→
비트합 연산자
|
→
논리곱 연산자
&&
→
논리합 연산자
||
→
조건 연산자
? :
←
대입 연산자
= += -= *= /= &= /= ^= <<= >>=
←
콤마 연산자
,
→
WONKWANG UNIVERSITY
Dept. of Computer Engineering
4
C Programming Language
Chap 4. 연산자
연산자의 우선순위
연산자 이름
연산자
[]
->
괄호 및 포인터 연산자
()
단항 연산자
! ~
산술 승제 연산자
*
/
산술 가감 연산자
+
-
비트 쉬프트 연산자
<<
비교 연산자
<
등가 연산자
==
비트곱 연산자
&
→
비트 XOR 연산자
^
→
비트합 연산자
|
→
논리곱 연산자
&&
→
논리합 연산자
||
→
조건 연산자
? :
←
대입 연산자
= += -= *= /= &= /= ^= <<= >>=
←
대입연산자
콤마 연산자
,
→
콤마연산자
++
WONKWANG UNIVERSITY
Dept. of Computer Engineering
-- *
.
결합 방향
→
&
(형명칭) sizeof
%
→
산술연산자
→
>>
<=
←
→
>
>=
!=
→
→
비교연산자
우선순위가장 높음
우선순위가장 낮음
논리연산자
5
C Programming Language
Chap 4. 연산자
산술 연산자( 수행결과는 산술계산 값 )
 산술 연산자(arithmetic operator)에는 덧셈(+), 뺄셈(-), 곱셈(*),
나눗셈(/), 나머지(%)가 있으며, 제곱 연산자는 곱셈을 반복함.
#include <stdio.h>
 수행결과 : 계산된 값
void main()
{
int m, p, x, y;
 일반 형식
float n;
연산자(operator) :
+, -, *, /, %(정수형계산)
형 식 : operand1 연산자 operand2
 보기
m
n
p
x
y
=
=
=
=
=
6
6
m
p
p
+
/
%
*
*
4 - 2;
2;
3;
// 나머지연산자(%) 계산은 정수형만 가능함.
p;(제곱)
p * p;(세제곱)
WONKWANG UNIVERSITY
Dept. of Computer Engineering
m = 6 + 4 - 2;
n = 6 / 2 * 3;
p = m % 3;
x = p * p;
y = p * p * p;
// m=8
// n= 9.000000
// 나머지 값 2
//제곱 값 2*2 =4
// 세제곱 값 2*2*2 =8
printf("덧셈뺄셈값
= %d\n", m);
printf("나눗셈과곱셈값 = %f\n", n);
printf("나머지값
= %d\n", p);
printf("P의 제곱값
= %d\n", x);
printf("P의 세제곱값
= %d\n", y);
}
6
C Programming Language
Chap 4. 연산자
산술 연산자
( 수행결과는 산술계산 값 )
 예제 1( 4pp참조 하면서 우선순위가 높으면 ( ) 삽입한다)
 산술 연산자를 이용하는 프로그램( ( ): 연산자는 가장 높은 우선순위임)
#include<stdio.h>
void main()
{
int a, b, c, x;
x = 2 + (2 * 4) - 5;
printf("x
x = 2 * 4 % 3 / 2;
printf("x
x = -2 – (3 * 4) + (5 % 6) ; printf("x
x = x + 5;
printf("x
a = b = c = 3;
a = -2+(6 % 4);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
=
=
=
=
%d\n",
%d\n",
%d\n",
%d\n",
x);
x);
x);
x);
printf("a = %d\n", a); //(a=(b=(c=3))즉, a=3,b=3,c=3 )
printf("a = %d\n", a);
7
C Programming Language
Chap 4. 연산자
관계 연산자
( 수행결과는 참(1) 또는 거짓(0)임 )
 관계 연산자는 두 수식의 비교(크고,작고, 같음, 다름)관계를 비교
 연산수행 결과 : 참(TRUE,1) 또는 거짓(FALSE,0)
 관계 연산자의 종류와 의미
관계 연산자
표현 형식
<
의 미
Opr1의 값이 Opr2의 값보다 작다.
<=
Opr1의 값이 Opr2의 값보다 작거나 같다.
>
Opr1 연산자 Opr2
>=
예, a < 3
Opr1의 값이 Opr2의 값보다 크다.
Opr1의 값이 Opr2의 값보다 크거나 같다.
==
Opr1의 값이 Opr2의 값과 같다.
!=
Opr1의 값이 Opr2의 값과 다르다.
 보기( a, b를 Opr(operand:피연산자)라 부름)




a
a
a
a
<b
>= b
== b
!= b
(a가 b보다 작으면 참, 크면 거짓)
(a가 b보다 크거나 같으면 참, 작으면 거짓)
(a와 b가 같으면 참, 같지 않으면 거짓)
(a와 b가 같지 않으면 참, 같으면 거짓)
WONKWANG UNIVERSITY
Dept. of Computer Engineering
8
C Programming Language
Chap 4. 연산자
관계 연산자( 수행결과는 참(1) 또는 거짓(0)임 )
 보기(
4pp참조 하면서 우선순위가 높으면 ( ) 삽입한다)
char c = ‘w’;
int i=1, j=2, k= -7, x= 7e+33, y= 0.001;
 위와 같이 변수가 선언되어 있다면, 아래의 표현식은 우측 관계식과 동일함
표현식
동등한 식 (우선순위 고려)
값
‘a’ + 1 < c
( ‘a’ + 1 ) < c
-i – 5 * j >= k + 1
( ( -i ) - ( 5 * j ) ) >= ( k + 1 )
3 < j < 5
( 3 < j ) < 5
1
x - 3.333 <= x + y
( x - 3.333 ) <= ( x + y )
1
x < x + y
x < ( x + y )
0
‘v’ == c – 1
‘v’ == ( c – 1 )
1
i + j + k == -2 * j
( ( i + j ) + k ) == ( ( -2 ) * j )
1
k == j-9 == i
( k == ( j – 9 ) ) == i
1
x + x != x * y
( x + x ) != ( x * y )
0
x != x + y
x != ( x + y )
0
WONKWANG UNIVERSITY
Dept. of Computer Engineering
1(참)
0(거짓)
9
C Programming Language
Chap 4. 연산자
관계 연산자
( 수행결과는 참(1) 또는 거짓(0)임 )
#include <stdio.h>
void main()
{
char c = 'w';
int i=1, j=2, k=-7, x=7e+33, y=0.001;
printf("('a' + 1) < c
= %d\n", 'a' + 1 < c );
printf("( ( -i ) - ( 5 * j ) ) >= ( k + 1 ) = %d\n", -i - 5 * j >= k + 1 );
printf("( 3 < j ) < 5
= %d\n", 3 < j < 5);
printf("( x - 3.333 ) <= ( x + y )
= %d\n", x - 3.333 <= x + y);
printf("x < (x + y)
= %d\n", x < x + y);
printf(" \'v\'== (c -1)
= %d\n", 'v' == c -1);
printf("( ( i + j ) + k ) == ( ( -2 ) * j ) = %d\n", i + j + k == -2 * j );
printf("(k == j- 9) == i
= %d\n", k == j-9 == i);
printf("(x + x) != (x * y)
= %d\n", x + x != x * y);
printf("x != (x + y)
= %d\n\n", x != x + y);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
10
C Programming Language
Chap 4. 연산자
관계 연산자
( 수행결과는 참(1) 또는 거짓(0)임 )
 예제 2
 a=100, b=150일 때 관계 연산자들을 사용한 프로그램(결과:참(1),거짓(0) )
#include<stdio.h>
void main()
{
int a=100, b=150;
printf("
printf("
printf("
printf("
%d
%d
%d
%d
< %d : %d\n", a, b, a<b); /*a값이 b값보다 작으므로 참(1)*/
> %d : %d\n", a, b, a>b); /*a가 b보다크지않으므로 거짓(0)*/
== %d : %d\n", a, b, a==b);/*a와b값이같지않으므로 거짓(0)*/
!= %d : %d\n", a, b, a!=b);/* a와b가 다르므로 참(1) */
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
11
Chap 4. 연산자
C Programming Language
연산자우선순위 : 논리연산자<비교연산자<산술연산자
논리 연산자( 수행결과는 참(1) 또는 거짓(0)임 )
 수행결과 : 참값(0 아닌값)과 거짓값(0)을 연산하여 참(TRUE,1) 또
는 거짓(FALSE,0)을 결과 반환
 논리 연산자는 산술 연산자와 결합하여 사용할 수 있으며, 논리 연산
자는 산술 연산자의 우선 순위보다 낮다.
 관계 연산자의 종류와 의미
논리 연산자v
사용 방법
의
미
&&(AND)
Opr1 연산자 Opr2
AND, Opr1과 Opr2가 모두 참일 경우에만 참이 된다.
||(OR)
Opr1 연산자 Opr2
OR, Opr1과 Opr2 중 하나만 참이면 참이 된다.
!(NOT)
!Opr
NOT, Opr가 거짓일 때 참이 된다.
int a = 0, b = 5;
a && b;
a || b;
!a;
!a && b;
// a =>거짓(0)
//
//
//
//
WONKWANG UNIVERSITY
Dept. of Computer Engineering
b => 참(0이나 0.0이 아닌 모든 수)
(거짓 && 참) ==결과=> 거짓(0)
(거짓 || 참) ==결과=> 참(1)
!(거짓) ==결과=> 참(1)
(!(거짓) && 참) -> (참 && 참) ==결과 => 참(1)
12
C Programming Language
Chap 4. 연산자
논리 연산자( 수행결과는 참(1) 또는 거짓(0)임 )
WONKWANG UNIVERSITY
Dept. of Computer Engineering
13
C Programming Language
Chap 4. 연산자
논리 연산자
( 수행결과는 참(1) 또는 거짓(0)임 )
 예제 3
 논리 연산자의 사용 예를 위한 프로그램
#include<stdio.h>
참 참
거짓
void main()
{
int a = 5, b = 14, c = 0;
int d, e, f, g;
d = a &&
e = a ||
f = a &&
g = !c;
printf("
printf("
printf("
printf("
b;
b;
c;
//
//
//
//
%d && %d =
%d || %d =
%d && %d =
!%d
=
AND, d = 1(참)
OR, e = 1
f = 0(거짓)
NOT *, g = 1
%d\n", a, b, d);
%d\n", a, b, e);
%d\n", a, c, f);
%d\n", c, g);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
14
C Programming Language
Chap 4. 연산자
논리 연산자
( 수행결과는 참(1) 또는 거짓(0)임 )
 보기( 4pp참조 하면서 우선순위가 높으면 ( ) 삽입한다)
char c = ‘w’;
/* c는 참 */
int i=3, j=3, k=3;
/* i, j, k는 참 */
double x = 0.0, y = 2.3; /* x는 거짓, y는 참
*/
표현식
동등한
식(우선순위 우측
고려) 관계식과 동일함
값
 위와 같이 변수가
선언되어 있다면, 아래의
표현식은
i && j && k
( i && j ) && k
1
x|| i &&
x || ( i && ( j - 3 ) )
0
i < j && x < y
( i < j ) && ( x < y )
0
i < j || x < y
( i < j ) || ( x < y )
1
i == j && x <= y
( i == j ) && ( x <= y )
1
x + y && j + 1 == !k + 4
( x + y ) && (( j + 1 ) == ( ( !k ) + 4 ))
1
‘A’ <= c && c <= ‘Z’
( ‘A’ <= c ) && ( c <= ‘Z’ )
0
c – 1 == ‘v’ || c + 1 == ‘v’
( ( c – 1 ) == ‘v’ ) || ( ( c + 1 ) == ‘v’ )
1
i ==2 || j == 4 || k == 6
(( i ==2 ) || ( j == 4 )) || ( k == 6 )
0
i ==2 || j == 4 || (k = 6)
(( i ==2 ) || ( j == 4 )) || ( k = 6 )
1
j - 3
K는
WONKWANG UNIVERSITY
Dept. of Computer Engineering
참(1)임
15
C Programming Language
Chap 4. 연산자
논리 연산자( 수행결과는 참(1) 또는 거짓(0)임 )
#include <stdio.h>
void main()
{
char c = 'w';
// c는 참
int i=3, j=3, k=3;
// i, j, k는 참
double x = 0.0, y = 2.3; // x는 거짓, y는 참
printf("( i && j ) && k
printf("( x || ( i && ( j - 3 ) )
printf("( i < j ) && ( x < y )
printf("( i < j ) || ( x < y )
printf("( i == j ) && ( x <= y )
printf("( x + y ) && (( j + 1 ) == ( ( !k ) + 4 ))
printf("( 'A' <= c ) && ( c <= 'Z' )
printf("( ( c – 1 ) == 'v' ) || ( ( c + 1 ) == 'v' )
printf("(( i ==2 ) || ( j == 4 )) || ( k == 6 )
printf("(( i ==2 ) || ( j == 4 )) || ( k = 6 )
}
= %d\n", i && j && k );
= %d\n", x || i && j - 3);
= %d\n", i < j && x < y);
= %d\n", i < j || x < y );
= %d\n", i == j && x <= y);
= %d\n", x + y && j + 1 == !k + 4);
= %d\n", 'A' <= c && c <= 'Z' );
= %d\n", c - 1 == 'v' || c + 1 == 'v');
= %d\n", i ==2 || j == 4 || k == 6);
= %d\n\n",i ==2 || j == 4 || (k = 6));
참
WONKWANG UNIVERSITY
Dept. of Computer Engineering
16
C Programming Language
Chap 4. 연산자
비트 연산자( 수행결과는 참(1) 또는 거짓(0)임 )
 비트 단위의 이동이나 비트의 논리곱/논리합을 연산
 정수 형식의 데이터(char포함)를 피연산자로 사용
 연산은 각 비트가 다른 비트와 독립적으로 처리
비트 연산자
표현 형식
의 미
&
비트 단위로 논리곱을 한다(비트 AND).
|
비트 단위로 논리합을 한다(비트 OR).
^
Opr1 연산자 Opr2
비트 단위로 배타적 논리합을 한다(비트 XOR).
: 논리합의 반대(역)
<<
Opr1 연산자를 Opr2 만큼 왼쪽으로 이동시킨다.
>>
Opr1 연산자를 Opr2 만큼 오른쪽으로 이동시킨다.
~
~Opr
WONKWANG UNIVERSITY
Dept. of Computer Engineering
Opr에 대한 1의 보수를 구한다(비트 NOT).
17
C Programming Language
Chap 4. 연산자
비트 연산자 :
 보기 :
~
~(not):비트부정, &:비트AND, |:비트 OR, ^:비트 XOR
~ : (=NOT) 연산자는 1은 0으로, 0은 1로 바꾼다.
1
0
0
1
 보기 :
1
1
0
1
0
==
1
0
1
==
0
1
1
0
0
1
1
0
0
1
1
~
0
1
0
0
& : (비트 AND) 연산자는 Opr1과 Opr2의 같은 위치의 비트 2개가 모두 1일 때만
1로 된다.
1
0
0
1
0
0
1
1
Opr1
0
&
0
0
1
1
WONKWANG UNIVERSITY
Dept. of Computer Engineering
1
1
0
1
0
0
1
0
0
0
1
Opr2
18
C Programming Language
Chap 4. 연산자
비트 연산자:
 보기 :
~(not):비트부정, &:비트AND, |:비트 OR, ^:비트 XOR
| : (비트 OR) 연산자는 Opr1과 Opr2의 같은 위치의 비트중 하나라도 1일 때 1이
된다.
1
0
0
1
0
0
1
1
Opr1
1
|
0
 보기 :
0
1
1
1
1
0
1
0
1
1
1
1
1
1
Opr2
^ : (비트 XOR) 연산자는 Opr1과 Opr2의 같은 위치의 비트가 서로 다를 때만 1이
된다.
1
0
0
1
0
0
1
1
Opr1
1
^
0
0
1
1
WONKWANG UNIVERSITY
Dept. of Computer Engineering
1
1
0
1
0
1
0
1
1
1
0
Opr2
19
C Programming Language
Chap 4. 연산자
비트 연산자 : <<, >>
 보기 :
<< 연산자는 각 비트를 Opr만큼 왼쪽으로 이동시키고 이동된 비트수만큼 오른쪽
의 비트들을 0으로 채운다.
 (10001010) << 2 == (00101000)
1
0
0
0
1
0
1
0
1
0
0
0
1
0
1
0
0
 보기 :
>> 연산자는 각 비트를 Opr만큼 오른쪽으로 이동시키고 이동된 비트수만큼 왼쪽
의 비트들을 0으로 채우거나 부호와 같은 비트로 채운다.(기종에 따라 다름)
 (10001010) >> 2 == (00100010)
1
0
0
0
1
0
1
0
0
1
0
0
0
1
0
1
0
WONKWANG UNIVERSITY
Dept. of Computer Engineering
20
Chap 4. 연산자
비트 연산자
256 128 64
21 :
71 : 1
5:
32
0
16
1
0
8
0
0
4
1
1
1
2
0
1
0
1
1
1
1
C Programming Language
 예제 4
 비트 연산자의 특징과 사용 방법을 알아보기 위한 간단한 프로그램.
#include<stdio.h>
#define number 0xAB3E
void main( )
{
int x, y;
x = 21;
y = 71;
printf("x = %d
Number : 1010101100111110
~Number : 0101010011000001
X(21)
:
10101
Y(71)
:
1000111
5
:
101
y = %d\n", x, y);
y = x & (~number);
printf("y = %d\n",
y = y & 5;
printf("y = %d\n",
y = x >> 5;
printf("y = %d\n",
y = x << 10;
printf("y = %d\n",
// y= 1
y);
// y = 1
y);
y);
y);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
21
C Programming Language
Chap 4. 연산자
조건 연산자( ?)
 조건 연산자는 세 개의 피연산자를 취함( 3항 연산자)
 if-else의 형태에 해당
연산자 : ? :
형 식 : var = 조건 ? exp1 : exp2 ;
 조건 연산자의 일반 형식
예)
x = ( y > 0 ) ? y : -y ;
/* y가 0보다 크면 x = y, y가 0보다 작으면 x = -y 수행 */
 조건이 참이면 var는 exp1의 값으로 대입( var = exp1)
 조건이 거짓이면 var는 exp2의 값으로 대입(var = exp2)
var = condition
? exp1 : exp2 ;
조건
=
WONKWANG UNIVERSITY
Dept. of Computer Engineering
True
거짓
참
or
False
True
False?
exp1
exp2
22
C Programming Language
Chap 4. 연산자
조건 연산자(?)
 절대값(3,-3의 절대값)구하는 프로그램
#include
<stdio.h>
if(
y < 0 )
void
main()
{
x = -y
/* 만약 y가 음수라면 */
/* y는 음수 -y는 양수 */
else
int x;
int y;
x = y
x = ( y < 0 ) ? -y : y ;
/* y는 양수 */
printf("y값을 입력하시오 = ");
scanf("%d", &y); // y=3;
x= (y < 0 ) ? -y : y;
printf("y= %d일때, x의 대입된 값은%d 입니다\n\n", y, x);
}
시작
TRUE
y<0
( y < 0 ) ?
x = -y
FALSE
y>=0
x =y
종료
 보기
 p = (a < 0 ) ? -a : a;
 a가 0보다 작다면 p에 -a가 대입되고, a가 0보다 크다면 p에 a가 대입된다.)
예) p = ( 5 > 3 ) ? 1 : 2;
 5가 3보다클때 관계연산의 결과는 참이다. 조건연산자의 결과
 위 조건식에서 p=2는 될 수 없다.
WONKWANG UNIVERSITY
Dept. of Computer Engineering
p=1이 된다.
23
C Programming Language
Chap 4. 연산자
증가(++)와 감소(--) 연산자:
단항연산자 i++ == i+1;
i-- == i-1;
 증가와 감소 연산자는 ++와 --가 있으며 단항 연산자이다.
 증가 연산 : 변수의 값을 1만큼 증가. 변수++, ++변수 (변수= 변수+1)
 감소 연산 : 변수의 값을 1만큼 감소. 변수--, --변수 (변수= 변수-1)
 조건 연산자의 일반 형식
연산자 : ++, -형 식 : ++opr, --opr
// opr : 피연산자(operand)
<- 전위(prefix)
opr++, opr-- <-후위(postfix)
 연산자의 위치에 따라 의미상의 차이가 있다.
 전위연산자{++(--)변수}는 증.감 연산이 먼저 일어나고 변수 값이 식에 사용
 e = ++p; (p = p+1; e = p;), e = --p; (p = p-1; e = p;) : 실행전 p값 1증.감
 후위연산자{변수++(--)}는 변수 값이 식에서 먼저 사용되고, 증.감 연산이 나
중에 일어남
 e = q++; (e = q; q = q+1;), e = q--; (e = q; q = q-1; ) : 실행후 p값 1증.감
WONKWANG UNIVERSITY
Dept. of Computer Engineering
24
C Programming Language
Chap 4. 연산자
증가와 감소 연산자
 보기 4-12
#include<stdio.h>
void main()
{
int p = 1, q = 1;
int e, j;
☞ e=p++;
e=p;
p=p+1;
p;
ee == p++;
p = p + 1;
/*
e=
/* postfix
postfix :: 후위연산자
후위연산자
*/ P++ */ q=q+1;
☞ j=++q;
jq == ++q;
q + 1;
j = q;
/* prefix
prefix : :전위연산자
전위연산지j=*/++q */
/*
j=q;
printf(" p
e
q
j
\n");
printf("%3d%6d%6d%6d\n", p, e, q, j); /* p=2, e=1, q=2, j=2 */
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
25
C Programming Language
Chap 4. 연산자
증가와 감소 연산자
 예제 5
 전위, 후위 증감 연산자의 차이를 알아보기 위한 프로그램
#include<stdio.h>
void main()
{
int a = 100, b = 100;
printf(" a
printf("++a
printf("a++
printf(" a
=
=
=
=
%d
%d
%d
%d
b
--b
b-b
=
=
=
=
%d
%d
%d
%d
\n",
\n",
\n",
\n",
a, b);
++a, --b);
a++, b--);
a, b);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
26
C Programming Language
Chap 4. 연산자
증가와 감소 연산자
 예제 5
전위증.감연산자 : 현재 변수에 들어있는 값에 1을 증.감시키고 출력한다.
후위증.감연산자: 현재변수에 들어있는 값을 먼저 출력하고 현재 변수값에 1을 증.감시킨다.
 전위, 후위 증감 연산자의 수행결과를 알아보기 위한 프로그램
#include<stdio.h>
a
100
101
102
b
100
99
98
void main()
{
int a = 100, b = 100;
printf(" a
printf("++a
printf("a++
printf(" a
=
=
=
=
%d
b = %d100
100
%d
101 --b = %d99
%d
101 b-- = %d
99
%d
b
=
%d
102
98
\n",
\n",
\n",
\n",
a, b);
++a,
++a --b);
--b
a++,
a++ b--);
b-a, b);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
27
C Programming Language
Chap 4. 연산자
나머지 연산자(%)
 나머지 연산자는 %로 나머지를 구한다.
 조건 연산자의 일반 형식
연산자 : %
형 식 : opr1 % opr2
 opr1을 opr2로 나누었을 때의 몫을 버리고 나머지만을 구한다.
 본 연산자(%)는 float나 double의 자료형에서는 허용되지 않는다.
#include <stdio.h>
void main()
{
int q, r;
int a = 23, b = 5;
 보기
int p ;
p = 23 / 5 ;
p = 23 % 5 ;
// p = 4
// p = 3
WONKWANG UNIVERSITY
Dept. of Computer Engineering
// 나눈 몫 구하기
q = a/b;
printf(" a/b의 몫
= %d\n", q);
// 나눈 나머지 구하기
r= a%b;
printf(" a/b의 나머지 = %d\n", r);
}
28
C Programming Language
Chap 4. 연산자
콤마 연산자
 콤마 연산자의 일반 형식
연산자 : ,
형 식 : opr1 , opr2
 콤마 연산자가 분리시키는 표현식이 왼쪽에서 오른쪽으로 평가되
는 것을 보장
int sum, cost ; //sum은 cost보다 먼저 초기화된다.
 콤마가 들어 있는 표현식이 갖게 되는 값은 콤마의 오른쪽에 있는
표현식의 값을 갖는다.
x = ( y = 3, ( z = ++y + 2 ) + 5 ) ;
3
WONKWANG UNIVERSITY
Dept. of Computer Engineering
3+1
4+2
Y=3,
Y=Y(3)+1
z = Y(4)+2
Y = z(6)+5
X= Y(11)
6+5
29
C Programming Language
Chap 4. 연산자
콤마 연산자(,)
 콤마 연산자의 일반 형식
연산자 : ,
형 식 : opr1 , opr2
 콤마 연산자가 분리시키는 표현식이 왼쪽에서 오른쪽으로 평가되
는 것을 보장
int sum, cost ; //sum은 cost보다 먼저 초기화된다.
 콤마가 들어 있는 표현식이 갖게 되는 값은 콤마의 오른쪽에 있는
표현식의 값을 갖는다.
⑥ ①?
④②①
③? ⑤
x = ( y = 3,
, ( z = ++y + 2 ) + 5 ) ;
x =
y = 3,
3 ( z = 6
++y
4 11
+ 2 ) + 5
WONKWANG UNIVERSITY
Dept. of Computer Engineering
Y=3,
Y=Y(3)+1
z = Y(4)+2
Y = z(6)+5
X= Y(11)
30
C Programming Language
Chap 4. 연산자
콤마 연산자
 예제 6
 콤마 연산자를 사용한 간단한 프로그램
#include<stdio.h>
void main()
{
int i, j, k;
j=(i=3, ++i +5 );
printf("\n i = %d
/* i=3, i=i+1, j=i+5 */
j = %d", i, j);
j=(k=3, k++ +5);
printf("\n k = %d
/* k=3, j=k+5, k=k+1 */
j = %d\n", k, j);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
31
C Programming Language
Chap 4. 연산자
복합 배정 연산자
 복합 배정 연산자들은 대입 연산자(=)와 같은 우선 순위
 문장이 간결해지고, 효율적인 코드를 생성
 복합 배정 연산자의 일반 형식
연산자 : +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
형 식 : opr1 연산자 opr2
 보기
p += lim ;
/* p = p + lim */
p *= lim ;
/* p = p * lim */
p %= lim ;
/* p = p % lim */
p &= lim ;
/* p = p & lim */
p |= lim ;
/* p = p | lim */
x *= 3 * y + 12 ;
/* x = x * ( 3 * y + 12) */
WONKWANG UNIVERSITY
Dept. of Computer Engineering
32
C Programming Language
Chap 4. 연산자
복합 배정 연산자
 예제 7
 복합 배정 연산자를 사용한 간단한 프로그램
#include<stdio.h>
void main()
{
int i=1, j=2, k=3;
i += 1;
j *= 2;
k /= 3;
/* i = i + 1 */
/* j = j * 2 */
/* k = k / 3 */
printf(" i = %d, j = %d, k = %d\n", i, j, k);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
33
C Programming Language
Chap 4. 연산자
캐스트 연산자(강제형변환: (데이터형))
 보기
int mice;
mice = 1.6 + 1.7;
mice = (int)1.6 + (int)1.7;
/* 자동변환되어 mice에는 3이 대입된다. */
/* 강제형변환되어 mice에는 2가 대입된다. */
 캐스트 연산자(강제형변환)는 단항 연산자이며, 우선 순위는 우 → 좌
(float) i + 3.0
(float)의 우선순위가 +의 우선순위보다 높다
#include <stdio.h>
((float) i) + 3.0
WONKWANG UNIVERSITY
Dept. of Computer Engineering
void main()
{
int mice1, mice2;
mice1 = 1.6 + 1.7;
//자동형변환
mice2 = (int)1.6 + (int)1.7; //강제형변환
printf(" 자동형변환= %d\n 강제형변환= %d\n", mice1, mice2);
}
34
C Programming Language
Chap 4. 연산자
실습
WONKWANG UNIVERSITY
Dept. of Computer Engineering
35
C Programming Language
Chap 4. 연산자
단원의 개요
단원의 학습목표
1. C가 제공하는 연산자들의 종류와 사용 예를 알아본다.
2. 연산자들간에 우선 순위 관계를 알아본다.
학습 유의점
1. 전위형, 후위형의 증가 및 감소 연산자 사용에
대한 주의 점을 파악한다.
2. 비트 단위 연산은 컴퓨터마다 다를 수 있음을
주의 한다.
3. 논리 연산자와 비트 단위 논리 연산자의 혼동
에 주의 한다.
단원의 학습계획
1. 연산자의
우선 순위
연산자들간의 우선 순위와 이들 간의 결
합성을 정확히 이해한다.
2. 연산자들의
종류와 사용법
산술 / 관계 / 논리 / 비트 / 조건 / 증감
/ 나머지 / 콤마 / 복합 배정 / 캐스트
연산자 들
WONKWANG UNIVERSITY
Dept. of Computer Engineering
사용된 함수
함
수 : printf( )
형 식 : printf(“%d %c”, (int)a, (char)b);
scanf( )
형 식 : scanf(“%d”, &a);
scanf(“%s”, s);
36
C Programming Language
Chap 4. 연산자
산술 연산자 : 6~7pp참조
 예제
 산술 연산자의 수행에서 우선 순위를 알기 위한 프로그램
#include <stdio.h>
void main()
{
int num=10;
printf("10
printf("10
printf(" 4
printf(" 4
/ 3 = %d \n" , num / 3);
%% 3 = %d \n" , num % 3);
/ 2 = %d \n" , 4 / 2 );
%% 2 = %d \n" , 4 % 2 );
printf("10 / 2 + 3 = %d \n", num / 2 + 3);
printf("10 / ( 2 + 3 ) = %d \n", num / ( 2 + 3 ) );
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
37
C Programming Language
Chap 4. 연산자
산술 연산자 : 6~7pp참조
 예제
 보기와 결과가 같도록 옆 문제에 산술연산부분을 하나의 수식으로 빈칸을 채우시오.
 연산자 우선순위 및 사칙연산자 사용 문제
보기
#include <stdio.h>
void main()
{
int x = 7;
int y = 5;
int sum, sub;
int result;
sum = x + y;
sub = x - y;
result = sum * sub;
#include <stdio.h>
void main()
{
int x = 7;
int y = 5;
int result;
result =
printf("result = %d\n", result);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
[
①
]
printf(“result = %d\n”, result);
}
38
C Programming Language
Chap 4. 연산자
관계 연산자 : 8~11pp 참조
 예제
 두 정수를 입력 받아 두 정수에 관계 연산한 결과 를 출력하는 프로그램
# include <stdio.h>
void main()
{
int i, j;
printf("Enter first number : ") ;
scanf("%d", &i);
printf("Enter second number : ") ;
scanf("%d", &j);
printf("i
printf("i
printf("i
printf("i
printf("i
printf("i
< j : %d \n", i < j );
<= j : %d \n", i <=j );
> j : %d \n", i > j );
>= j : %d \n", i >=j );
== j : %d \n", i == j );
!= j : %d \n", i != j );
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
39
C Programming Language
Chap 4. 연산자
관계 연산자 : 8~11pp 참조
 예제
 두 정수를 입력 받아 양수 및 음수를 판단하고 큰 정수를 판별하는 프로그램
# include <stdio.h>
void main()
{
int i, j;
printf("첫번째 숫자 입력 : ") ;
scanf("%d", &i);
printf("두번째 숫자 입력 : ") ;
scanf("%d", &j);
printf("(0는 거짓, 1을 참)\n");
printf("\n부호 판별\n");
printf("i는 음수이다 : %d \n", [
printf("i는 양수이다 : %d \n", [
printf("i는 0이다 : %d \n\n", [
printf("j는 음수이다 : %d \n", [
printf("j는 양수이다 : %d \n", [
printf("j는 0이다 : %d \n", [
WONKWANG UNIVERSITY
Dept. of Computer Engineering
]);
]);
] );
]);
] );
]);
printf("\n크기판별\n");
printf("i가 j 보다 크거나 같다 : %d \n“, [
]);
printf("j가 i 보다 크거나 같다 : %d \n", [
]);
printf("j와 i 는 같다 : %d \n", [
]);
printf("j와 i 는 같지 않다 : %d \n", [
]);
}
40
C Programming Language
Chap 4. 연산자
논리 연산자 : 12~16 pp 참조
 예제
 두 정수를 입력 받아 두 정수에 논리 연산한 결과를 출력하는 프로그램
# include <stdio.h>
void main()
{
int i, j;
printf("Enter first number : ") ;
scanf("%d", &i);
printf("Enter second number : ") ;
scanf("%d", &j);
printf("i>=100 && j>=100 : %d \n",
printf("i>=100 || j>=100 : %d \n",
i>=100 && j>=100 );
i>=100 || j>=100 );
i=0;
printf("i && j: %d \n", i && j );
printf("i || j: %d \n", i || j );
printf("!i : %d, !j : %d \n", !i , !j );
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
41
C Programming Language
Chap 4. 연산자
논리 연산자 : 12~16 pp 참조
 예제
 입력받은 변수 X 의 값이 0과 100사이의 값인지 판별하는 프로그램
# include <stdio.h>
void main()
{
int x;
printf("정수 x를 입력하세요 : ") ;
scanf("%d",&x);
printf("참(1), 거짓(0)\n") ;
printf("x는 0과 100사이의 값입니다 : %d\n", (
)&&(
printf("x는 0보다 작거나 100보다 큰 값입니다.: %d\n", (
) );
)&& (
));
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
42
C Programming Language
Chap 4. 연산자
비트연산자 조건 연산자 활용 : 17~23pp 참조
 예제
 비트를 이용한 플래그 값 사용
#include <stdio.h>
void main()
{
char flag; //비트연산 편의상 char형 변수 사용
flag = 0x50;
printf("1번 전원이 %s져있습니다.\n", ((flag & 0x01) != 0) ? "켜" : "꺼");
printf("5번 전원이 %s져있습니다.\n", ((
) != 0 ) ? "켜" : "꺼");
printf("7번 전원이 %s져있습니다.\n", ((flag & 0x40) != 0) [
]);
}
flag
0
1
0
1
0
0
0
0
0
&
0x01
0
0
0
0
0
0
0
1
0x10
0
0
0
1
0
0
0
0
WONKWANG UNIVERSITY
Dept. of Computer Engineering
0
0
0
0
0
0
0
flag & 0x01
0x40
0
1
0
0
0
0
0
0
43
C Programming Language
Chap 4. 연산자
증가와 감소 연산자 : 24~27pp 참조
 예제
 전위, 후위 증감 연산자의 차이를 알아보기 위한 프로그램
#include <stdio.h>
void main()
{
int i=100, j=200;
printf("i
printf("i
printf("i
printf("i
:
:
:
:
%d
%d
%d
%d
,
,
,
,
j
j
j
j
:
:
:
:
%d
%d
%d
%d
\n",
\n",
\n",
\n",
++i, j++);
i, j);
--i, j--);
i, j);
i=j++;
printf("i : %d , j : %d \n", i, j);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
44
C Programming Language
Chap 4. 연산자
나머지 연산자 : 28pp 참조
 예제
 나머지 연산자를 사용하여 홀수인지 짝수인지 구별하는 프로그램
#include<stdio.h>
void main()
{
int num;
[힌 트]
2로 나눈 나머지가 0이면 짝수이다.
2로 나눈 나머지가 1이면 홀수이다.
printf("입력받은 수가 짝수인지 홀수인지 판별하는 프로그램!\n");
printf("Input a number ==>");
scanf("%d", &num);
/* 사용자에게 정수를 입력 받음 */
printf("입력한 수는 : %s 입니다.\n", [
] ? "홀수" : "짝수");
/*조건연산자의 결과가 1이면 “홀수출력하고, 0이면 “짝수”라고 출력함 */
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
45
C Programming Language
Chap 4. 연산자
콤마 연산자 : 29~31pp 참조
 예제
 콤마 연산자를 이해하기 위한 간단한 프로그램
#include <stdio.h>
void main()
{
int value, num;
num=300;
value=(num , 5 , 900); /* value = 300; value=5; value=900; */
printf("value : %d \n", value );
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
46
C Programming Language
Chap 4. 연산자
복합 배정 연산자 : 32~33pp 참조
 예제
 복합 배정 연산자를 사용한 프로그램
#include<stdio.h>
void main()
{
int i, j, k, l;
i=1, j=2, k=3, l=4;
i += 1;
/* i
j -= 2;
/* j
k *= 3;
/* k
l /= 4;
/* l
printf(" i = %d, j = %d,
=
=
=
=
k
i
j
k
l
=
+ 1 */
- 2 */
* 3 */
/ 3 */
%d , l = % d\n", i, j, k, l);
i=1, j=2, k=3 , l=4;
i = i + 1 ;
/* i +=
j = j - 2 ;
/* j -=
k = k * 3;
/* k *=
l = l / 3;
/* l /=
printf(" i = %d, j = %d, k = %d , l =
1
2
3
4
%
*/
*/
*/
*/
d\n", i, j, k, l);
}
WONKWANG UNIVERSITY
Dept. of Computer Engineering
47
C Programming Language
Chap 4. 연산자
실습
 실습문제1
187,800초를 입력하여 일, 시간, 분, 초로 변환하는 프로
그램을 작성하시오
#include<stdio.h>
#define SECPERMIN 60
#define MINPERHOUR 60
#define HOURPERDAY 24
void main( )
{
:
scanf(“%d”, &whole_sec);
:
printf("\n%d 초는 %d 일 , %d 시간
whole_sec,day, hour, min, sec);
}
HINT !
WONKWANG UNIVERSITY
Dept. of Computer Engineering
%d 분
%초 이다 \n",
Whole_sec = min * 60(SECPERMIN) + sec;
Whole_sec = hour * 60(MINPERHOUR) *60(SECPERMIN) + min
Whole_sec = day * 24(HOURPERDAY) * 60(MINPERHOUR) *60(SECPERMIN) + hour
48
C Programming Language
Chap 4. 연산자
실습
 실습문제 2
 어느 학생의 점수를 입력받아 평점과 백분율 점수를 구하여 출력하는 프로그램
을 작성하시오.
C언어 및 실습 : 4.5
컴퓨터 개론 : 4.0
디지털 공학 : 4.5
전기전자 기초 : 3.5
이산수학 : 3.0
HINT !
(num1>4.0 ? "A+" : ( num1>3.5 ? "A0" : (num1>3.0 ? "B+" : ( num1>2.5 ? "B0" : (num1>2.0
? "C+" : (num1>1.5 ? "C0" : "F") ) ) ) ) )
WONKWANG UNIVERSITY
Dept. of Computer Engineering
49
C Programming Language
Chap 4. 연산자
연산자의 우선순위 및 증감연산자
 대입연산자 <조건연산자 < 논리연산자 < 관계연산자 < 산술연산자
 논리연산자 : 논리합 < 논리곱 < 비트합 < 비트XOR < 비트곱
 관계연산자 : 등가 < 비교
 산술연산자 : 산술 가감 < 산술 승제
 수행결과
 논리연산의 수행결과 : 참(True, 1), 거짓(False, 0)
 관계연산의 수행결과 : 참(True, 1), 거짓(False, 0)
 산술연산 수행결과 : 실행 값
 증(++)감(--)연산자
 전위(prefix)연산자
 e = ++p; (p = p+1; e = p;), e = --p; (p = p-1; e = p;)
 후위(postfix)연산자
 e = q++; (e = q; q = q+1;), e = q--; (e = q; q = q-1; )
WONKWANG UNIVERSITY
Dept. of Computer Engineering
50
C Programming Language
Chap 4. 연산자
연산자의 우선순위
연산자 이름
연산자
결합 방향
우선순위가장 높음
괄호 및 포인터 연산자
( ) [ ] -> .
→
단항 연산자
! ~ ++ -- * & (형명칭) sizeof
←
산술 승제 연산자
* / %
→
산술 가감 연산자
+ -
→
비트 쉬프트 연산자
<< >>
→
비교 연산자
< <= > >=
→
등가 연산자
== !=
→
비트곱 연산자
&
→
비트 XOR 연산자
^
→
비트합 연산자
|
→
논리곱 연산자
&&
→
논리합 연산자
||
→
조건 연산자
? :
←
대입 연산자
= += -= *= /= &= /= ^= <<= >>=
←
대입연산자
콤마 연산자
,
→
콤마연산자
산술연산자
비교연산자
논리연산자
우선순위가장 낮음
WONKWANG UNIVERSITY
Dept. of Computer Engineering
51