Programing

두 가지 유형으로 변수 선언 : "int char"

lottogame 2020. 10. 8. 07:36
반응형

두 가지 유형으로 변수 선언 : "int char"


저는 C ++ 초보자이고 Bjarne Stroustrup의 Programming : Principles and Practice Using C ++을 읽고 있습니다.

3.9.2 안전하지 않은 변환 섹션에서 저자는

이니셜 라이저가 정수 리터럴 인 경우 컴파일러는 실제 값을 확인하고 축소를 의미하지 않는 값을 허용 할 수 있습니다.

int char b1 {1000};     // error: narrowing (assuming 8-bit chars)

이 선언에 의아해합니다. 두 가지 유형 ( intchar)을 사용합니다. 나는 이전에 자바와 스위프트 (내가 비교적 익숙한 두 언어)에서 그러한 선언을 본 적이 없다. 오타 또는 유효한 C ++ 구문입니까?


책의 실수입니다. 이것은 축소 변환이없는 경우에도 유효한 C ++ 선언이 아닙니다.

그러나 Bjarne Stroustrup의 페이지 (4 번째 인쇄 및 이전) 에있는 정오표에는 언급되어 있지 않지만 이상합니다. 분명한 실수입니다. //error소수의 사람들로 주석을 달았 기 때문에 선언 자체에서 실수를 알아 차릴 수 있다고 상상 합니다.


책이 잘못되었습니다.

토큰 시퀀스 int char b1{1000};가 의미 상 유효한 C ++가 아닙니다.

b1둘 이상의 유형 으로 선언하려고하는데 말이되지 않습니다.


그건 잘못 됐어. C / C ++에서는 공용체를 사용하여 다중 유형 선언을 수행 할 수 있습니다. 예 :

union {
    int i;
    char c;
} var;

var.i = 42;
/* OR */
var.c = ‘c’;

저장소는 동일하므로 .c 및 .i는 동일한 값에 대한 유형별 핸들입니다.


이것은 C / C ++ 구문에서 잘못되었습니다. unions (@Alex 답변 참조) 외에도 std::variant(type-safe union) 이라는 사용 가능한 유형 중 하나만 저장하는 C ++ 방법이 있습니다 .

#include <variant>
#include <string>

int main()
{
    std::variant<int, float> v, w;
    v = 12; // v contains int
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // same effect as the previous line
    w = v; // same effect as the previous line

//  std::get<double>(v); // error: no double in [int, float]
//  std::get<3>(v);      // error: valid index values are 0 and 1

    try {
      std::get<float>(w); // w contains int, not float: will throw
    }
    catch (std::bad_variant_access&) {}

    std::variant<std::string> v("abc"); // converting constructors work when unambiguous
    v = "def"; // converting assignment also works when unambiguous
}

참고 URL : https://stackoverflow.com/questions/51239649/declaring-a-variable-with-two-types-int-char

반응형