삼항 연산자는 조건에 따라 두 개의 표현식 중 하나를 선택합니다. 형식은 다음과 같습니다:
(condition) ? (expression_if_true) : (expression_if_false);
(condition)
이 참(true
)이면 expression_if_true
가 실행되고,(condition)
이 거짓(false
)이면 expression_if_false
가 실행됩니다.int num = -10;
int abs = num < 0 ? -num : num; // num이 0보다 작으면 -num, 그렇지 않으면 num
num = 0;
(num == 0 ? (cout << "num == 0") : (cout << "num != 0")) << endl; // num이 0이면 "num == 0", 아니면 "num != 0"
cout << (num == 0 ? "num == 0" : "num != 0") << endl;
sizeof
연산자는 데이터형 또는 변수의 크기를 바이트 단위로 반환합니다.
int num = 0;
cout << sizeof(num) << endl; // 변수 num의 크기
cout << sizeof num << endl; // 변수 num의 크기 (괄호 생략 가능)
cout << sizeof(int) << endl; // 데이터형 int의 크기
::
연산자는 범위를 지정할 때 사용됩니다. 주로 전역 변수와 지역 변수를 구분하거나 클래스 멤버에 접근할 때 사용됩니다.
std::cout << 1 << std::endl; // std 네임스페이스의 cout 사용
std::ios_base::floatfield; // ios_base 클래스의 floatfield 멤버에 접근
C++에서는 서로 다른 데이터형 간의 암시적 형변환이 가능합니다. 그러나 이로 인해 데이터 손실이나 오버플로우가 발생할 수 있습니다.
unsigned int uintNum = 1;
int intNum = 1u;
float fNum = 1.1f;
uintNum = intNum; // int에서 unsigned int로 암시적 형변환
intNum = uintNum; // unsigned int에서 int로 암시적 형변환
fNum = intNum; // int에서 float로 암시적 형변환
short sNum = numeric_limits<int>::max();
cout << sNum << endl; // 암시적 형변환의 위험, 오버플로우 발생
명시적 형변환은 프로그래머가 형변환을 명시적으로 지정하는 방법입니다. C++에서는 C 스타일과 C++ 스타일의 형변환 연산자가 있습니다.
cout << 'a' << endl;
cout << (int)'a' << endl; // C 스타일 형변환
cout << int('a') << endl; // 함수 스타일 형변환 (C++ 스타일)
C++ 스타일의 형변환 연산자들은 다음과 같습니다:
static_cast
const_cast
dynamic_cast
reinterpret_cast
이들은 각각 특정 상황에서 안전하고 명확한 형변환을 제공하기 위해 사용됩니다. 간단한 예제를 통해 C++ 스타일의 형변환을 설명하겠습니다.
int a = 10;
double b = static_cast<double>(a); // int를 double로 변환
const int c = 20;
int* d = const_cast<int*>(&c); // const int를 int로 변환 (const 제거)
class Base { virtual void func() {} };
class Derived : public Base {};
Base* base = new Derived;
Derived* derived = dynamic_cast<Derived*>(base); // Base를 Derived로 변환
int* e = reinterpret_cast<int*>(0x12345678); // 주소값을 int*로 변환 (단순 형변환)
위에서 설명한 연산자를 종합적으로 사용하는 예제입니다.
#include <iostream>
#include <limits>
using namespace std;
int main()
{
{
// 삼항 연산자
int num = -10;
int abs = num < 0 ? -num : num;
cout << "Absolute value: " << abs << endl;
num = 0;
(num == 0 ? (cout << "num == 0") : (cout << "num != 0")) << endl;
cout << (num == 0 ? "num == 0" : "num != 0") << endl;
}
{
// sizeof 연산자
int num = 0;
cout << "Size of num: " << sizeof(num) << " bytes" << endl;
cout << "Size of int: " << sizeof(int) << " bytes" << endl;
}
{
// 범위 지정 연산자
std::cout << "Using std namespace for cout" << std::endl;
}
{
// 암시적 형변환
unsigned int uintNum = 1;
int intNum = 1u;
float fNum = 1.1f;
uintNum = intNum;
intNum = uintNum;
fNum = intNum;
short sNum = numeric_limits<int>::max();
cout << "Short after implicit conversion: " << sNum << endl;
// 명시적 형변환
cout << 'a' << endl;
cout << (int)'a' << endl; // C 스타일 형변환
cout << int('a') << endl; // 함수 스타일 형변환 (C++ 스타일)
int a = 10;
double b = static_cast<double>(a); // int를 double로 변환
cout << "Static cast of int to double: " << b << endl;
const int c = 20;
int* d = const_cast<int*>(&c); // const int를 int로 변환 (const 제거)
cout << "Const cast: " << *d << endl;
class Base { virtual void func() {} };
class Derived : public Base {};
Base* base = new Derived;
Derived* derived = dynamic_cast<Derived*>(base); // Base를 Derived로 변환
if (derived) cout << "Dynamic cast successful" << endl;
int* e = reinterpret_cast<int*>(0x12345678); // 주소값을 int*로 변환 (단순 형변환)
cout << "Reinterpret cast: " << e << endl;
}
}