본문 바로가기
밑바닥부터 시작하는 게임 개발/C++

[밑바닥 C++] 3. HP 등 값을 조작하는 연산자, 변하지 않는 값 상수

by KK1 2021. 7. 11.

 

연산자 (Operator)

철권 HP Bar, 승리 카운터

변수를 선언하는 방법을 통해 HP 등 다양한 정보들을 만들었으니 이번에는 그 값을 어떻게 조작할지 알아보겠습니다.

 

산술 연산자 (이항 연산자)

덧샘, 뺄샘, 곱샘, 나눗샘 그리고 나머지 연산으로 값에 변화를 주는 연산자입니다.

+ (더하기)

cout << 5 + 3 << endl; // 8, 둘을 더한 결과 출력

int a = 10, int b = 20;
cout << a + b << endl; // 30, 둘을 더한 결과 출력

위 코드에서는 각각 숫자와 변수를 더하기 연산하여 8과 30이 출력됩니다. 

 

- (빼기)

cout << a - b << endl; // -10, 둘을 뺀 결과 출력

 

위 코드에서는 a와 b를 빼서 -10이 출력됩니다.

 

* (곱하기)

cout << a * b << endl; // 200, 둘을 곱한 결과를 출력

위 코드에서는 a와 b를 곱해서 200이 출력됩니다.

 

/ (나누기)

cout << 5 / 3 << endl; // 1, 5와 3이 int라 결과도 int를 출력
cout << 5.f / 3.f << endl; 1.66667, 5와 3을 나눈 값에 float이라 소숫점도 출력

 

위 코드에서는 5와 3을 나누어 각각 int의 경우 1, float의 경우 1.66667을 출력합니다.

 

% (나머지 연산)

cout << 5 % 3 << endl; // 2, 5와 3을 나눈 나머지 2를 출력

 

나누기, 나머지 연산을 할 때 주의할 점

cout << 5 / 0 << endl;      // X
cout << 5.f / 0.f << endl;  // X
cout << 5 % 0 << endl;      // X

int 0 나눗샘, 나머지 연산 에러

어떤 int 값을 0으로 나누는 행위를 할 경우 프로그램에서 에러를 발생합니다! 

그냥 위와 같이 코드로 작성할 경우컴파일러가 에러를 발생시켜줍니다.

하지만 프로그램 실행중 특정 값이 0이 되어 나누는 경우 2번째 화면처럼 프로그램이 중단되고 에러가 발생합니다. 

이러한 경우도 발생할 수 있으니 잘 알아둡니다.


= (대입 연산자, 할당 연산자)

변수 초기화때 한번 본 값을 대입 또는 할당하는 연산자입니다.

int a = 10; // a에 10을 할당
int b;
b = 10 // b에 10을 대입

대입 연산자는 다음과 같이 사용할 수 있습니다.

int a, b, c;
a = b = c = 10; // 10 → c → b → a 순으로 대입.

대입 연산은 위와 같이 연속으로 이어질 때 우측(오른쪽)에서 부터 좌측(왼쪽)으로 진행됩니다. 

c에 10이 대입되고 b에 c가 대입, a에 b가 대입됩니다.


관계 연산자

두 피연산자의 관계를 따져서 참 또는 거짓 논리를 반환하는 연산자입니다.

( ) 괄호로 감싸줘야 제대로 된 값을 받아서 출력할 수 있다.

몇 가지 예제만 보겠습니다.

<, >

int a = 10, b = 20;
cout << (a < b) << endl; // 1, true
cout << (a > b) << endl; // 0, false

a < b: a가 b보다 작은가?

a > b: a가 b보다 큰가?

 

<=, >=

int a = 10, b = 20, c = 20;
cout << (a <= b) << endl; // 1, true
cout << (b >= c) << endl; // 1, true

a <= b: a가 b보다 작거나 같은가?

b >= c: b가 c보다 크거나 같은가?

 

==, !=

int a = 10, b = 20, c = 20;
cout << (a == b) << endl; // 0, false
cout << (b != c) << endl; // 0, false

a == b: a가 b와 같은가?

b != c: b가 c와 다른가?


