관리자 글쓰기
C++ 식과 연산자
2022. 2. 25. 12:02 - pingu-s

식과 연산자

 

 

컴퓨터는 여러 개의 문장의 처리를 계산함으로써 수행한다. 그래서 이번에는 최초에 식(expression)에 대해서 학습하도록 한다. [식]이란

4 + 5

이며, C++에서는 이와 같은 식을 코드 내에서 사용한다.

C++의 [식]의 대부분은 연산자(연산하는 것 : operator)오퍼랜드(연산의 대상 : operand)를 조합해서 작성되어 있다. 예를 들면, [4 + 5]인 경우는 [+]가 연산자, [4]와 [5]가 오퍼랜드로 된다.

그리고 식의 평가라는 것이 있다. 예를 들면, 4 + 5가 평가되면 9가 된다. 평가된 후의 9를 [식의 값]이라고 부른다.

 

 

식의 값 출력

 

예제) 식의 값의 출력

"4 + 5", "3 * 4"와 같은 식을 출력하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	cout << "4 + 5는 " << 4 + 5 << "이다.\n";
	//여기서는 [4+5]라는 식을 기술했다. 실행 결과를 보면 [9]가 출력되어 있다.
	cout << "3 * 4는 " << 3 * 4 << "이다.\n";
	/*다음의 문도 똑같이 [3*4]라는 식을 기술한다. 이것은 [3X4]라는 계산을 의미한다.
	C++에서는 계산을 하기 위해 *라는 기호를 사용하는 것으로 되어 있다.
	이와 같이 화면에 출력되는 값은 식이 평가된 후의 값으로 되어 있는 것을 알 수 있다.*/
	return 0;
}

 

여러 가지 연산

 

식 내에 연산의 대상(오퍼랜드)으로 되는 것은 4와 5라는 일정의 수뿐만이 아니다. 다음의 코드를 입력해서 교정해 보도록 한다.

 

예제) 변수의 값 사용

변수를 오퍼랜드로 사용한 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int num1 = 3;
	int num2 = 4;
	int sum = num1 + num2; //①num1 + num2의 값을 sum에 대입한다.

	cout << "변수 num1의 값은 " << num1 << "이다.\n";
	cout << "변수 num2의 값은 " << num2 << "이다.\n";
	cout << "변수 num1 + num2의 값은 " << sum << "이다.\n";

	num1 = num1 + 1; //②num1 + 1의 값을 num1에 대입한다.

	cout << "변수 num1의 값에 1을 더하면 " << num1 << "이다.\n";

	return 0;
}

위 코드의 ①과 ②의 부분에서 변수를 오퍼랜드로 사용한 식을 기술하고 있다. 이와 같이 일정의 값뿐만 아니고 변수도 오퍼랜드로 할 수 있다. 여기서 =의 기호는 [같다]라는 의미가 아니고 [값을 대입한다]라는 기능을 가지고 있다. 그래서 이와 같은 기술이 가능하다.

 

 

키보드로부터 입력한 값의 덧셈

 

예제) 덧셈하기

정수형의 두 변수의 값을 키보드로부터 입력받아 덧셈한 결과를 출력하는 코드를 작성하시오.

#include <iostream>
using namespace std;

int main()
{
	int num1, num2;

	cout << "정수 1을 입력하세요=> ";
	cin >> num1;

	cout << "정수 2를 입력하세요=> ";
	cin >> num2;

	cout << "덧셈의 결과는 " << num1 + num2 << "이다.\n";

	return 0;
}

코드를 실행하고 여러 가지 정수를 입력하면 입력된 수가 덧셈되어 출력되는 것이다. 이와 같이 변수와 연산자를 사용해서 코드를 기술하면 코드를 실행했을 때의 상황에 대응한 코드를 작성할 수 있다.

 

식은 4 + 5와 3 * 4와 같은 것뿐만 아니고,

num1 ... 변수
5 ... 상수

등도 그것만으로 [식]이라고 할 수 있다.

즉, [5]라는 식의 값은 5이다. 또 [num1]이라는 식의 값은 변수 num1에 5가 저장되어 있을 때는 5, 10이 저장되어 있을 때는 10으로 된다.

이와 같은 작은 식은 다른 식과 조합시켜 큰 식을 만든다. 예를 들면, [num1 + 5]라는 식의 값은 식 num1의 값과 식 5의 값을 +로 연산한 결과로 된다.

 

 

연산자의 종류

 

