변수의 규칙
C2374 'MonsterSpeed': 재정의. 여러 번 초기화했습니다.
실제로 함수내부의 변수는 함수의 이름과 함께 해석되기 때문에 실제 눈에 보이는 이름보다 길다.
main함수의 MonsterSpeed변수 : main::MonsterSpeed
MoveMonster함수의 MonsterSpeed변수 : MoveMonster::MonsterSpeed
함수가 실행되면 스택영역에 함수를 실행하기 위한 메모리를 먼저 만든다. 해당 함수의 내부 변수 + a만큼의 크기로 만들어진다.
main함수를 실행하고 main함수 메모리 생김 > main함수의 MonsterSpeed변수 메모리 생김 > MoveMonster함수 실행되고 메모리 생김 > MoveMonster함수의 MonsterSpeed변수 메모리 생김

(스택영역은 메모리를 아래에서 위로 사용한다.)
int main()
{
}
함수에서 중괄호{ }를 range 혹은 scope라고 하는데 이 구문이 시작되면 함수의 메모리를 만든다는 의미, 영역이 끝나면 해당 함수의 메모리 지워짐
함수가 실행되면 함수는 램에 자신이 실행될 지역메모리를 만들고 그 안에 변수를 둔다.
이렇게 함수 안에 만들어진 변수를 지역변수라고 한다.
전역 : 함수 밖, 그 어떤 영역({ })에도 속하지 않는 영역
지역 : 함수 내에 속하는 영역
(클래스 내부 영역도 따로 있음)
지역변수에는 한계가 있다. 어떤 지역에서 만든 변수는 다른 지역에서 사용이 불가능하다.
그래서 메모리 처리가 다른 방식인 변수가 필요하고 그것을 전역변수라고 하며 데이터영역에 만들어진다.
프로세스가 종료되기 전까지 파괴되지 않는다.
스택이 만들어지기 전에 전역변수가 만들어지기 때문에 어떤 지역에서도 사용이 가능한 것이다.
우리반 코딩 스탠다드
- 전역변수와 지역변수 이름 무조건 다르게 하기. ex) GlobalA, LocalA
- 무조건 초기값을 설정한다.
int main()
{
//이름 없는 메모리 영역
{
int Value = 0;
}
Value = 20; // X
}
int main()
{
//이름 없는 메모리 영역
int Value = 0;
{
Value = 20; // O
}
}
코드는 기본적으로 위에서부터 아래로 읽는다.
오른쪽에서 왼쪽으로 읽는다. 예외 - 괄호( )
int Left = 3;
자료형 붙어있으면 변수 선언
사용할 때는 자료형 생략
변수를 사용해서 특정한 결과를 리턴하는 것을 연산자라고 한다.
연산자는 무조건 같은 자료형끼리 구성된다.
ex) 정수 + 정수 = 정수
더 정확히는 한 쪽으로 통일된다.
연산자 종류
- 산술 연산자
- 비교/관계 연산자
- 관계 연산자
- 논리 연산자
- 복합 할당 연산자
- 멤버와 포인터 연산자(포인터 배우고 나서 배울 예정)
- 기타 연산자
확인하고 싶은 단계나 어떤 상태에서의 값을 확인하고 싶을 때,
자신이 확인하고 싶은 코드 라인 한 줄 아래에 F9를 누르면 중단점이 걸린다.
VS로 코드를 실행시키고 확인을 위한 단축키들이 있다.
F5 : 중단점이 있을 때까지 진행
F10 : 누를 때마다 한 줄씩 진행, 다른 함수의 스택으로 들어가지 않는다.
F11 : 누를 때마다 한 줄씩 진행, 다른 함수가 있다면 함수의 내부스택까지 들어간다.

