C++

6. Operators (연산자)

Kelvin의 게임개발 2023. 12. 12. 23:26
728x90
반응형

1. Assignment Operator (대입 연산자)

 
C++의 연산자는 대부분 binary operator이다 (2개의 피 연산자로 연산하는 연산자), unary operator는 1개의 피연산자로 연산하는 연산자이다, ternary operator는 3개의 피연산자로 연산하는 연산자이다
 
대입연산자(assignment)는 객체에 값을 대입해 값을 수정/대입하는 연산자이다 (값에는 literal값뿐 아니라 객체(변수), 긴 수학식도 가능하다)
 
대입연산자는 =으로 사용한다 (equal의 의미가 아님), 오른쪽의 값을 왼쪽의 변수로 대입한다는 의미이다 (타입이 맞지 않으면 컴파일에러 발생)
(값을 변수의 메모리 위치에 저장하는 개념이다)

const변수는 대입연산자로 값을 대입할 수 없다 (const(상수)는 값이 변할 수 없기 떄문 (rodata))
 

int main()
{
	int num1{ 10 }; //대입연산이 아닌 초기화이다
	int num2{ 20 };

	num1 = 100; //대입 연산자로 num1에 100을 대입함
	num1 = num2 = 1000; //이와 같이 여러개의 대입 연산자로 같은 값을 여러변수에 대입할 수 있다
	num1 = "Kelvin"; //타입이 맞지 않기 때문에 컴파일에러 발생 (int <- string (X))
	100 = num1 //100과 같은 상수는 메모리 위치정보가 없다, lvalue가 아니기 때문에 컴파일 에러가 발생한다 (대입할 수 없음)

}

 
 

2. Arithmetic Operator (산술 연산자)

 
산술연산자(arithmetic)은 수학 연산에 사용되는 연산자이다

+는 덧셈, -는 뺄셈, *는 곱셈, /은 나눗셈, %는 나머지 연산이다 (+,-,*,/는 다양한 타입의 값으로 사용하지만 %는 정수타입만 사용한다)
 
0으로 나눗셈을 하면 크래시 발생
 
정수와 정수의 계산은 정수, 정수와 실수의 계산은 실수로 나온다
 
산술연산시 연산자 우선순위를 잘 생각해야 한다 (곱셈, 나눗셈이 덧셈 뺄셈보다 우선순위가 높다), ()를 통해 우선순위롤 조정할 수 있다
 

int main()
{
	int num1{ 200 };
	int num2{ 100 };
	
	//산술연산자 사용
	num1 + num2; //300
	num1 - num2; //100
	num1 * num2; //20000
	num1 / num2; //2
	num1 % num2; //0 (200 / 100의 나머지는 0)

	num1 = num1 * (100 + 20); //()를 이용하여 *보다 +의 우선순위가 더 높게 조정함

	cout << 5 / 10 << endl; //정수와 정수의 계산으로 값은 0
	cout << 5 / 10.f << endl; //정수와 실수의 계산으로 값은 0.5
    
   	num1 += 10; //num1 = num1 + 10과 같은 의미이다 다른 연산자도 사용이 가능하다 (복합 대입 연산자)
	//만약 a *= b + c; 이면 a = a * b + c;가 된다
}

 
 

3. Increment/Decrement Operator (증감연산자)

 
증감연산자(increment/decrement)는 값을 1만큼 증가,감소 시키는 연산자이다 (할당, 산술 둘다 포함되는 개념)
 
증감연산자는 ++, --로 1씩 증가, 1씩 감소시킬 수 있다 (정수, 실수, 포인터 등 다 가능)
 
증감연산자는 전위(prefix)/후위(postfix) 두가지 방법으로 사용할 수 있다 ex) ++num, num++
 
같은 라인에서 한 변수를 두 번 이상 증감연산하는건 좋지않다 (결과 예상이 힘들다)
 

int main()
{
	int counter{ 10 };
	int result{ 0 };

	counter++; //++로 인해 11로 증가
	++counter; //++로 인해 12로 증가
	//이 처럼 증감연산자 전위/후위를 단독으로 사용할 때는 같은 기능을 한다
	
   	//증감연산자를 다른 연산자와 사용할 때 전위/후위는 다른 기능을 한다
	result = ++counter; //증감연산자를 전위로 사용하면 해당 값이 사용되기 전에 증감연산을 처리한다 -> 13으로 증가된 상태로 result에 대입되게 된다 
	result = counter++; //증감연산자를 후위로 사용하면 해당 값이 사용되고나서 증감연산을 처리한다 -> 14로 증가되지 않은 상태로 result에 대입되고 14로 증가한다 
	
	result = ++counter + 10; //이것도 마찬가지로 counter가 먼저 증가되고 10이 더해고 result에 대입된다
}

 
 

4. Mixed Expression And Conversion (형 변환)

 
타입이 다른 피연산자들끼리의 연산을 하면 컴파일러가 자동으로 형변환을 시켜 연산을 하거나 불가능하면 컴파일 에러가 발생하게 된다

