제 4 장 연산자(operator)
식(expression)은 프로그램에서 컴퓨터가 수행해야 할 기본적인 작업 명령을 설정하는데 사용되며 연산자는 식을 구성하는 기본 단위로 사용된다.
연산의 의미 예를 들어 x와 y의 값을 더한 후 그 결과를 z에 놓는다고 하면 다음의 표와 같다.
|
|
|
|
|
|
언어적인 식 |
사흐름도의 식 |
적수학적인 식 |
|
z = x + y |
z <- x + y |
x + y = z |
|
언어적인 식의 z=x+y에서 '+'와 '='는 각각 덧셈과 대입을 담당하는 연산자이다.
C 언어는 다른 컴퓨터 언어보다 월등히 많은 연산자를 제공한다.
C 언어의 연산자 종류는 다음과 같다
|
|
|
|
|
|
연산자 구분 |
연산자 종류 |
설 명 |
|
산술 연산자 |
+, -, *, /, % |
사칙연산 |
|
|
논리 연산자 |
<, <=, ==, >, != |
대소 및 항등 판정 |
|
|
관계 연산자 |
||, &&, ! |
논리합, 논리곱, 논리부정 |
|
|
증감 연산자 |
++, -- |
증가, 감소 |
|
|
대입 연산자 |
= |
치환 |
|
|
조건 연산자 |
?: |
조건 판정 |
|
|
콤마 연산자 |
, |
식의 열거 |
|
|
size of 연산자 |
sizeof |
자료의 크기 연산 |
|
|
포인터 연산자 |
&, * |
포인터 처리 여산 |
|
|
cast 연산자 |
(형) |
데이터형 변환 연산 |
|
|
멤버참조연산자 |
. , -> |
구조체나 공용체 멤버 |
|
|
4.1 산술 연산자(arithmetic operator)
4.1.1 이항 연산자(binary operator)
산술 연산자는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%) 등의 연산을 할 때 사용되는 연산자로 다음과 같다.
|
|
|
|
|
|
종 류 |
설 명 |
보 기 |
|
+ |
덧 셈 |
x + y |
|
|
- |
뺄 셈 |
x - y |
|
|
* |
곱 셈 |
x * y |
|
|
/ |
나 눗 셈 |
x / y |
|
|
% |
나머지 계산 |
x % y |
|
|
[ 예제 4-1.C ]
#include <stdio.h> main() { int x=13, y=4; printf("x + y = %d\n", x+y); printf("x - y = %d\n", x-y); printf("x * y = %d\n", x*y); printf("x / y = %d\n", x/y); printf("x % y = %d\n", x%y); }
|
4.1.2 단항 연산자(unary operator)
단항 연산자에는 C 언어만 가지고 있는 증가 연산자(increment operator), 감소 연산자(decrement operator)와 부호를 표시하는 '+', '-' 연산자가 있다.
단항 연산자는 1개의 오퍼렌드를 대상으로 연산을 실행하므로 반복문 내에서 카운터로 사용된다.
딘항 연산자의 종류는 다음과 같다.
|
|
|
|
|
|
종 류 |
설 명 |
보 기 |
의 미 |
|
++ |
1씩 증가 |
x++, ++x |
x = x + 1 |
|
|
-- |
1씩 감소 |
x--, --x |
x = x - 1 |
|
|
+, - |
부호 표시 |
+x, -x |
|
|
|
후행 증감 연산자 : 변수의 값을 먼저 사용하고 난 후 그 변수의 값을 증가 시키거나 감소 시킨다.
선행 증감 연산자 : 변수의 값을 먼저 증가 시키거나 감소 시킨 후 그 변수를 사용 한다.
증감 연산자의 사용 예는 다음과 같다.
|
|
|
|
|
|
사 용 예 |
의 미 |
설 명 |
|
x=++y; |
y=y+1 x=y |
y의 값이 먼저 1증가하고 y가 x에 대입 |
|
|
-- |
x=y y=y+1 |
y가 x에 대입 된 후 y의 값이 1증가 |
|
|
i=3; x[--i]=10; |
i=i+1 x[i]=10 |
i의 값이 먼저 1감소하고 x[2]에 10이 대입 |
|
|
i=3; x[i--]=10; |
x[3]=10 i=i-1 |
x[3]에 10이 대입 된 후 i의 값이 1감소 |
|
|
[ 예제 4-2.C ]
#include <stdio.h> main() { int x, y, z; y=5; z=10; x=++y + ++z; printf("x=%d, y=%d, z=%d\n", x, y, z); x=y++ + z++; printf("x=%d, y=%d, z=%d\n", x, y, z); x=--y + z--; printf("x=%d, y=%d, z=%d\n", x, y, z); x=y-- + --z; printf("x=%d, y=%d, z=%d\n", x, y, z); }
|
4.1.3 대입 연산자(assignment operator)
오른쪽에 있는 값이나, 수식을 계산하여 왼쪽에 있는 변수에 넣어 주는 연산자를 말한다.
변수 = 상수; => 초기화의 의미 변수 = 변수; => 치환의 의미 변수 = 수식; => 연산의 의미 |
단순 대입 x = 10; x = y; x = y + z;
다중 대입 다중 대입일 경우 식을 우측에서부터 계산하여 좌측의 변수로 차례대로 대입한다.
예 |
설 명
|
x+=y=z; |
y=z x=x+y |
x=y+=z; |
y=y+z x=y |
x+=y-=z; |
y=y-z x=x+y | |
복합 대입문 대입문과 연산자를 복합적으로 사용한다. 사용할 수 있는 연산자는 +, -, *, /, %, >>, <<, &, | 등이 있다. 복합 대입문의 경우 등호 우변의 값과 등호 좌변의 변수값을 등호 좌변의 연산자로 연산한 후 등호 좌변의 변수에 기억 시킨다.
예 |
설명 |
x+=y; |
x=x+y |
x%=3; |
x=x%3 |
x/=y+2; |
x=x/(y+2) |
x|=y^z; |
x=x|(y^z) |
|
[ 예제 4-3.C ]
#include <stdio.h> main() { int x, y=10, z=3;
x=20; x=y; x=y+z; printf("x=%d, y=%d, z=%d\n", x, y, z); x+=y=z; printf("x=%d, y=%d, z=%d\n", x, y, z); x=y+=z; printf("x=%d, y=%d, z=%d\n", x, y, z); x+=y-z; printf("x=%d, y=%d, z=%d\n", x, y, z); x+=y; printf("x=%d, y=%d, z=%d\n", x, y, z); x%=3; printf("x=%d, y=%d, z=%d\n", x, y, z); x/=y+2; printf("x=%d, y=%d, z=%d\n", x, y, z); }
|
4.2 관계 연산자(relational operator)
두 식의 대소 크기를 비교하는 연산자로서 연산 결과가 참(true)이나 거짓(false)으로 표현한다.
C 언어에서 참(true)은 0이 아닌 모든 수를 의미하여, 거짓(false)은 0을 의미한다.
C 언어에서 관계 연산자는 주로 조건문인 if 명령문의 조건 체크와 반복문인 for, while, do~while 문의 조건 체크에 많이 사용된다.
관계 연산자의 종류는 다음과 같다.
종 류 |
설 명 |
예 |
> |
~보다 크다. |
x > y |
>= |
~보다 크거나 같다. |
x >= y |
< |
~보다 작다. |
x < y |
<= |
~보다 작거나 같다. |
x <= y |
== |
같다. |
x == y |
!= |
같지 않다. |
x != y |
|
[ 예제 4-4.C ]
#include <stdio.h> main() { int x, y, relation; x=1, y=0; relation=(x>y); printf("%d > %d ==> %d\n", x, y, relation); relation=(x>y); printf("%d > %d ==> %d\n", x, y, relation); relation=(x>y); printf("%d > %d ==> %d\n", x, y, relation); relation=(x>y); printf("%d > %d ==> %d\n", x, y, relation); }
|
4.3 논리 연산자(logical operator)
논리 연산자는 논리합(OR), 논리곱(AND), 논리부정(NOT) 등의 연산을 할 때 사용된다.
이 연산자는 프로그램 사에서 조건 제어와 반복 제어 명령에서 많이 사용된다.
논리 연산자의 종류는 다음과 같다.
종 류 |
설 명 |
예 |
&& |
논리 곱(AND) |
x && y |
|| |
논리 합(OR) |
x || y |
! |
논리 부정(NOT) |
!x |
논리곱(AND)와 논리합(OR)
수식 A 값 |
수식 B 값 |
수식A && 수식B |
수식A || 수식B |
ZERO(거짓) |
ZERO(거짓) |
0 (거짓) |
0 (거짓) |
ZERO(거짓) |
NONZERO(참) |
0 (거짓) |
1 (참) |
NONZERO(참) |
ZERO(거짓) |
0 (거짓) |
1 (참) |
NONZERO(참) |
NONZERO(참) |
1 (참) |
1 (참) |
* C 언어에서 거짓인 논리를 작업 결과로 돌려 줄 때는 0을, 참인 논리를 작업 결과로 돌려줄 때는 1을 돌려준다.
논리부정(NOT)
수식 A 값 |
!(수식A) |
ZERO(거짓) |
1 |
NONZERO(참) |
0 |
[ 예제 4-5.C ]
#include <stdio.h> main() { int x, y, logical; x=2; y=0; logical = x && y; printf("%d && %d ==> %d\n", x, y, logical); logical = x || y; printf("%d | %d ==> %d\n", x, y, logical); logical = !x; printf("! (%d) ==> %d\n", x, logical); }
|
4.4 비트 연산자(bit operator)
비트 단위로 논리 연산을 수행하는 연산자 이다.
C 언어의 비트 연산자는 어셈블리 언어에서만 가능했던 프로그램 표현을 C 언어에서도 가능하게 한다.
비트 연산자의 종류
종 류 |
설 명 |
예 |
& |
비트 단위의 논리곱(AND) |
x & y |
| |
비트 단위의 논리합(OR) |
x | y |
^ |
비트 단위의 배타적 논리합(XOR) |
x ^ y |
~ |
비트 단위의 논리 부정(NOT) |
~x |
시프트(shift) 연산자의 종류
종 류 |
설 명 |
예 |
>> |
오른쪽으로 비트 이동 |
x >> 2 |
<< |
왼쪽으로 비트 이동 |
x <<2 |
[ 예제 4-6.C ]
#include <stdio.h> main() { unsigned short x, y, bitlogical; x=0xa9a9; y=0x7070; bitlogical = x&y; printf("%x & %x ==> %x\n", x, y, bitlogical); bitlogical = x | y; printf("%x | %x ==> %x\n", x, y, bitlogical); bitlogical = ~x; printf("~ (%x) ==> %x\n", x, bitlogical); bitlogical=x<<3; printf("%x << 3 ==> %x\n", x, bitlogical); }
|
프로그램 해석
x=0xa9a9, y=0x7070
4.5 기타 연산자
4.5.1 콤마(,) 연산자(comma operator)
순차 연산자라고도 하며 연산자의 우선 순위 중 가장 낮다.
동일한 성격 또는 동일한 자격의 오퍼렌드를 나열하는데 사용한다.
결합 순서는 좌에서 우로 한다.
보 기 |
의 미 |
x= (y=1, y++); |
x=2, y=2 |
x= (y=1, z=2); |
y=1, z=2, x=2 |
x= (y=3, y+2); |
y=3, x=5 |
X= (y=1, ++y); |
y=1, y=2, x=2 |
4.5.2 sizeof 연산자
sizeof 연산자는 바로 다음에 나오는 변수나 데이터 형이 차지하는 메모리의 크기(byte)를 구하는 연산자이다.
결과 값은 정수형 상수이다.
메모리 할당이나 입출력 시스템간의 정보 교환에 주로 사용한다.
sizeof 연산자의 사용 방법은 다음과 같다.
[ 예제 4-7.C ]
#include <stdio.h> main() { char c, s[20]; int size, a, b[20]; size = sizeof(char); /* 형선언 연산자 사용 */ printf("sizeof(char) = %d\n", size); size = sizeof(double); /* 형선언 연산자 사용 */ printf("sizeof(double) = %d\n", size); size = sizeof(c); /* 변수 사용 */ printf("sizeof(c) = %d\n", size); size = sizeof(s); /* 배열 변수 사용 */ printf("sizeof(s) = %d\n", size); size = sizeof(b); / * 배열 변수 사용 */ printf("sizeof(b) = %d\n", size); }
|
4.5.3 형 변환 연산자(cast operator)
데이터의 형을 강제적으로 변환시켜 사용하는 연산자이다.
형 변환 연산자의 사용 방법은 다음과 같다.
#include <stdio.h> main() { int a=7, b=2; float c1, c2; c1=a/b; c2=(float) a/b; /* float은 cast 연산자 */ }
|
c1 값은 3.0이 기억되고. c2는 3.5가 기억된다.
4.5.4 열거형 연산자
열거형 연산자는 열거 상수들의 모임으로 다음과 같이 표현한다. enun 열거형 { 멤버1, 멤버2,......} 변수1, 변수2,.......;
열거형 기호 상수와 같은 의미를 갖는다. 기호 상수는 하나의 상수를 표시하는데 비해 열거형은 관련된 자료를 모아서 이루어진다. 즉 열거형은 기호 상수의 집합이다. 예) ① enun offon {off, on} ; off는 0, on은 1로 set된다. ② enun week {sun = 1, mon, tue, wed, thu, fri, sat} ; sun 은 1 mon 은 2 tue 은 3 : : sat 는 7
[ 예제 4-8.C ]
#include <stdio.h> main() { int i; enun offon {off, on}; scanf("%d", &I); if (I == off) printf("Switch off\n"); if (I == on) printf("Switch on\n"); }
|
4.5.5 조건 연산자(conditional operator)
조건식을 조사하여 조건식이 참이면 식 1의 결과를, 조건식이 거짓이면 식 2의 결과를 구하는 연산자이다.
[ 예제 4-9.C ]
#include <stdio.h> main() { int a. b. c; printf ("두 정수를 입력하세요.\n"); scanf("%d, %d", &a, &b); c = (a>b) ? (a-b) : -(a - b); printf("두 정수차의 절대값 : %d\n", c); }
|
4.6 연산자의 우선 순위와 연산 방향
연산자의 우선 순위가 두 가지 이상의 연산자들이 결합된 수식에서 어느 것이 먼저 계산 되어야 할 것인가를 결정하는 순서를 말한다.
연산자들은 그들이 결합될 때, 방향을 갖는다. 이것을 연산의 방향이라고 한다.
일반적인 연산의 순서 ① 괄호(( )) 안의 내용이 먼저 처리된다. ② 단항 연산자가 이항 연산자보다 먼저 처리된다. ③ 좌측에서 우측으로 실행한다.
연산자의 우선 순위는 다음과 같다.
우선 순위 |
구 분 |
연 산 자 종 류 |
결합 규칙 |
고

