[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 | x = 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가 유효한지"를 묻죠. 짧기도 합니다. 짧은 형태는 실수를 예방할 수 있습니다.
댓글
댓글 쓰기