C++ 에는 + 연산자 외에도 많은 연산자가 있다.

 

연산자의 종류

기호 이름 오퍼랜드의 수 기호 이름 오퍼랜드의 수
+ 덧셈 2 <= 작거나 같다 2
- 뺄셈 2 == 등가 2
* 곱셈 2 != 비등가 2
/ 나눗셈 2 ! 논리 부정 1
% 나머지 2 && 논리적 2
+ 단항+ 1 || 논리합 2
- 단항- 1 * 간접 참조 1
~ 보수 1 , 순차 2
& 비트 논리적 2 () 함수 호출 2
| 비트 논리합 2 [] 배열 첨자 2
^ 비트 배타적 논리합 2 :: 영역 해결 2
<< 왼쪽 시프트 2 . 멤버 참조(도트) 2
>> 오른쪽 시프트 2 멤버 간접 참조 2
++ 증가 1 ?  :: 조건 3
-- 감소 1 new 동적 메모리 할당 1
> 보다 크다 2 delete 동적 메모리 해제 1
>= 크거나 같다 2 sizeof 사이즈 1
< 보다 작다 2      

연산자에는 오퍼랜드를 1개 취하는 것, 2개 취하는 것 등이 있다. 오퍼랜드가 1개인 연산자를 단항 연산자(unary  operator)라고 한다. 또한 오퍼랜드가 2개인 연산자는 2항 연산자, 오퍼랜드가 3개인 연산자는 3항 연산자라고 한다.

예를 들면, 다음과 같이 뺄셈을 수행하는 연산자는 오퍼랜드를 2개 취하는 연산자이다.

10-2

한편, [음의 수]를 나타내기 위해 사용하는 연산자는 오퍼랜드를 1개 취하는 연산자이다.

-10

 

예제) 여러 연산자의 이용

정수형의 두 변수의 값을 초기화하고 산술 연산과, 나머지 연산을 수행하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int num1 = 10;
	int num2 = 5;

	cout << "num1과 num2에 여러 가지 연산을 수행한다.\n";
	cout << "num1 + num2는 " << num1 + num2 << "이다.\n";
	cout << "num1 - num2는 " << num1 - num2 << "이다.\n";
	cout << "num1 * num2는 " << num1 * num2 << "이다.\n";
	cout << "num1 / num2는 " << num1 / num2 << "이다.\n";
	cout << "num1 % num2는 " << num1 % num2 << "이다.\n";

	return 0;
}

% 연산자는 [나머지의 수를 구하는] 연산자이다. 이 코드에서는 [10 / 5 =2 나머지 0]이므로 0이 출력된다.

/ 연산자는 0에 의한 나눗셈을 할 수는 없다.

 

증가·감소 연산자

 

자주 사용하는 연산자 중에서 [++]라는 연산자가 있다.

이 연산자는 다음과 같이 사용한다.

a++;

 

++ 연산자는 증가 연산자(increment operator)라고 한다. [증가]란 (변수의) 값을 1 증가시키는 것이다. 즉, 다음 코드에서는 변수 a의 값을 1 증가시키므로 상기의 코드와 같이 처리를 수행하는 것이다.

a = a + 1;

 

한편, -를 2개 연속한 [--]는 감소 연산자(decrement operator)라고 한다. 감소는 변수의 값을 1 감소시키는 연산자이다.

b--;

이 감소 연산자는 다음의 코드와 같은 의미가 된다.

b = b - 1; //값을 1감소시키는 연산은 이와 같이 쓴다.

 

증가·감소의 전치와 후치

 

증가·감소 연산자는 오퍼랜드의 앞과 뒤의 어느 쪽이라도 기술할 수 있다. 즉, 변수 a를 증가하는 경우는

a++
++a

라는 2개의 사용법이 있다. 상기와 같이 오퍼랜드 뒤에 두는 경우를 후치 증가 연산자, 앞에 두는 경우를 전치 증가 연산자라고 한다. 변수를 1 증가한다는 목적뿐이면 어느 쪽의 사용이라도 같은 것이다.

그러나 이 표기의 차이에 따라 코드의 실행 결과가 다른 경우도 있다. 다음의 코드를 기술해 보도록 한다.

 

예제) 전치와 후치 증가 연산자

a++, 또는 ++a의 전치 연산자와 후치 연산자를 수행하는 코드를 작성하고, 수행 결과를 확인해 보기 바란다.

#include <iostream>
using namespace std;