노란색 화살표는 실행 대기 중인 코드를 가리킨다.
한 줄씩 실행시켜보면 프로세스의 시작점을 알게된다.
(값을 확인하는 습관은 기본이다.)
Left = Right;
Right의 메모리를 Left의 메모리로 복사한다.
오른쪽에서 왼쪽으로 대입
int Left = 3;
int Right = 5;
int Result = 0;
Result = Left + Right; // 8
Result = Left - Right; // -2
Result = Left * Right; // 15
Result = Left / Right; // 0
Result = Left % Right; // 3
연산자는 함수와 동일하게 행동을 하고 결과를 준다.
Result = Left == Right; // Left와 Right가 같은지, 같으면 1 다르면 0을 리턴 (Result는 int)
// 1과 0은 각각 true와 false로 형변환됨
// bool => 1 바이트 논리형, 논리형 상수 true와 false
// int => 4 바이트 정수형
bool bResult;
bResult = Left != Right; // true
bResult = Left > Right; // false
bResult = Left < Right; // true
bResult = Left >= Right; // false
bResult = Left <= Right; // true
참과 거짓의 개념은 명확해야한다.
참과 거짓을 정확하게 이해하려면 비트단위까지 값을 볼 수 있어야 한다.
모든 값은 논리형이 될 수 있다. false가 될 수 있는 정수는 0밖에 없다.
이유는 C++에서 참과 거짓이 아래와 같이 표현되기 때문이다.
참 : 모든 비트 중 단 1개라도 1이 있으면 참
거짓 : 모든 비트가 0이어야 거짓
int 4바이트 정수형
00000000 00000000 00000000 00000000
bResult = !Left; // false, 오른쪽 메모리가 true라면 false, false라면 true를 리턴
bResult = Left && Right; // true, 양쪽 메모리가 참이어야 참을 리턴
bResult = false && Right; // false
bResult = Left && false; // false
bResult = Left || Right; // true, 양쪽 메모리중 1개라고 참이 있으면 참을 리턴
bResult = false || Right; // true
bResult = Left || false; // true
Left = 0b00000000000000000000000000000000; // 0, 0b : 2진수로 표현하겠다는 뜻
Left = 0b00000000000000000000000000000010; // 2
Left = 0b00000000000000000000000000000011; // 3
Left = ~0b00000000000000000000000000000000; // 0b111111....111, 그게 -1
// 가장 앞 비트가 1이면 음수
// 0에 -0은 없음
// 2의 보수법이라는 방법 사용
// 맨 앞의 비트가 1이되서 음수가 되면 양수표현식에서 뒤집어서 봄
// -2를 만들고 싶으면 -1인 상태에서 0인 곳의 값을 음수로 더하기로 했다.....
8421
Left = 0b11111111111111111111111111111111; // -1
Left = 0b11111111111111111111111111111110; // -2
Left = 0b11111111111111111111111111111101; // -3
Left = 0b11111111111111111111111111110111; // -9
// a & b (비트 and)
// && : 왼쪽과 오른쪽 둘다 true여야 true
Left = 0b00000000000000000000000000000011;
Right = 0b00000000000000000000000000000001;
Result = Left & Right; // 0b00000000000000000000000000000001 (1)
// a | b (비트 or)
// || 왼쪽 오른쪽 하나라도 true 있으면 true
Left = 0b00000000000000000000000000000011;
Right = 0b00000000000000000000000000000001;
Result = Left | Right; // 0b00000000000000000000000000000011 (3)
// 배타적 논리합 XOR
// 1. 양쪽의 비트가 같으면 0
// (다르면 1)
Left = 0b00000000000000000000000000000011;
Right = 0b00000000000000000000000000000011;
Result = Left ^ Right; // 0b00000000000000000000000000000000 (0)
Left = 0b00000000000000000000000000000011;
Right = 0b00000000000000000000000000000001;
Result = Left ^ Right; // 0b00000000000000000000000000000010 (2)
// 2번째 비트 1인지 알고싶을 때
Left = 0b00000000000000000000000000000011;
Right = 0b00000000000000000000000000000010; // 확인할 곳 1
Result = Left & Right; // 결과 1 -> 2번째 비트 1임을 알 수 O
// a << b 비트 시프트
// 왼쪽으로 b칸 밀기
Left = 0b00000000000000000000000000000001;
Result = Left << 1; // 0b00000000000000000000000000000010;
Result = Left << 31; // 음수 최댓값을 알 수 있음
// a >> b 는 하드웨어에 따라 달라지기 때문에 잘 안 씀(CPU 칩셋마다 다르다고 함)
비트단위 연산자를 사용해서 양수 최댓값을 만드세요.
" 0b0111111111111111111111111111111111111111 "를 만들면 됨
일단 -1에서 맨 앞에 부호비트만 0으로 만들면 됨
int Value = 0b11111111111111111111111111111111; // -1 == ~0
int Num = 0b10000000000000000000000000000000;
//int Num = 1 << 31; //위랑 똑같음
int Result = Value ^ Num;
int Value = ~0;
Value = Value ^ (1 << 31);