기타연산자

Jaemyeong Lee·2024년 8월 1일
0

FastCampusC++

목록 보기
14/78

1. 삼항 연산자 (Ternary Operator)

삼항 연산자는 조건에 따라 두 개의 표현식 중 하나를 선택합니다. 형식은 다음과 같습니다:

(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;

2. sizeof 연산자

sizeof 연산자는 데이터형 또는 변수의 크기를 바이트 단위로 반환합니다.

예제

int num = 0;
cout << sizeof(num) << endl;    // 변수 num의 크기
cout << sizeof num << endl;     // 변수 num의 크기 (괄호 생략 가능)
cout << sizeof(int) << endl;    // 데이터형 int의 크기

3. 범위 지정 연산자 (Scope Resolution Operator)

:: 연산자는 범위를 지정할 때 사용됩니다. 주로 전역 변수와 지역 변수를 구분하거나 클래스 멤버에 접근할 때 사용됩니다.

예제

std::cout << 1 << std::endl;        // std 네임스페이스의 cout 사용
std::ios_base::floatfield;          // ios_base 클래스의 floatfield 멤버에 접근

4. 암시적 형변환 (Implicit Type Conversion)

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; // 암시적 형변환의 위험, 오버플로우 발생

5. 명시적 형변환 (Explicit Type Conversion)

명시적 형변환은 프로그래머가 형변환을 명시적으로 지정하는 방법입니다. 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;
    }
}
profile
李家네_공부방

0개의 댓글