{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[C++] The C++ Programming Language: 6. Types and Declarations (1) - Booleans

6. Types and Declarations



6.1 The ISO C++ Standard

(생략)


6.2 Types

  다음을 고려해봅시다:

1
= y+f(2);
cs

  C++ 프로그램에서 이것이 유효하려면, 이름 x, y, f는 사전에 선언되어 있어야 합니다. 곧, 프로그래머는 x, y, f의 자료형을 명세해야 하죠.

  모든 이름(식별자)은 자료형이 연결되어 있습니다. 해당 이름에 대해 어떠한 연산들을 적용할 수 있는지, 어떠한 연산들로 번역되는지 정의되어 있는 것이죠.

(생략)


6.2.1 Fundamental Types

  C++은 다음과 같은 기본 자료형이 존재합니다:

  • 불리언 자료형 (bool)
  • 문자 자료형 (char, wchar_t 등)
  • 정수 자료형 (int, long long 등)
  • 부동소수점 자료형 (double, long double 등)
  • void

  이러한 자료형으로부터, declarator operator를 이용해 생성할 수 있는 자료형이 있습니다:

  • 포인터 자료형 (int* 등)
  • 배열 자료형 (char[] 등)
  • 참조형 (double&, vecotr<int>&& 등)

  추가적으로, 사용자는 새롭게 자료형을 정의할 수 있습니다.

  • 자료구조와 클래스
  • 열거형 (enum, enum class)

  불리언, 문자, 정수 자료형을 integral type이라고 말합니다. integral과 부동소수점 자료형을 arithmetic type이라고 말합니다. 열거형과 클래스를 user-defined type이라고 말합니다. 기본 자료형, 포인터, 참조형을 합쳐 built-in type이라고 말합니다.

(생략)


6.2.2 Booleans

  불리언은 참 혹은 거짓의 값을 갖는 자료형입니다. 논리적인 값을 표현하는데 사용됩니다:

1
2
3
4
5
void f(int a, int b)
{
    bool b1 {a==b};
    // ...
}
cs

  만약 a와 b가 같은 값을 가졌다면, b1은 참이 됩니다. 물론 그렇지 않다면 거짓이 되겠죠.

  bool은 흔히 특정한 조건을 확인하는 함수의 결과로 활용됩니다. 다음을 참고하세요:

1
2
3
bool is_open(File∗);

bool greater(int a, int b) { return a>b; }
cs

  정의에 의해, true는 정수로 1의 값을 가지며 false는 0의 값을 가집니다. 반대로, 정수 역시 bool 값으로 변환될 수 있습니다: 0이 아닌 정수는 true로, 0은 false로 변환됩니다. 다음을 참고하세요:

1
2
3
4
5
bool b1 = 7; // 7!=0, so b becomes true
bool b2 {7}; // error : narrowing (§2.2.2, §10.5)

int i1 = true; // i1 becomes 1
int i2 {true}; // i2 becomes 1
cs

  만약 여러분들이 {} 초기자를 사용한다면 narrowing(형식이 변환되는 것-옮긴 이)을 예방할 수 있습니다. 만약 여전히 int를 bool로 변환하고 싶다면, 명시적으로 표기할 수 있습니다:

1
2
3
4
5
void f(int i)
{
    bool b {i!=0};
    // ...
};
cs

  산술 및 논리 수식에서 bool은 int로 변환됩니다. 정수 산술 및 논리 연산은 변한된 값으로 수행됩니다. 만약 결과가 다시 bool로 변환되어야 한다면, 0은 false로, 0이 아닌 값은 true로 변환되겠죠:

1
2
3
4
5
6
bool a = true;
bool b = true;

bool x = a+b; // a+b is 2, so x becomes true
bool y = a||b; // a||b is 1, so y becomes true ("||" means "or")
bool z = a−b; // a-b is 0, so z becomes false
cs

  포인터는 묵시적으로 bool로 변환될 수 있습니다. null이 아닌 포인터는 true로, nullptr 값을 지닌 포인터는 false로 변환됩니다:

1
2
3
4
5
6
7
8
9
void g(int∗ p)
{
    bool b = p; // narrows to true or false
    bool b2 {p!=nullptr}; // explicit test against nullptr
    if (p) { // equivalent to p!=nullptr
        // ...
    }
}
cs

  if (p!=nullptr) 대신 if (p)를 활용했는데, 이것이 훨씬 더 직관적이기 때문입니다. "p가 유효한지"를 묻죠. 짧기도 합니다. 짧은 형태는 실수를 예방할 수 있습니다.

댓글

이 블로그의 인기 게시물

[코딩의탑] 4층: 툰 쉐이딩

[코딩의탑] 3층: 바다 렌더링

[코딩의탑] 5층: 포탈(Portal), 더 나아가기