3.7. 연산자
** 아래 본문에 [[ 기호와 ]]기호는 <<과 >>의 변형임. HTML 태그 때문에 임시로 기호 모양을 바꾼 것임.
연산자는 계산(연산)할 때 사용하는 수학적인 기호를 뜻합니다.
자료형과 변수 배열 등에 대해서 배웠으니 이번에는 이들 자료를 다루는 연산자에 대해서 공부하겠습니다.
연산자는 컴퓨터를 이용해서 어떤 계산을 할 때 사용하는 기호를 말합니다. 우리가 많이 사용하는 연산자로는 사칙연산에 사용하는 더하기(+), 빼기(-), 곱하기(*), 나누기(/) 연산자가 있습니다. 그 이외에도 C에서는 다양한 연산자를 이용합니다. 우리가 수학에서 배운 더하기 빼기의 연산 뿐만 아니라 논리 연산을 하는 연산자도 있고, 비트 단위로 밀어내는 비트 연산자도 있습니다. 또 앞서 배운 캐스트연산자처럼 자료의 형을 변환시키는 연산자도 있습니다. 이런 연산자기호나 사용법은 다른 언어에서도 거의 비슷하므로 C++언어의 연산자를 확실하게 배워두면 다른 언어를 배울 때도 도움이 되실 겁니다.
3.7.1. 연산자의 분류
연산자는 피연산자의 수에 따라서 일항, 이항, 삼항 연산자로 구분합니다.
연산자(operator)는 연산 당하는 쪽, 즉 피연산자(operand)의 수에 따라서 일항, 이항, 삼항 연산자로 나눕니다. 덧셈에서 + 기호가 연산자 기호인 것은 아실 겁니다. 따라서 피연산자는 3+5라는 연산에서 3과 5에 해당하는 숫자가 피연산자입니다.
3+5를 보면 더하기연산자(+) 좌우로 3과 5과 있습니다. 이럴 경우 3과 5과 피연산자이므로 피연산자의 개수는 2개입니다. 그래서 더하기연산자(+)는 피연산자 항목이 두 개이므로 이항 연산자가 됩니다. 더하기로서 + 기호가 아니라, 음과 양의 부호로서 + 기호도 있습니다. 양의 기호 +는 +5, +10과 같이 하나의 숫자 앞에만 사용합니다. 이럴 경우에는 피연산자가 하나이므로 양의 부호 +나 음의 부호 -는 일항연산자 또는 단항연산자가 됩니다. 주의할 점은 더하기 빼기의 +, -와 음의 부호 양의 부호의 +, -는 기능이 다르고 이름도 다르다는 점입니다.
1. 일항 연산자(unary operator)
단항 연산자라고 부릅니다. 피연산자가 하나입니다. 앞서 말한 음의 부호(unary minus) -나 양의 기호 +(unary plus) 등이 이에 해당합니다. 또 번지연산자 &나 증감연산자라는 ++, --, 그외 ~ 등의 연산자 등이 여기에 속합니다.
단항 연산자는 결합순서가 오른쪽에서 왼쪽입니다. 즉 -5는 먼저 5라는 피연산자를 계산하고, 여기에 - 기호를 붙여서 연산합니다.
2. 이항연산자(binary operator)
이항 연산자는 피연산자가 2개 필요합니다. 일반적인 연산자는 대부분 이항연산자입니다. 사칙연산에 사용하는 +, -, *, / 등이 모두 이항 연산자에 속합니다.
3. 삼항연산자(ternary operator)
삼항 연산자는 피연산자가 세 개 필요합니다. 세 개가 필요한 연산자도 있나 하고 생각하겠지만 조건연산자(conditional expression)라고 하는 것이 피연산자를 세 개나 필요로 합니다. ?: 가 바로 삼항연산자입니다.
피연산자의 자료형과 기능에 따라서 구별하는 방법을 많이 사용합니다.
피연산자의 수로 연산자를 구별할 수도 있지만 피연산자의 자료형에 따라서 구별하기도 하고 연산자의 기능별로 구별하기도 합니다. 보통은 연산자의 기능별로 구별하는데 다음과 같이 구별합니다.
1. 산술 연산자
대수 연산자라고 하는 것입니다. 사칙연산에 사용하는 네 가지 연산자와 나머지를 구하는 나머지연산자((modulud operator, 또는 mod연산자라고 부릅니다.)가 있습니다.
2. 관계 연산자
관계연산자는 두 피연산자 사이의 관계를 따지는 연산자입니다. 쉽게 말하면 두 피연산자 중에서 누가 더 크고 작은지, 또는 누가 더 앞인지 순서를 따지는 연산자입니다. 관계 연산자에는 >, >=, <, <= 등이 있습니다.
3. 논리 연산자
논리연산자는 논리적으로 맞나 틀리나를 따지는 연산자입니다. 쉽게 말해서 참, 거짓을 따지는 연산자라고 보면 됩니다. 논리 연산자에는 ==, !=, ||, &&, ! 등이 있습니다. C에서는 결과값이 0일 경우 거짓으로 판단하므로, 0이 아닌 모든 것은 참으로 판단합니다.
4. 증감 연산자
매우 편하게 사용할 수 있는 연산자 중의 하나입니다. ++은 증가연산자고 --는 감소연산자입니다. 단항 연산자이고, 피연산자의 앞과 뒤에 붙을 수 있는데, 앞에 붙느냐 뒤에 붙느냐에 따라서 계산결과가 조금 달라집니다. 피연산자의 앞에 붙으면 어떤 명령을 처리하기 전에 먼저 증감연산을 합니다. 반대로 뒤에 붙은 때는 일을 처리한 후에 증감연산을 합니다. 증감연산자는 어떤 수를 하나씩 증가시키거나 감소시키는 연산자입니다.
5. 비트 연산자
일반적인 연산자들이 바이트 이상의 자료를 다루는데 비하여 비트연산자는 비트 단위의 자료를 다룹니다. 이진수 단위를 다루는 특별한 연산자라고 할 수 있습니다. 이진연산을 하기 때문에 속도는 연산속도는 빠릅니다.
6. 대입 연산자
대입연산자의 종류에는 =, +=, -= 등이 있습니다. 주로 오른쪽에 있는 값을 왼쪽에 있는 변수에 넣으라는 연산을 합니다.
7. 부호 연산자
음과 양의 부호를 나타내는 +와 - 기호가 여기에 해당합니다.
8. 캐스트 연산자
자료형을 다룰 때 한 번 설명했던 연산자입니다. 자료형을 변환시키는 연산을 합니다. ()기호입니다.
9. 소속 연산자
주로 클래스를 다루기 위한 연산자와 영역 처리 연산자로 구성되어 있습니다.
10. 메모리 관리 연산자
연산자라고 하기에는 조금 그렇지만 하여간 메모리를 다루는 연산자로 new, delete 등이 있습니다.
11. 그외의 연산자
이들 이외에도 삼항연산자로 소개했던 조건연산자(?: 연산자)가 있고, 쉼표연산자(,), sizeof연산자, 간접지정 연산자(*), 번지 연산자(&) 등의 다양한 연산자로 나눌 수 있습니다.
표: 연산자의 구분
sizeof 연산자 : sizeof()
간접지정연산자 : *
관계 연산자 : ! < <= > >= == !=
논리 연산자 : && ||
대입 연산자 : = -= += etc
번지 연산자 : &
부호 연산자 : + -
비트 연산자 : & | ^ [[ ]] ~
산술 연산자 : + - * / %
쉼표 연산자 : ,
조건 연산자 : ? :
증감 연산자 : ++ --
캐스트 연산자 : ( 형 명 )
소속 연산자 : . -> :: .* ->*
메모리 연산자 : new delete
**요약: 연산자는 피연산자의 수에 따라서 일항, 이항, 삼항 연산자로 구분하며 연산자의 기능에 따라서 논리, 대입, 관계, 비트, 산순 연산자 등으로 구분합니다.
3.7.2. 연산자의 종류와 기능
3.7.2.1. 산술연산자 + - * / %
산술연산자는 사칙연산을 하는 연산자이므로 일반적인 수학공식에서 사용하는 것과 별 다를 바가 없습니다. 다만 컴퓨터 글판에 곱하기(×)기호나 나누기( )기호가 없기 때문에 곱하기기호로 *를 사용하고 나누기기호로 /를 사용한다는 점이 다릅니다.
그리고 특이한 연산자로 나머지 연산자가 있습니다. 나머지 연산자는 왼쪽의 값을 오른쪽의 값으로 나눈 나머지를 표시하는 연산자입니다. 산술연산자는 주소 정수형이나 실수형 등의 숫자를 계산할 때 사용하지만 문자형 등을 계산할 때도 자주 사용합니다.
보기
연산식
결과
n=5+3
8
n=5-3
2
n=5*3
15
n=5/3
1.66666 (n이 실수형일 때. 만약 n이 정수형이라면 1이 나옵니다)
n=5%3
2 (5를 3으로 나누면 나머지는 2가 남습니다)
나머지 연산자 %는 float, double에서는 사용하지 않습니다. 다시 말해서 연산결과는 언제나 정수형으로 나온다는 이야기로 char, int,long 등에서만 사용이 가능한 연산자입니다.
한 가지 알아둘 점은 나누기연산자를 통해서 정수형끼리 나눗셈을 하면 그 결과도 정수형이 된다는 점입니다. 즉 5/2=2.5이지만 5와 2가 둘 다 정수형상수라면 5/2=2로 나온다는 사실입니다. 그러나 피연산자중 어느 하나라도 double 형이라면 다른 하나의 자료형에 상관 없이 double형으로 자동 변환됩니다. 따라서 5.0/2=2.5로 나옵니다.
3.7.2.2. 대입연산자 = += -= *= /= %=
연산자의 오른쪽 피연산자의 내용을 연산자 왼쪽의 피연산자에 대입시키는 연산자입니다. 주로 왼쪽의 피연산자는 각종 변수나, 배열요소, 구조체 멤버, 포인터의 대상체 등입니다. = 기호는 오른쪽의 것을 왼쪽에 대입하라는 연산자입니다. 그리고 +=는 왼쪽의 피연산자와 값에 오른쪽의 피연산자 값을 더해서 다시 왼쪽의 피연산자에 대입하라는 뜻입니다. -=는 왼쪽의 피연산자와 값에서 오른쪽의 피연산자 값을 뺀 값을 다시 왼쪽의 피연산자에 대입하라는 뜻입니다.
보기
int n=0;
n=3; // n이라는 변수에 3을 대입하라는 뜻입니다.
n+=4 // n이 3이라는 값을 가지고 있다고 할 경우 원래 n의 값인 3에 오른쪽의
4를 더한 수인 7을 n에 대입합니다. 그래서 이 연산을 마치면 n은 7이
됩니다.
n-=2 // 만약 지금 n이 7이라는 값을 가지고 있다고 하면 n-2, 즉 7-2를 한 값을 다시
n에 대입합니다. 그러므로 이 연산을 마치면 원래 7이던 n에는 5가
대입됩니다.
마찬가지로 *=는 왼쪽의 값에 오른쪽의 값을 곱한 뒤에 다시 왼쪽의 피연산자에 대입하라는 것이고, /=는 왼쪽의 값을 오른쪽의 값으로 나눈 뒤에 다시 왼쪽의 값에 대입하라는 뜻입니다. %=는 왼쪽의 값을 오른쪽의 값으로 나눈 나머지를 다시 왼쪽의 값에 대입하라는 뜻입니다.
그러니까 +=와 -=는 다음과 같이 왼쪽의 명령문을 좀더 간단하게 표현한 것에 불과합니다.
보기
일반적인 명령문을 사용할 때
대입연산자를 사용할 때
n=n+4
n+=4
n=n-4
n-=4
n=n*4
n*=4
n=n/4
n/=4
n=n%4
n%=4
3.7.2.3. 부호 연산자 + -
이것은 연산자라고 말하기 어려운 연산자입니다. 잘 알다시피 + 기호를 붙이면 양수가 되고, - 기호를 붙이면 음수가 되기 때문입니다. 즉 +와 - 연산자는 어떤 값의 부호를 바꿀 때 사용하는 연산자입니다. 3에 -를 붙이면 -3이 되는 것이죠.
3.7.2.4. 증감연산자 ++ --
단항연산자로 피연산자의 값을 하나씩, 즉 1씩 증가시키거나 감소시키는 일을 합니다. ++는 하나씩 증가를 시키고 --는 하나씩 감소를 시킵니다. 그러니까 n=5라고 할 때 n++은 n의 값을 하나 증가시켜주므로 n=n+1과 같습니다. 즉 n은 6이 되는 겁니다.
그런데 이 연산자는 피연산자의 왼쪽에 붙냐 오른쪽에 붙냐에 따라서 결과가 조금 차이납니다.
++n // n의 값을 먼저 1만큼 증가시키고 다른 연산을 합니다.
n++ // 현재의 값을 사용한 후에 다른 연산을 합니다.
둘의 차이를 확연하게 이해되지 않습니까? 다음의 보기를 보면 차이를 알 수 있을 겁니다.
보기
형태
연산형식
차이점
전위형
int n=1, i=2;
n=++i*3;
i=i+1을 먼저 하고 n=i*3을 합니다.
즉 먼저 i를 3으로 만든 후에 n=3*3을 하므로 n에는 9가 대입됩니다.
후위형
int n=1, i=2;
n=i++*3;
n=i*3을 먼저 연산하고 i=i+1을 합니다.
즉 n=2*3을 하므로 n에는 6이 대입됩니다. 그리고 그 연산이 끝난 후에 i는 3이 됩니다.
이런 차이가 있기 때문에 증감연산자가 수식에 쓰지 않고 단독으로 쓸 경우에는 후위형을 쓰도록 해야 합니다.
그리고 주의할 점은 한 변수가 한 수식에 두 번 이상 나타날 때는 절대로 이 변수에 증감연산자를 사용하지 않도록 해야 합니다. 또한 하나의 함수에 매개변수 즉 인수로 같은 변수가 두 번 나타날 때도 증감연산자를 사용하지 않아야 합니다.
즉 printf() 함수에 n이라는 변수를 인수로 두 번 이상 사용할 때는 증감연산자를 사용하지 않아야 합니다. 그 까닭은 인수의 사용순위가 명확하지 않기 때문입니다. 예를 들면 printf("%d %d",n*3,n++)과 같은 사용법은 피해야 하며, n*3-n++ 과 같은 명령문도 사용을 피해야 합니다.
3.7.2.5. 관계연산자 < <= > >= == !=
관계연산자는 이항연산자로 왼쪽의 피연산자와 오른쪽의 피연산자의 순위나 크기를 비교할 때 사용합니다. < <= > >= == != 등이 사용되는데, 이중에서도 ==과 !=는 상등연산자라고 따로 부릅니다.
피연산자는 숫자를 사용할 수도 있지만 특별한 수식(즉 명령문)을 사용할 수도 있습니다. 연산 결과는 정수형으로 0 또는 1을 돌려줍니다.
연산을 할 때는 가능한 양쪽의 피연산자 자료형이 같도록 만들어야 합니다. 자료형이 다를 경우에는 캐스트연산자를 이용해서 양쪽의 자료형을 일치시켜준 뒤에 연산을 하기 바랍니다.
보기
관계연산자
기능
a[b ([ 기호는 < 기호임)
a의 값이 b의 값보다 작습니다
a<=b
a의 값이 b의 값보다 작거나 같습니다.
a>b
a의 값이 b의 값보다 큽니다.
a>=b
a의 값이 b의 값보다 크거나 같습니다.
a==b
a의 값이 b의 값과 같습니다.
a>!b
a의 값이 b의 값과 다릅니다.
관계연산자는 주로 어떤 조건을 주고 연산을 하도록 할 때 많이 사용합니다. 다음과 같은 파일을 만들어 실행해보기 바랍니다.
// s08.cpp
#include
#include
void main(void)
{
int n, m;
n=10;
m=11;
if (n
else cout[["n이 m보다 작지 않습니다.같거나 큽니다. \n";
}
**그림: s08.cpp의 소스파일 내용
위의 보기는 n이 m보다 작을 경우에는 "n이 m보다 작은 수입니다."를 화면에 보여주고 그렇지 않을 경우에는 "n이 m보다 작지 않습니다.(같거나 큽니다)"를 화면에 출력하라는 프로그램입니다. 예제 프로그램에서는 n이 m보다 작으므로 "n이 m보다 작은 수입니다."를 화면에 보여줍니다.
**그림: s08.exe를 실행시킨 결과
3.7.2.6. 논리연산자 ! && ||
논리연산자는 논리식을 이용해서 프로그램을 짜야할 때 많이 사용합니다. 예를 들어서 '성이 김씨이고, 주소가 서울에 사는 사람'을 찾아야 할 경우, 먼저 성이 김씨인 사람을 찾고 또한 서울에 사는 사람을 찾아서 두 조건을 만족할 경우에만 이를 화면에 출력해야 합니다. 이때 '~이고'에 해당하는 것이 논리연산자입니다. '~이고'에 해당하는 개념은 'and'입니다.
'만약 a가 10보다 작고 b가 5보다 작다면 화면에 a와 b를 출력하라'고 명령을 내린다고 합시다. 이를 일반적인 표현식으로 나타내면 조건을 거는 부분을 'if a<10 and b<5'로 표현할 수 있습니다. 이때 and에 해당하는 일을 하는 연산자가 논리연산자입니다. C++언어에서는 &&가 그 기능을 합니다.
보기
논리 연산자
하는 일
&&
논리곱(AND)
!!
논리합(OR)
!
논리부정(NOT)
논리곱은 '~이고'에 해당하는 것입니다. 즉 '주소는 서울이고 나이는 30살 이하인 사람'에서 '~이고'에 해당하는 연산자입니다. 논리합은 '~이거나'에 해당하는 연산자입니다. 즉 '주소가 서울이거나 나이가 30살 이하인 사람'을 찾을 때 '~이거나'에 해당하는 연산자입니다. 논리부정은 '~이 아니고'에 해당합니다.
&& 연산자는 왼쪽의 값이 거짓(0), ||는 좌변의 값이 참(1)일 경우에는 오른쪽의 값을 따져보지 않습니다. 예를 들어서 'if a<10 && b<5'의 문장에서 a가 이미 10보다 크다면, 오른쪽의 문장은 검사할 필요가 없는 것입니다. 'a가 10보다 작고'라고 했는데 이미 a가 10보다 크면 오른쪽 값이 참인지 거짓인지 판별할 필요가 없어지는 것입니다. 이와 달리 만약 'a가 10보다 작거나 b가 5보다 작거나'라는 문장이 있다고 합시다. 만약 a가 10보다 작다면 오른쪽의 조건을 판별해야 할 필요가 없습니다. 둘 중의 하나만 만족하면 참인데, 이미 왼쪽이 참이므로 오른쪽이 참일 필요가 없어진 셈입니다.
3.7.2.7. 조건 연산자 ?:
조건연산자는 독특하게 피연산자를 3개씩 취하는 삼항 연산자입니다. 피연산자는 임의의 산술형 데이터나 수식이 허용되지만, 통상 첫번째 인수는 논리식을 사용하고, 두번째와 세번째 인수는 동일한 자료형을 사용합니다. 만약 동일한 자료형이 아니라면 동일한 자료형으로 변환시켜서 해주어야 합니다.
조건연산자는 왼쪽의 논리식을 평가해서 참이면 두번째 인수를 선택하고, 거짓이면 세번째의 인수를 선택한다는 연산자입니다.
보기
if (a>b) n=a;
else n=b;
보기의 문장은 만약 a가 b보다 크면 n에 a의 값을 대입하고, 아니면(a가 b보다 작거나 같으면) n에 b의 값을 대입하라는 뜻입니다. 이것을 조건연산자로 표현하면 다음과 같습니다.
보기
n=(a>b)?a:b;
그러니까 a가 b보다 클 경우에는 a를 선택했으므로 다음 연산으로 n=a 라는 연산을 하는 것입니다. 이처럼 조건연산자를 이용하면 프로그램이 좀더 간결해집니다.
3.7.2.8. 쉼표 연산자 ,
쉼표연산자는 이항연산자로 두 개 이상의 자료나 수식을 구별하고자 할 때 사용하는 연산자입니다. 그래서 이 연산자는 주로 for 순환문의 루프 제어 변수가 두개 이상일 때나 두 개 이상의 대입식 또는 자료를 한 줄에 쓰고 싶을 때 사용합니다.
보기
n=1;
m=n+1;
보기의 문장을 한 줄에 쓰싶다면 다음과 같이 쓰면 됩니다.
보기
m=(n=1, n+1)
이렇게 하면 먼저 n=1이라는 수식을 연산합니다. 그리고 n+1을 계산한 다음에 m에 대입합니다.
3.7.2.9. 비트 연산자 & | ^ [[ ]] ~
비트연산자는 이진수, 즉 비트 단위로 연산을 하는 독특한 연산자입니다. 때문에 일반적인 자료를 다룰 때는 별로 사용하지 않습니다. 그러나 게임을 제작하거나 글꼴을 제작하는 편집기 프로그램 등을 만들 때는 비트연산자를 많이 사용합니다. 피연산자로는 주로 문자형이나 정수형 자료를 많이 사용합니다. 전문 프로그래머가 아니면 거의 사용할 필요가 없는 연산자이기에 길게 설명하지 않고 간단하게 기능만 설명하겠습니다.
~ 보수연산자
보수연산자라고 말하는 연산자로 각 비트를 반대로 바꾸는 일을 합니다. 즉 1은 0으로 0은 1로 바꿉니다. 예컨대 어떤 문자가 있다고 합시다. 이때 이 문자를 표현하기 위해서는 1바이트를 사용할 것으므로 8비트를 사용하고 있을 겁니다. 이 문자형 자료의 각 비트가 '00011111'과 같다고 합시다. 이 자료에 보수연산자를 붙여서 ~(00011111)라고 하면, 연산결과 이 자료는 11100000으로 바뀝니다. 즉 '~(00011111)==11100000'이 되는 것입니다.
| 비트 OR 연산자
이항연산자로 둘 중 하나가 참이면 참(1)입니다. 즉 두 개를 결합해서 둘 중 하나가 1(참)이면 1(참)으로 바꿉니다. 그러므로 (11100000) | (00011111) = (11111111)이 됩니다. '(10000000) | (00000001)'이라는 연산을 했다면 10000001을 연산결과로 돌려줍니다. 옆으로 보니까 잘 이해안되므로 위아래로 보는 것이 좋겠습니다.
보기
10000000
| 00000001
결과: 10000001
첫번째 비트끼리 비교해보니 둘 중의 하나가 1(참)이라서 연산결과 1이 되었습니다. 나머지는 둘 다 0이라서 0이 되었고, 마지막 8번째 비트에서 역시 1이 있어서 1이 되었습니다.
& 비트 AND
비트 OR와는 달리 둘 중 하나가 거짓(0)이면 거짓으로 만들어줍니다. 그러므로 (11100000) | (00011111) = (00000000)이 됩니다. '(10000000) | (00000001)' 역시 00000000이 됩니다. 그러나 '(10000001) | (10000000)'이라면 두 자료의 첫번째 비트가 모두 참(1)이므로 10000000을 연산결과로 돌려줍니다.
여기에서 다시 한 번 말씀드리면 컴퓨터는 0이라는 숫자를 거짓으로 1이라는 숫자를 참으로 알고 있다는 점입니다.
^ 비트 XOR 연산자
이항연산자로 두 개의 자료형의 비트를 비교해서 같으면 거짓(0)을 돌려주는 연산자입니다.
이들 연산자도 독특하지만 좀더 독특한 연산자로 이동연산자(Shift operator)가 있습니다. 이들 연산자는 주어진 자료의 비트 순서를 좌우로 밀어내는 기능을 수행합니다. 그래서 이 연산자는 주의해서 사용해야 합니다. 잘못하다가는 음수가 양수로 바뀔 수 있기 때문입니다.
]] 오른쪽으로 밀기 연산자
]] 연산자는 C언어에서는 비트 연산자로 사용되었습니다. 현재의 비트를 원하는 비트만큼 오른쪽 방향으로 밀어줍니다. 예를 들어서 00000011이라는 자료를 ]]를 이용해서 한 자리씩 밀면 00000001이 됩니다. 이때 왼쪽의 피연산자가 부호 없는 자료이면 밀려나면서 생기는 왼쪽 빈자리는 0으로 채워지고, 부호가 있는 자료형이면 최상위비트를 복사해서 채웁니다. 그러므로 부호를 유지합니다.
C++에서는 ]]의 기능이 오버로드되었습니다. 다시 말해서 좀더 기능이 추가되었습니다. 그래서 표준입출력객체로부터 자료를 입력받아서 오른쪽으로 보내주는 기능을 합니다.
[[ 왼쪽으로 밀기 연산자
[[ 연산자 역시 C언어에서는 비트 연산자로 사용되었습니다. 현재의 비트를 원하는 비트만큼 왼쪽 방향으로 밀어줍니다. 예를 들어서 00000011이라는 자료를 [[를 이용해서 한 자리씩 밀면 00000110이 됩니다. 왼쪽으로 밀면서 생기는 오른쪽의 공백은 0으로 채워집니다.
[[ 연산자 역시 C++에서는 기능이 오버로드되었습니다. 그래서 표준입출력객체로부터 자료를 입력받아서 오른쪽으로 보내주는 기능을 합니다.
이미 그동안의 예제를 통해서 ]] 연산자와 [[ 연산자의 사용법을 익혔기 때문에 더 이상의 설명은 드리지 않겠습니다.
3.7.2.10. 캐스트 연산자 ()
캐스트연산자는 자료형을 바꾸는 연산자입니다. 사용법은 간단해서 원하는 자료 앞에 둥근꺾쇠를 치고, 그 안에 원하는 자료형을 써주면 됩니다.
보기
(char)n
(unsigned char)n
(int)c
예를 들어서 어떤 변수를 정수형으로 사용하다가 어느 순간에 실수형으로 써야할 필요가 있다고 할 경우에 캐스트연산자를 이용해서 자료형을 바꿀 수 있습니다.
보기
int n=5, m=2;
printf("%f ", (float)n/m);
printf("%n ", n/m);
위의 예문과 같이 하면 %f에 2.5라는 소수점으로 답이 나올 겁니다. 그러나 n의 자료형을 캐스트연산자로 변환하지 않고 n/m을 한다면 2가 나옵니다. 그래서 캐스트 연산자는 매우 유용하게 사용할 수 있는 연산자입니다.
3.7.2.11. sizeof 연산자
피연산자의 전체 바이트 크기를 알아낼 수 있는 연산자입니다. 변수라는 그 변수의 자료형에 해당하는 크기를 돌려주겠지만, 배열이라면 배열의 크기를 돌려줍니다. 반환값은 정수입니다.
사용형식
sizeof 수식
sizeof (형명)
3.7.2.12. 번지 연산자 &
번지 연산자는 피연산자로 변수를 사용해야 햅니다. 번지연산자는 변수의 번지를 구해서 돌려주는 연산자이기 때문입니다. 때문에 번지연산자 &는 상수에 쓸 수 없으며, 이 연산자가 붙은 상태에서는 변수에 새로운 값을 대입할 수 없습니다. 예를 들어서 &n=9라고 쓰면 에러가 나는 겁니다. 포인터를 설명할 때 다시 나오므로 지금은 번지를 가리키는 연산자로만 알고 계시면 됩니다.
3.7.2.13. 간접 연산자 *
곱하기 연산자인 *과는 다른 연산자입니다. 곱하기 연산자와 혼동하기 쉬운데 간접연산자로 사용할 때는 흔히 포인터라고도 말합니다. 포인터는 어떤 번지에 저장된 내용을 표시하는 연산자입니다. 번지에 대해서는 앞서 설명드린 적이 있습니다. 만약 10-3번지에 홍길동과 흥부 두 사람이 살고 있다면 두 사람의 이름을 출력해줄 겁니다. 좀더 자세한 내용은 나중에 포인터를 설명할 때 말씀드리겠으니 지금은 *를 간접연산자라고 부른다는 사실만 기억해주시면 됩니다.