int main()
{
	int a = 0;
	int b = 0;

	b = a++; //①여기서는 후치 증가 연산자를 수행한다. a값을 b에 배정하고 a를 1증가한다.
	cout << "a는 대입 후에 증가한 것이고 b의 값은 " << b << "이다.\n";
	cout << "b = a++;을 수행한 후의 a의 값은 " << a << "이다.\n";
	
	a = 0; b = 0; //a와 b 변수의 값을 다시 0으로 대입한다.
	b = ++a; //전치 증가 연산자를 수행한다. 여기서는 ①과 다른 실행 결과를 출력한다.
	//전치 증가 연산자는 먼저 a를 1증가하고 그 값을 b에 배정한다.
	cout << "a는 대입 전에 증가한 것이고 b의 값은 " << b << "이다.\n";
	cout << "b = ++a;을 수행한 후의 a의 값은 " << a << "이다.\n";

	return 0;
}

 

처음에 사용한 후치 증가 연산자에서는

변수 b에 a의 값을 대입하고 나서 → a의 값을 1증가시킨다

라는 처리를 수행하지만, 전치 증가 연산자는

a의 값을 1증가하고 나서 → 변수 b에 a의 값을 대입한다

라는 역의 처리가 수행된다. 이 때문에 출력되는 변수 b의 값이 다르다. 여기서는 코드를 생략하지만 감소 연산자도 같은 성질을 가지고 있다.

 

대입 연산자

 

대입 연산자(assignment operator)는 지금까지 변수에 값을 대입할 때에 사용해온 [=]이라는 기호이다. 이 연산자는 통상의 =의 의미인 [같다(equal)]라는 의미가 아니다.

대입 연산자는

왼쪽(좌변)의 변수에 오른쪽(우변)의 값을 대입한다

라는 기능을 가진 연산자이다. 대입 연산자는 =뿐만 아니고 =과 다른 연산자를 조합시킨 것도 있다.

 

대입 연산자

기호 이름 기호 이름
+= 덧셈 대입 &= 논리적 대입
-= 뺄셈 대입 ^= 배타적 논리합 대입
*= 곱셈 대입 |= 논리합 대입
/= 나눗셈 대입 <<= 왼쪽 시프트
%= 나머지 대입 >>= 오른쪽 시프트

이들 대입 연산자는 다른 연산자와 대입을 동시에 수행하기 위한 복합적인 연산자로 되어 있다. 예를 들면, +=연산자를 살펴보도록 한다.

 

a += b; //a + b의 값을 a에 대입한다.

+=연산자는 변수 a의 값에 변수 b의 값을 덧셈하여 그 값을 변수 a에 대입한다라는 연산을 수행한다. +연산자와 =연산자의 기능을 합친 기능을 가지고 있다.

이와 같이 사칙 연산자 등의 연산자(●로 해둔다)와 합친 복합적인 대입 연산자를 사용한 문이다.

a ●= b;

은 통상의 대입 연산자 =를 사용해서

a = a ● b;

로 쓸 수 있다.

즉, 다음 2개의 문장은 어느 쪽도 [변수 a의 값과 b의 값을 더해서 변수 a에 대입한다]라는 처리를 나타내고 있다.

a += b;
a = a + b;

또한 복합적인 연산자 등과 같이 +와 =사이에 공백을 두어 기술해서는 안된다.

 

예제) 복합 대입 연산자

정수형의 두 변수를 키보드로부터 입력받아 '+='와 같은 복합 대입 연산자를 사용하여 덧셈하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

int main()
{
	int sum = 0;
	int num = 0;

	cout << "1번째의 정수를 입력하세요=> ";
	cin >> num;
	sum += num;
	/*복합 대입 연산자를 사용한다. 이 예는 입력한 수치로 덧셈한 결과를
	+=연산자를 사용해서 순서대로 변수 sum에 저장한다. +=연산자를 사용함으로써
	간단하게 코드를 쓸 수 있다.*/
	cout << "2번째의 정수를 입력하세요=> ";
	cin >> num;
	sum += num;
	cout << "3번째의 정수를 입력하세요=> ";
	cin >> num;
	sum += num;

	cout << "3개의 수의 합계는 " << sum << "이다.\n";

	return 0;
}

 

sizeof 연산자

 

시프트 연산자

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 제어문  (0) 2022.03.08
C++ 식과 연산자2  (0) 2022.03.06
C++ 변수2  (0) 2022.02.20
C++ 변수  (0) 2022.02.17
C++ 프로그래밍의 기본3  (0) 2022.02.17