Std :: num_limits <अहस्ताक्षरित char> सदस्यों को कॉल करने से पहले एक "" + का उद्देश्य क्या है?


130

मैंने इस उदाहरण को cppreference के प्रलेखन के लिए देखाstd::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

मैं "+" ऑपरेटर को नहीं समझता

<< +std::numeric_limits<unsigned char>::lowest()

मैंने इसका परीक्षण किया है, इसे "-" के साथ प्रतिस्थापित किया है, और यह भी काम किया है। ऐसे "+" ऑपरेटर का उपयोग क्या है?


3
कोशिश करो। यदि आप बाहर निकलते हैं तो आपको क्या मिलता है +?
पीट बेकर

4
यह प्रश्न पूछने वाले की जरूरत नहीं होगी अगर कोड के लेखक को यह समझाने की परवाह है कि इसका क्या मतलब है या इसके बजाय एक स्पष्ट कलाकार का उपयोग करें ...
user202729

यदि आप के साथ प्रतिस्थापित करते हैं -तो आउटपुट सीमा के लिए सही मान नहीं होंगे
phuclv

1
रिकॉर्ड के लिए, यदि आप Google को अपने आप में इस तरह की चीज़ चाहते हैं, तो इसे "यूनीरी प्लस" ऑपरेटर कहा जाता है - यह एकात्मक है क्योंकि यह एकल मान लेता है (इस मामले में, इसके ठीक बाद की बात), और "प्लस "कहने के लिए Google के अनुकूल तरीका है +। इस स्थिति में, आपकी क्वेरी संभवतः "c ++ अनरीरी प्लस" होगी। यह ... बिल्कुल सहज नहीं है, और आपको अभी भी उस दस्तावेज़ को पढ़ना सीखना होगा जो आप पाएंगे, लेकिन IMO यह खेती करने के लिए एक उपयोगी कौशल है।
निधि मोनिका का मुकदमा

जवाबों:


137

<<उत्तीर्ण होने पर आउटपुट ऑपरेटरchar (हस्ताक्षरित या अहस्ताक्षरित) इसे एक के रूप में लिखेगा चरित्र के

वे फ़ंक्शन प्रकार के मान लौटाएंगे unsigned char । और जैसा कि ऊपर उल्लेख किया गया है कि उन वर्णों को मुद्रित करेगा जो मान वर्तमान एन्कोडिंग में दर्शाते हैं, न कि उनके पूर्णांक मान।

+ऑपरेटर धर्मान्तरित unsigned charएक को उन कार्यों द्वारा लौटाए intके माध्यम से पूर्णांक पदोन्नति । जिसका अर्थ है कि पूर्णांक मान इसके बजाय मुद्रित किए जाएंगे।

जैसी अभिव्यक्ति +std::numeric_limits<unsigned char>::lowest()अनिवार्य रूप से समान है static_cast<int>(std::numeric_limits<unsigned char>::lowest())


37

+वहाँ unsigned charएक में बदल जाता है int+ऑपरेटर मूल्य संरक्षण है, लेकिन यह अपने संकार्य पर अभिन्न पदोन्नति उत्प्रेरण के प्रभाव पड़ता है। यह सुनिश्चित करना है कि आप कुछ (अर्द्ध) यादृच्छिक चरित्र के बजाय एक संख्यात्मक मान operator <<देखते हैं जो वर्ण प्रकार दिए जाने पर प्रिंट होता है।


18

बस पहले से दिए गए उत्तरों का संदर्भ जोड़ना है। CP47 मानक कार्य प्रारूप N4713 से :

8.5.2.1 गैर-संचालक
...

  1. यूनिरी + ऑपरेटर के ऑपरेंड में अंकगणित, अनकैप्ड एन्यूमरेशन या पॉइंटर टाइप होगा और परिणाम तर्क का मूल्य है। इंटीग्रल प्रमोशन इंटीग्रल या एन्यूमरेशन ऑपरेंड पर किया जाता है। परिणाम का प्रकार पदोन्नत ऑपरेंड का प्रकार है।

और char, short, int, और longअभिन्न प्रकार हैं।


12

बिना +परिणाम अलग होगा। निम्नलिखित स्निपेट a 97इसके बजाय आउटपुट करता हैa a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

कारण यह है कि विभिन्न अधिभार विभिन्न प्रकार के डेटा को प्रिंट करते हैं । इसके basic_ostream& operator<<( char value );लिए कोई अधिभार नहीं है std::basic_ostreamऔर इसे पृष्ठ के अंत में समझाया गया है

चरित्र और चरित्र स्ट्रिंग तर्क (जैसे, प्रकार के charया const char*) द्वारा नियंत्रित किया जाता है गैर सदस्य भार के के operator<<। सदस्य फ़ंक्शन कॉल सिंटैक्स (जैसे std::cout.operator<<('c');) का उपयोग करके किसी वर्ण को आउटपुट करने का प्रयास ओवरलोड (2-4) में से एक को कॉल करेगा और संख्यात्मक मान को आउटपुट करेगा । सदस्य फ़ंक्शन कॉल सिंटैक्स का उपयोग करके एक वर्ण स्ट्रिंग को आउटपुट करने का प्रयास ओवरलोड (7) को कॉल करेगा और इसके बजाय सूचक मान प्रिंट करेगा।

गैर सदस्य अधिभार है कि जब आप पारित एक बुलाया जाएगा charचर रहा है

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

जो कोडपॉइंट पर वर्ण को प्रिंट करता है ch

इसलिए मूल रूप से यदि आप पास हो जाते हैं char, signed charया unsigned charसीधे स्ट्रीम पर जाते हैं तो यह चरित्र को प्रिंट कर देगा। यदि आप +उपरोक्त पंक्तियों को हटाने का प्रयास करते हैं, तो आप देखेंगे कि यह कुछ "अजीब" या गैर-दृश्य वर्णों को प्रिंट करता है, जो कि वह नहीं है जिसकी कोई उम्मीद नहीं करता है

आप उनके संख्यात्मक मूल्यों चाहते हैं बजाय आप के लिए अधिभार कॉल करना होगा short, int, longया long long। इसे करने का सबसे आसान तरीका charहै, intसाथ ही साथ यूनीरी प्लस को बढ़ावा देना +। यह यूनीरी प्लस ऑपरेटर के दुर्लभ उपयोगी अनुप्रयोगों में से एक है । काम करने के लिए एक स्पष्ट कलाकार भी काम करेगाint

ऐसे कई लोग हैं जिन्होंने एसओ की तरह उस समस्या का सामना किया


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