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처리
}
'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 |