저 |
괄호, 구조체, 공용체 |
( ) [ ] . --> |
좌 -> 우 |
단항 연산자 |
! ~ ++ -- - * & |
우 -> 좌 |
이
항
연
산
자 |
승 제 |
* / % |
좌 -> 우 |
가 감 |
+ - |
쉬 프 트 |
<< >> |
비 교 |
< <= > >= |
등 가 |
== != |
비트 AND |
& |
비트 XOR |
^ |
비트 OR |
| |
논리 AND |
&& |
논리 OR |
|| |
조 건 연 산 자 |
? : |
우 -> 좌 |
대 입 연 산 자 |
= =+ -= *= /= %= >>= <<= &= ^= |= |
우 -> 좌 |
나 열 연 산 자 |
, |
좌 -> 우 |
[ 문제1 ] 다음 문장을 실행 했을 대 a의 값을 10진수로 답하시오.
(1) int a; a=1+2*3-4; |
(2) int a; a=2*3%4/2; |
(3) int a; a=-1-2*3+4%5; |
(4) int a=2; a+=3*2; |
(5) int a; a<<= 1+2; |
(6) int a, b,c; a=2; a*=b=c=3; |
(7) int a, b, c; b=2; c=1; a=b==c+2; |
(8) int a=1, b=2, c=3; a=a|b&c; |
(9) int a=1, b=2. c=3 a=(a>b|c) * (b&a+c) |
(10) int a=b=c=1; a=-b++ + ++c; |
동주대학 전산과 홍수열 copyright(c) 1998. sooyoul Hong All Right Reserve
| |