स्ट्रॉस्ट्रुप के उदाहरण में, "वापसी 1: 2" में बृहदान्त्र का क्या अर्थ है?


163

मैं एक बृहदान्त्र के एक विशेष उपयोग को नहीं समझता।

मुझे यह पुस्तक द सी ++ प्रोग्रामिंग लैंग्वेज द्वारा ब्रेज़न स्ट्रॉस्ट्रुप, 4 वें संस्करण, धारा 11.4.4 "कॉल एंड रिटर्न", पृष्ठ 297 में मिला:

void g(double y)
{
  [&]{ f(y); }                                               // return type is void
  auto z1 = [=](int x){ return x+y; }                        // return type is double
  auto z2 = [=,y]{ if (y) return 1; else return 2; }         // error: body too complicated
                                                             // for return type deduction
  auto z3 =[y]() { return 1 : 2; }                           // return type is int
  auto z4 = [=,y]()−>int { if (y) return 1; else return 2; } // OK: explicit return type
}

बयान में भ्रामक बृहदान्त्र लाइन 7 पर दिखाई देता है return 1 : 2। मुझे नहीं पता कि यह क्या हो सकता है। यह एक लेबल या टर्नरी ऑपरेटर नहीं है।

यह पहले सदस्य (और बिना ?) के बिना एक सशर्त टर्नरी ऑपरेटर की तरह लगता है , लेकिन उस स्थिति में मुझे समझ नहीं आता है कि यह बिना किसी शर्त के कैसे काम कर सकता है।


6
यह मेरे अंत (जीसीसी और क्लैंग) पर एक संकलन त्रुटि है। साथ ही उन सभी लाइनों को अर्धविराम की जरूरत है, लेकिन फिर भी एक त्रुटि है।
क्रूज़ जीन

216
मॉडरेटर नोट: कृपया इसे "टाइपो" प्रश्न के रूप में बंद करने के लिए वोट डालने से पहले बहुत सावधानी से सोचें। हां, समस्या एक टाइपो है, लेकिन यह एक टाइपो नहीं है जिसे पूछने वाले ने बनाया है। बल्कि, यह एक प्रकाशित पुस्तक में पाया जाता है। इसका मतलब है कि यह सवाल और इसके उत्तर भविष्य में दूसरों के लिए उपयोगी हो सकते हैं, जो इसे टाइपो के रूप में बंद करने के लिए एक मजबूत प्रति-संकेतक है। (अद्यतन: यह विषय अब है मेटा पर चर्चा की जा रही है; कृपया वहाँ वजन कर सकते हैं।)
कोड़ी ग्रे

3
शायद सबसे अच्छा जवाब होगा: कोड संकलित करने का प्रयास करें; यदि यह संकलन नहीं करता है, तो यह एक अच्छा संकेत है कि यह एक टाइपो है।
jrw32982

मैं अपने सिर के ऊपर से कई उदाहरणों के बारे में सोच सकता हूं जो एक संकलक पर संकलन (या यहां तक ​​कि एक आंतरिक संकलक त्रुटि का कारण) में विफल होते हैं, लेकिन एक अलग एक पर मुद्दे के बिना स्वीकार किए जाते हैं
जे एंटोनियो पेरेज़

1
@ जॉन मैं MSVC के साथ कुछ गुना अभिव्यक्ति की कोशिश की और वे संकलन नहीं किया। तो स्पष्ट रूप से पूरा अध्याय जो मैंने पढ़ा है वह एक टाइपो होना चाहिए? ;) C ++ कंपाइलर हर समय मान्य C ++ कोड को संकलित करने में विफल रहते हैं, यह भाषा के बेतुके रूप से जटिल होने से आता है।
Voo

जवाबों:


205

यह किताब में एक टाइपो है। पर देखो सी ++ प्रोग्रामिंग भाषा के 2 और 3 मुद्रण के लिए Errata । उदाहरण नीचे की तरह होना चाहिए:

auto z3 =[y]() { return (y) ? 1 : 2; }

11
(y)सिर्फ और सिर्फ क्यों y?
लिटिल हेल्पर

7
@LittleHelper शायद इसका सबसे अच्छा अभ्यास या कुछ और, मैं हमेशा इसे इस तरह लिखा हुआ देखता हूं। शायद अधिक जटिल तुलना के साथ भ्रम से बचने के लिए ...
Redwolf कार्यक्रम

28
व्यक्तिगत रूप से, मैं अक्सर उपयोग (cond) ? a : bस्पष्टता के लिए - यह मदद करता है मुझे बयान जैसे ग़लत व्याख्या से बचने foo = x > y ? a : bके रूप में foo = x ...जब कोड के माध्यम से स्कीम।
user1686

8
@LittleHelper यह वास्तव में वहाँ की जरूरत नहीं है। हालाँकि, फ़ंक्शन-जैसे मैक्रो में, जहाँ वे उपयोग किए जाते हैं, तर्कों को गोल करने के लिए सबसे अच्छा अभ्यास है, क्योंकि अन्यथा तर्कों का विस्तार अप्रत्याशित व्यवहार दे सकता है। मान "फू (x) x * 2" को दोगुना करने के लिए फ़ंक्शन-जैसे मैक्रो पर विचार करें जहां आप इसे "फू (2 + 3)" कहते हैं। परिणाम 2+ (3 * 2) होगा क्योंकि तर्क के रूप में विस्तार हो जाता है और पूर्वता के नियम खत्म हो जाते हैं। यदि आपका मैक्रो "फू (x) (x) * 2" है तो आपको सही ढंग से (2 + 3) * 2 मिलेगा। यह हो सकता है कि स्ट्रॉस्ट्रप को कोडिंग सुरक्षा के लिए हर जगह उस शैली का उपयोग करने की आदत है।
ग्राहम

2
@ ग्राहम बहुत संभावना नहीं है। स्ट्रॉस्ट्रुप अनिवार्य रूप से फ़ंक्शन मैक्रोज़ नहीं लिखता (C ++ इनलाइन फ़ंक्शन बेहतर हैं)। बहुत अधिक संभावना है कि टर्नरी ऑपरेटर के पास कुछ जटिल पूर्ववर्ती नियम हैं, इसलिए यह आदतों को परेंस के साथ स्पष्ट रूप से स्पष्ट करना अच्छा है।
मार्टिन बोनर मोनिका

19

मुझे एक साधारण टाइपो लगता है। शायद होना चाहिए:

auto z3 =[y]() { return y ? 1 : 2; }

ध्यान दें कि चूँकि लैम्ब्डा कोई पैरामीटर नहीं लेता है, इसलिए पैरान्स वैकल्पिक हैं। आप इसके बजाय इसका उपयोग कर सकते हैं, यदि आप पसंद करते हैं:

auto z3 =[y] { return y ? 1 : 2; }

11

return 1 : 2; एक सिंटैक्स त्रुटि है, यह मान्य कोड नहीं है।

return (y) ? 1 : 2;इसके बजाय एक सही कथन अधिक पसंद किया जाएगा।

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