변수의 유효범위, 연산 우선순위, 타입 변환, 사칙연산 주의사항

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

변수의 유효범위

 

전역 변수
// int hp = 10;

스택

{ } 중괄호의 범위가 생존 범위

같은 이름 두 번 사용할 때 문제


 

연산 우선순위

 

짝수 여부

  • bool isEven = (hp % 2 == 0);
  • bool isEven = ((hp % 2) == 0);
  • 둘은 같다. 하지만 가독성이나 연산 우선순위를 걱정하지 않기 위해 아래 같은 형식으로 적는 습관을 들이자.  

 

짝수거나 3으로 나뉘는 값인지 확인

  • bool isEvenOrDivBy3 = (hp % 2 == 0 || hp % 3 == 0);
  • bool isEvenOrDivBy3 = ((hp % 2) == 0 || (hp % 3) == 0);
  • 둘은 같다. 하지만 가독성이나 연산 우선순위를 걱정하지 않기 위해 아래 같은 형식으로 적는 습관을 들이자. 

 

우선순위 연산자 설명 결합 방향
1 :: 범위 지정 연산자 -
2 ++ 후위 증가 연산자 왼쪽에서 오른쪽으로
  -- 후위 감소 연산자 왼쪽에서 오른쪽으로
  () 함수 호출 왼쪽에서 오른쪽으로
  [] 첨자 연산자 왼쪽에서 오른쪽으로
  . 멤버 연산자 왼쪽에서 오른쪽으로
  -> 멤버 접근 연산자 왼쪽에서 오른쪽으로
  typeid 타입 인식 왼쪽에서 오른쪽으로
  const_cast 상수 타입 변환 왼쪽에서 오른쪽으로
  dynamic_cast 동적 타입 변환 왼쪽에서 오른쪽으로
  reinterpret_cast 재해석 타입 변환 왼쪽에서 오른쪽으로
  static_cast 정적 타입 변환 왼쪽에서 오른쪽으로
3 ! 논리 NOT 연산자 오른쪽에서 왼쪽으로
  ~ 비트 NOT 연산자 오른쪽에서 왼쪽으로
  + 양의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
  - 음의 부호 (단항 연산자) 오른쪽에서 왼쪽으로
  ++ 전위 증가 연산자 오른쪽에서 왼쪽으로
  -- 전위 감소 연산자 오른쪽에서 왼쪽으로
  (타입) 타입 캐스트 연산자 오른쪽에서 왼쪽으로
  * 참조 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
  & 주소 연산자 (단항 연산자) 오른쪽에서 왼쪽으로
  sizeof 크기 연산자 오른쪽에서 왼쪽으로
  new 객체 생성 오른쪽에서 왼쪽으로
  delete 객체 제거 오른쪽에서 왼쪽으로
4 .* 멤버 포인터 연산자 왼쪽에서 오른쪽으로
  ->* 참조 멤버 포인터 연산자 왼쪽에서 오른쪽으로
5 * 곱셈 연산자 왼쪽에서 오른쪽으로
  / 나눗셈 연산자 왼쪽에서 오른쪽으로
  % 나머지 연산자 왼쪽에서 오른쪽으로
6 + 덧셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
  - 뺄셈 연산자 (이항 연산자) 왼쪽에서 오른쪽으로
7 << 비트 왼쪽 시프트 연산자 왼쪽에서 오른쪽으로
  >> 부호 비트를 확장하면서 비트 오른쪽 시프트 왼쪽에서 오른쪽으로
8 < 관계 연산자(보다 작은) 왼쪽에서 오른쪽으로
  <= 관계 연산자(보다 작거나 같은) 왼쪽에서 오른쪽으로
  > 관계 연산자(보다 큰) 왼쪽에서 오른쪽으로
  >= 관계 연산자(보다 크거나 같은) 왼쪽에서 오른쪽으로
9 == 관계 연산자(와 같은) 왼쪽에서 오른쪽으로
  != 관계 연산자(와 같지 않은) 왼쪽에서 오른쪽으로
10 & 비트 AND 연산자 왼쪽에서 오른쪽으로
11 ^ 비트 XOR 연산자 왼쪽에서 오른쪽으로
12 | 비트 OR 연산자 왼쪽에서 오른쪽으로
13 && 논리 AND 연산자 왼쪽에서 오른쪽으로
14 || 논리 OR 연산자 왼쪽에서 오른쪽으로
15 ? : 삼항 조건 연산자 오른쪽에서 왼쪽으로
16 = 대입 연산자 및 복합 대입 연산자
(=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=)
오른쪽에서 왼쪽으로
17 throw 예외 발생 왼쪽에서 오른쪽으로
18 , 쉼표 연산자 왼쪽에서 오른쪽으로

 


 

타입 변환

 

 int hp = 77777;
  
short hp2 = (short)hp;   //바구니 교체

int는 32bit(=4Byte), short는16bit(=2Byte)

short로 옮기면서 윗쪽 비트데이터가 짤린 상태로 저장된다. 위쪽 비트데이터가 분실된다. 

 

 


 

전체 코드

 

더보기
#include <iostream>
using namespace std;

// 1. 변수의 유효범위
// 전역 변수
// int hp = 10;

// 스택
// { } 중괄호의 범위가 생존 범위
// 같은 이름 두 번 사용할 때 문제

// 2) 연산 우선순위

// 짝수 여부
// bool isEven = ((hp % 2) == 0);

// 짝수거나 3으로 나뉘는 값인지 확인
// bool isEvenOrDivBy3 = ((hp % 2) == 0 || (hp % 3) == 0);

// 3) 타입 변환

// 4) 사칙 연산 관련


int main()
{
    {
    int hp = 10;
    cout << hp << endl;
    }

    int hp = 77777;
    cout << hp << endl;

    // 3) 타입변환
    // 바구니 교체
    short hp2 = (short)hp;  // 바구니 사이즈가 줄어들어 다 담을 수 없으면 윗쪽 비트 데이터가 짤린 상태로 저장된다. 큰 데이터에서 작은 데이터로 옮길 때는 유의해야 한다
    cout << hp2 << endl;
    
    float hp3 = (float)hp;  // 실수로 변환할 때 정밀도 차이가 있기 때문에 데이터 손실
    cout << hp3 << endl;
    
    unsigned int hp4 = (unsigned int)hp; // 비트 단위로 보면 똑같은데, 분석하는 방법이 달려진다.
    cout << hp4 << endl;

    // 곱셈
    // - 오버플로우
    // int * int = int  // 1241241 * 12414212414 // int 곱셈으로 int의 범위를 넘어서는 큰 값이 되는 경우가 종종 발생한다.
    // __int64 * int  // 값이 크면 __int64 를 넣는 방식으로 처리가 가능하다

    // 나눗셈
    // - 0 나누기 조심
    int maxHp1 = 0;
    // float ratio = hp / maxHp1;   // 이 경우 크러쉬가 난다 

    // 실수 관련
    int maxHp2 = 100000;
    float ratio2 = hp / maxHp2;   // 0.77777 정수 기준이기 때문에 값이 정수값 0으로 처리된다.
    cout << ratio2 << endl;    

    float maxHp3 = 100000; 
    float ratio3 = hp / maxHp3;  // 0.77777로 출력
    cout << ratio3 << endl;

}