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


81

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

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

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

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

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


2
책의 어떤 판과 인쇄본이 있습니까? 책의 정오표를 찾으셨습니까?
일부 프로그래머 친구

2
그래서 어떤 버전을 읽고 있습니까? 나는 Bjarne이이 실수에 대해 알고 싶어 할 것이라고 확신합니다.
이야기꾼 - Unslander 모니카

1
3.9.2 안전하지 않은 변환 안전하지 않은 변환이란 값이 원래 값과 같지 않은 다른 유형의 값으로 암시 적으로 변환 될 수 있음을 의미합니다. 예 : int i = 20000; char c = i; 이러한 변환을 '좁히는'변환이라고합니다. 부울에 문자 또는 부울 문자에 int를 char 또는 부울 INT에 두 번
Marichyasana

15
float char특히 수영장에서, 또 다른 유용한 유형입니다. 일부는 맥주 홀더와 함께 제공됩니다.
Yakk-Adam Nevraumont

1
오타 또는 유효한 C ++ 구문입니까? 시도해보세요 (OK, OK, 아니요 유효하지 않습니다).
Paul Sanders

답변:


95

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

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


책에서 의도 한 코드 예제는 무엇 이었을까요?
Pedro A

8
@Hamsterrific char b1 {1000};(주석에 언급 된 오류를 유발할 수 있기 때문입니다). 그날 Bjarne의 타이핑 손가락이 피곤한 것 같습니다.
Paul Sanders

1
@PaulSanders 피곤해? 그는 int거기 에 여분을 입력했습니다 ! :-)
Leo Heinsaar

1
@ LeoHeinsaar Lol. OK, 너무 많은 커피는 :) 아니면 그는 더듬 :가
폴 샌더스

예 : 손가락이 피곤합니다. 이전 예제의 잘라 내기 및 붙여 넣기 오류처럼 보입니다. 이전 예제에서 그는 두 줄을 제공합니다. int a {1000}; // OK [\ n] char b {a} // error : int-> char이 좁아 질 수 있으며 [\ n] 다음 예제를 위해 해당 예제를 잘라내어 붙여넣고 "int"부분을 삭제하지 못한 것 같습니다. : int char b1 {1000}; // 오류 : 축소 (8 비트 문자 가정) [\ n] char b2 {48}; // OK [\ n]
L. Scott Johnson

24

책이 잘못되었습니다.

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

b1둘 이상의 유형 으로 선언하려고하는데 말이 안됩니다.


10

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

union {
    int i;
    char c;
} var;

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

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


6

이것은 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.