큰 타입(더 큰 값을 담을수 있는 타입 ex) long > int), 작은 타입(더 작은 값을 담을수 있는 타입) ex) float < double
 
작은 타입은 큰 타입으로 자동 형변환이 가능하다 (큰 타입은 작은 타입의 의미를 충족하지만 작은 타입이 큰 타입의 의미를 완전 충족한다는 보장이 없기 때문)
 
큰 타입에서 작은 타입도 자동 형변환이 되지만 데이터 손실이 있을 수 있다 ex) 100.8을 int로 변환하면 100이 된다
 
short, char 타입은 항상 int로 변환된다

컴파일러의 자동 형변환이 아닌 프로그래머가 직접 타입을 변환할 수 있다
 
직접 형변환은 static_cast<원하는 타입>(값);으로 할 수 있다, 값의 타입을 원하는 타입으로 변경한다 (modern c++ style, 컴파일 타임에 잘못된 캐스팅을 알 수 있다, casting한 부분을 쉽게 찾을 수 있다)
 
c-style 형변환은 (원하는 타입)값;으로 할 수 있다 이는 cast시 타입 체크를 해주지 않는다 (웬만하면 사용하지 말자)
 

int main()
{
	2 * 5.2; //컴파일러가 자동으로 작은 타입을 큰 타입으로 변환하여 연산한다 -> int인 2를 double인 2.0으로 변환 후 5.2와 곱해준다

	int num{ 0 };

	num = 100.2; //컴파일러가 자동으로 큰 타입을 작은 타입으로 변환하여 연산한다 -> double인 100.2를 int인 100으로 변환하여 num에 대입한다
	
	int amount{ 100 };
	int number{ 8 };

	double average{ 0.0 };

	average = static_cast<double>(amount) / number; //int타입 amount를 double로 cast한다 따라서 값은 12.5 실수가 나오게 된다
}

 
 

5. Relational Operator (비교 연산자)

 
비교연산자(relational)은 값을 비교하는 연산자이다 (크다, 작다, 같다 등)
 
같다는 ==, 다르다는 != 연산자를 사용하며 bool로 값을 return한다
 
실수는 근사값이기 때문에 비교연산자로 비교하는건 지양한다 
 

int main()
{
	bool result{ false };

	int num1{ 100 };
	int num2{ 200 };

	result = num1 == num2; //num1과 num2가 같은지 체크 -> false

	cout << std::boolalpha; //모든 bool값을 true, false로 나타내게 해준다

	cout << result << endl; //std::boolalpha로 false가 출력된다
	
	cout << std::noboolalpha; //모든 bool값을 1, 0으로 나타내게 해준다

	char char1{ 'a' };
	char char2{ 'b' };

	result = char1 != char2; //다른 타입으로도 사용이 가능하다
}

 
크다, 크거나 같다, 작다, 작거나 같다는 >, >=, <, <= 연산자를 사용한다
 

int main()
{
	int num1{ 100 };
	int num2{ 200 };

	num1 > num2; //false
	num1 >= num2; //false
	num1 < num2; //true
	num1 <= num2; //true
}

 
논리연산자(logical)은 논리식을 bool로 판단하는 연산자이다 (and, or, not)
 
not연산은 !, and연산은 &&, or연산은 ||로 사용한다
 
not연산은 식의 결과를 부정하는 연산이다 (true를 false로, false를 true로 만든다) ex) !true = false
 
and연산은 양쪽의 피연산자가 둘다 true면 true, 하나라도 false면 false로 만든다 ex) true && true = true, true && false = false;
 
or연산은 양쪽의 피연산자 중 하나라도 true면 true가 되며 둘다 false일때만 false로 만든다 eX) true || false = true, false || false = false;
 
위의 연산자들을 다양하게 결합하여 사용하여 코드를 구성한다
 
C++에서 먼저 결과를 알면 뒤의 연산은 하지 않는 Short-Circuit Evaluation이라는 시스템이 있다
ex) false && true && true 는 처음이 false이기 때문에 결과는 당연히 false가 된다 따라서 뒤의 true true는 판단하지 않고 결과를 반환한다
 

int main()
{
	int num1{ 1 };
	int num2{ 100 };

	bool bool1{ true };

	!bool1; //false

	num1 > 10 && num2 > 50; //false
	num1 < 10 && num2 > 50; //true

	num1 > 10 || num2 > 50; //true
	num1 > 10 || num2 > 100; //false

	num1 > 10 && num2 > 50 && true; //short-circuit evaluation으로 바로 false처리
}

 
 
 

728x90
반응형

'C++' 카테고리의 다른 글

8. Control Program Flow (2)  (113) 2023.12.21
7. Control Program Flow (1)  (89) 2023.12.20
5. Array And Vector  (202) 2023.12.09
4. Variables and Constants  (110) 2023.12.07
3. Structure of a C++ Program  (2) 2023.11.22