दो प्रकारों के साथ एक चर की घोषणा: "इंट चार"


81

मैं एक C ++ शुरुआती हूं, और मैं पढ़ रहा हूं Bjarne Stroustrup के प्रोग्रामिंग: सिद्धांत और अभ्यास C ++ का उपयोग कर

पर अनुभाग में 3.9.2 असुरक्षित रूपांतरण , लेखक ने उल्लेख किया है

जब इनिशलाइज़र एक पूर्णांक शाब्दिक होता है, तो कंपाइलर वास्तविक मान की जाँच कर सकता है और उन मूल्यों को स्वीकार कर सकता है जो संकीर्ण नहीं होते हैं:

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

मैं इस घोषणा से हैरान हूं। यह दो प्रकार ( intऔर char) का उपयोग करता है । मैंने जावा और स्विफ्ट में इस तरह की घोषणा पहले कभी नहीं देखी थी (दो भाषाएँ जिनसे मैं अपेक्षाकृत परिचित हूँ)। क्या यह एक टाइपो या एक वैध C ++ सिंटैक्स है?


2
आपके पास पुस्तक का कौन सा संस्करण और मुद्रण है? क्या आपने पुस्तक के इरेटा की तलाश की है?
कुछ प्रोग्रामर ने

2
तो आप किस संस्करण को पढ़ रहे हैं? मुझे यकीन है कि बज्ने इस गलती के बारे में जानना चाहेंगे।
स्टोरीटेलर - अनसलैंडर मोनिका

1
3.9.2 असुरक्षित रूपांतरण असुरक्षित रूपांतरण से हमारा तात्पर्य यह है कि एक मूल्य को अन्य प्रकार के मूल्य में बदल दिया जा सकता है जो मूल मूल्य के बराबर नहीं है। उदाहरण: int i = 20000; char c = i; इस तरह के रूपांतरणों को 'संकीर्णता' रूपांतरण कहा जाता है। डबल टू इंट, चार या बूल इंट टू चार या बूल चार से बूल
मारीचसाना

15
float charएक और उपयोगी प्रकार, विशेष रूप से स्विमिंग पूल में है। कुछ बियर के लिए धारक के साथ आते हैं।
यक - एडम नेवरामोंट

1
क्या यह एक टाइपो या एक वैध C ++ सिंटैक्स है? यह कोशिश करो (ठीक है, ठीक है, नहीं यह मान्य नहीं है)।
पॉल सैंडर्स

जवाबों:


95

यह किताब में गलती है। यह कथित सीलिंग रूपांतरण के बिना भी मान्य C ++ घोषणा नहीं है।

बजरन स्ट्रॉस्ट्रुप के पृष्ठ (4 वें प्रिंटिंग और पहले) पर किसी भी इरेटा में इसका उल्लेख नहीं किया गया है , जो कि अजीब है। यह एक स्पष्ट पर्याप्त गलती है। मुझे लगता है कि यह //errorकुछ लोगों के साथ टिप्पणी की घोषणा में गलती की सूचना है।


पुस्तक में संभवतः इच्छित कोड उदाहरण क्या था?
पेड्रो ए

8
@ Hamsterrific char b1 {1000};(क्योंकि वह टिप्पणी में उल्लिखित त्रुटि को भड़काएगा )। मुझे लगता है कि उस दिन बज़्ने की टाइपिंग उंगलियां थक गई थीं।
पॉल सैंडर्स

1
@PaulSanders थक गए? उसने intवहाँ एक अतिरिक्त टाइप किया ! :-)
सिंह

1
@ सिंहहिनसार लोल। ठीक है, बहुत ज्यादा कॉफी तो :) या शायद उसके पास एक हकलाना है :)
पॉल सैंडर्स

हाँ: उंगलियों थक गया। यह उस उदाहरण से कट-एन-पेस्ट त्रुटि की तरह दिखता है जो इससे पहले था। उस पूर्व उदाहरण में, वह दो पंक्तियाँ देता है: int a {1000}; // ठीक [\ n] चार बी {एक} // त्रुटि: इंट -> चार संकीर्ण हो सकता है [\ n] और उसे लगता है कि कट-एन-पेस्ट किया गया है कि अगले एक के लिए उदाहरण और "इंट" भाग को हटाने से चूक गया : int char b1 {1000}; // त्रुटि: संकुचित (8-बिट वर्णों को संभालने) [\ n] चार b2 {48}; // ओके [\ n]
एल स्कॉट जॉनसन

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 के अलावा (देखें @ उत्तर), केवल उपलब्ध प्रकारों में से एक को स्टोर करने का C ++ तरीका है std::variant(टाइप-सुरक्षित यूनियन):

#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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.