논리 연산자

피연산자를 논리(참 or 거짓)로 받아 최종 관계를 참 또는 거짓을 반환하는 연산자입니다.

&&, ||, !

int a = 10, b = 20, c = 20;
cout << (a < b && b == c) << endl; // 1, true
cout << (a != b || a == c) << endl; // 0, false
cout << !(a == b) << end; // 1, true

a < b && b == c: a는 b보다 작으면서 b는 c와 같은가? (a and b)

논리들이 동시에 만족하는가? 앞의 결과 확인, 이때 만족하지 않느면 바로 false를 반환 후 연산이 끝납니다.

 

a != b || a == c: a는 b와 다르거나 또는  a는 c와 같은가? (a or b)

논리 중 하나라도 만족하는가? 앞의 결과 확인, 만족하는 경우 바로 true 반환 후 연산이 끝납니다.

 

!(a == b): a와 b는 같은가?의 반대

논리의 반대되는 값을 반환합니다.


sizeof 연산자

피연산자의 메모리 크기를 Byte 단위로 반환하는 연산자입니다.

int a = 0;
cout << sizeof(a) << endl; // 4
cout << sizeof(short) << endl; // 2

변수 a의 크기 4를 출력하는 코드와 short 타입의 크기 2를 출력하는 코드입니다.

어떤 피연산자(변수, 타입, 객체 등)메모리 크기를 알고 싶을 때 활용할 수 있습니다.


상수 (Constant)

변수는 프로그램 실행중 데이터 변할 수 있는 가변적인 데이터였습니다.

상수한번 저장된 데이터는 변하지 않는 고정적인 데이터입니다.

 

지금까지 작성한 코드에서 상수

cout << "Hello World" << endl;
cout << 5 + 3 << endl;

위와 같이 코드에 특정값들을 작성한 코드는 리터럴 상수라는 임시 상수가 생성된다.

상수 = ("Hello World", 5, 3)

 

리터럴 상수(literal)

리터럴 상수는 이름이 없는 메모리 공간임시로 생성되는 상수입니다.

int Num = 10 + 20;

위 코드에서 메모리가 어떤 식으로 흐르는지 보겠습니다.

a = 10 + 20의 메모리 흐름

위 그림에서 프로그램이 실행되면 사용하는 메모리 영역 중 2가지인 Stack 영역Data 영역의 표기를 해두었습니다.

자세한 내용은 뒤에서 다룰 예정이며 우선 그러한 공간이 있다는 것만 알아두고 진행하겠습니다.

  1. 10과 20의 값을 가진 리터럴 상수 Data 영역의 특정 공간에 생성합니다.
  2. Data 영역의 특정 공간에 10과 20을 더한 30의 값을 가진 리터럴 상수를 생성합니다.
  3. Data 영역에서 Stack 영역num이라고 할당된 메모리 공간에 대입해줍니다.
  4. 임시로 사용한 Data 영역의 메모리는 해제됩니다.

상수화 변수 (const 키워드)

const 키워드를 사용하여 변수를 고정된 값인 상수로 선언할 수 있다.

const int Num = 10; // 상수는 선언과 동시에 초기화
Num = 20 // X, Error 발생!

const 키워드를 사용한 상수화 변수선언과 동시에 초기화해야한다. 초기화 하지 않으면 에러가 발생한다.

상수화 변수는 값을 변경할 수 없기 때문에 2번째줄 코드와 같이 변경을 시도하면 에러가 발생한다.


혼자 해보기

혼자 해보기 1 결과

1) 위 화면과 같이 입력을 받고 출력을 하는 프로그램을 작성하세요.

전투력은 Hp, Atk, Def를 모두 더한 후 평균을 낸 값입니다.


 

이전편

2021.07.10 - [밑바닥부터 시작하는 게임 개발/C++] - [밑바닥 C++] 2. HP 표기 등을 위한 변수

 

다음편

2021.07.17 - [밑바닥부터 시작하는 게임 개발/C++] - [밑바닥 C++] 4. 컴퓨터 친화적인 비트 연산자 + 축약, 증감 연산자

 

반응형

댓글