यूनीरी प्लस ऑपरेटर क्या करता है?


86

यूनीरी प्लस ऑपरेटर क्या करता है? ऐसी कई परिभाषाएं हैं जो मैंने ( यहां और यहां ) पाई हैं लेकिन मुझे अभी भी पता नहीं है कि इसका क्या उपयोग किया जाएगा। ऐसा लगता है कि यह कुछ भी नहीं करता है, लेकिन इसके लिए एक कारण है, है ना?


3
मुझे लगता है कि ऐतिहासिक कारण को कम करके आंका गया है।
वुल्फ

3
तीन अलग-अलग भाषा टैग वाला एक प्रश्न काफी अस्पष्ट / बुरा है! उत्तर C # (अधिभार) और C (कोई अधिभार नहीं) और C ++ (अधिभार योग्य है लेकिन C से यह विरासत में मिला है और इसलिए इसके गुण भी हैं) के लिए बहुत भिन्न हैं।
किंवदंतियों 2

मैं एरिक लिपर्ट के सी # के 10 दोषों के लिए एक लिंक जोड़ना चाहूंगा। आपको माननीय उल्लेखों में यूनिरी प्लस ऑपरेटर मिलेगा: Informit.com/articles/article.aspx?p=2425867 वह मूल रूप से कहते हैं कि इसे हटाया जाना चाहिए या इसे कभी नहीं जोड़ा जाना चाहिए था।
नोएल विडमर

जवाबों:


57

यदि आपको आवश्यकता महसूस हो तो यह अतिभारित होना चाहिए; सभी पूर्वनिर्धारित प्रकारों के लिए यह अनिवार्य रूप से एक नो-ऑप है।

एक नो-ऑप यूनिअरी अंकगणितीय ऑपरेटर के व्यावहारिक उपयोग बहुत सीमित हैं, और केवल ऑपरेटर के बजाय एक अंकगणितीय अभिव्यक्ति में मूल्य का उपयोग करने के परिणामों से संबंधित हैं। उदाहरण के लिए, इसका उपयोग छोटे अभिन्न प्रकारों से चौड़ीकरण करने के लिए किया जा सकता है int, या यह सुनिश्चित करने के लिए कि अभिव्यक्ति के परिणाम को एक अवतरण के रूप में माना जाता है और इसलिए गैर- constसंदर्भ पैरामीटर के साथ संगत नहीं है । मैं, हालांकि, ये उपयोग पठनीयता की तुलना में कोड गोल्फ के लिए बेहतर अनुकूल हैं। :-)


7
यह वास्तव में सच नहीं है, जैसा कि नीचे दिए गए कई उदाहरण इंगित करते हैं।
जुकरियन

3
ठीक है, मैं खरीदूंगा कि इसके कुछ उपयोग हैं, लेकिन नीचे चर्चा किए गए अधिकांश उपयोग इस तथ्य से संबंधित हैं कि यह एक संख्यात्मक अभिव्यक्ति है जो एक नो-ऑप ऑपरेटर का उपयोग करके बनाया गया है: उदाहरण के लिए, प्रचार करने intऔर एक परिणाम के परिणामस्वरूप अभिव्यक्ति के प्रभाव हैं। -नेस, खुद के + संचालक की नहीं।
जेफरी हेंटिन

118

वास्तव में, यूनियरी प्लस कुछ करता है - यहां तक ​​कि सी में भी। यह ऑपरेंड पर सामान्य अंकगणितीय रूपांतरण करता है और एक नया मूल्य देता है, जो अधिक से अधिक चौड़ाई का पूर्णांक हो सकता है। यदि मूल मान इससे कम चौड़ाई का एक अहस्ताक्षरित पूर्णांक था int, तो इसे signedमान में भी बदल दिया जाएगा ।

आमतौर पर यह उतना महत्वपूर्ण नहीं है, लेकिन इसका एक प्रभाव हो सकता है, इसलिए यह एक अच्छा विचार नहीं है कि एक प्रकार की "टिप्पणी" के रूप में यूनीरी का उपयोग करना यह दर्शाता है कि पूर्णांक सकारात्मक है। निम्नलिखित C ++ प्रोग्राम पर विचार करें:

void foo(unsigned short x)
{
 std::cout << "x is an unsigned short" << std::endl;
}

void foo(int x)
{
 std::cout << "x is an int" << std::endl;
}

int main()
{
 unsigned short x = 5;
 foo(+x);
}

यह "x एक int है" प्रदर्शित करेगा।

इसलिए इस उदाहरण में unary plus ने एक अलग प्रकार और हस्ताक्षर के साथ एक नया मान बनाया ।


5
यदि आप ऐसा कोड लिख रहे हैं जो दिए गए परिणाम का उत्पादन करता है जब एक छोटा और एक इंट दिया जाता है जो बराबर की तुलना करता है, तो आपके पास शायद एक अलग समस्या है
Lie Ryan

1
धन्यवाद, यह स्पष्ट करता है (sidenote: C में, मुझे काम करने के लिए उदाहरण नहीं मिल सकता है, क्योंकि मैं फू फ़ंक्शन को अधिभार नहीं दे सकता)
Binarian

कहने का मतलब क्या है an integer of greater width?
यकानची

इस संदर्भ में, "चौड़ाई" मूल्य के साथ जुड़े भंडारण के बाइट्स की संख्या को संदर्भित करता है।
जाइल्स

41

K & R दूसरे संस्करण से:

ANSI मानक के साथ unary + नया है। इसे समरूपता के लिए यूरीरी के साथ जोड़ा गया था -।


6
पूर्ण रूप से। * यह ऐतिहासिक कारण है। सी ++ को इसे अनुकूलित करना था, इसलिए इसे ओवरलोडिंग से निपटना पड़ा।
वुल्फ

37

मैंने इसका उपयोग स्पष्टता के लिए किया है, सकारात्मक मान को नकारात्मक मूल्य से अलग मानने के लिए:

shift(+1);
shift(-1);

लेकिन यह एक बहुत कमजोर उपयोग है। जवाब निश्चित रूप से ओवरलोडिंग है।


8
मैंने यह भी किया है, खासकर जब वैक्टर के साथ काम कर रहा हैvec3(+1,-1,-1)
21:39 पर एमपीएन

28

एक चीज़ जो बिल्ट-इन अनअरी +करती है, वह एक प्रतिद्वंद्विता में बदल जाती है। उदाहरण के लिए, आप ऐसा कर सकते हैं

int x;
&x;

लेकिन आप ऐसा नहीं कर सकते

&+x;

:)

PS "ओवरलोडिंग" निश्चित रूप से सही उत्तर नहीं है। Unary +को C से विरासत में मिला था और C में ओवरलोडिंग का कोई उपयोगकर्ता-स्तरीय ऑपरेटर नहीं है।


14

मुख्य चीज़ एकरी + उपलब्धियाँ छोटे-से-अंतर डेटा प्रकारों के लिए एक इंट के लिए पदोन्नति है। यह काफी उपयोगी हो सकता है यदि आप std::coutसांख्यिक डेटा के रूप में चार डेटा का उपयोग करने की कोशिश कर रहे हैं ।

char x = 5;
std::cout << +x << "\n";

से बहुत अलग है

char x=5;
std::cout << x << "\n";

यह ओवरलोडिंग के लिए भी उपलब्ध है, लेकिन व्यवहार में आपका अधिभार लगभग NOP होना चाहिए।


12

यदि आपको कभी डिबग या जो भी कारण के लिए कच्चे बाइट्स के संख्यात्मक मान (जैसे, छोटी संख्या चार के रूप में संग्रहीत) को प्रिंट करने की आवश्यकता होती है, तो unary + प्रिंट कोड को सरल बना सकता है। विचार करें

char c = 42;
cout << c << endl;           // prints "*\n", not what you want in this case
cout << (int)c << endl;      // prints "42\n", ok
cout << +c << endl;          // prints "42\n", much easier to type

यह सिर्फ एक त्वरित उदाहरण है। मुझे यकीन है कि ऐसे समय होते हैं जब unary + अपने बाइट्स को टेक्स्ट की बजाय संख्याओं की तरह व्यवहार करने में मदद कर सकता है।


4

एक ऐतिहासिक ख़बर। C99 मानकीकरण समिति ने यह भी सोचा था कि यूनीरी प्लस के मौजूदा उपयोग काफी दुर्लभ थे, जैसा कि उनके द्वारा भाषा में एक और विशेषता प्राप्त करने के लिए इसका पुन: उपयोग करने पर विचार किया गया था: फ्लोटिंग-पॉइंट स्थिर अभिव्यक्तियों के अनुवाद-समय मूल्यांकन का निषेध। C Rationale, खंड F.7.4 से निम्नलिखित उद्धरण देखें:

इस विनिर्देश के प्रारंभिक संस्करण ने अनुवाद-समय निरंतर अंकगणित की अनुमति दी, लेकिन निरंतर भावों के अनुवाद-समय के मूल्यांकन को बाधित करने के लिए, एक ऑपरेंड पर लागू होने पर, यूनिरी + ऑपरेटर को सशक्त बनाया।

अंत में, शब्दार्थ उलट गए, अधिकांश संदर्भों में रन-टाइम मूल्यांकन लागू किया गया (कम से कम "जैसा कि अगर" नियम), और स्थैतिक शुरुआती के उपयोग द्वारा अनुवाद-समय मूल्यांकन को लागू करने की क्षमता। ध्यान दें कि मुख्य अंतर फ्लोटिंग पॉइंट अपवादों की घटना में होता है, और अन्य फ़्लोटिंग पॉइंट राउंडिंग या सटीक सेटिंग्स, जहां मौजूद हैं।


3

बहुत ज्यादा नहीं। ओवरलोड की अनुमति देने का सामान्य तर्क operator+()यह है कि ओवरलोडिंग के लिए निश्चित रूप से वास्तविक दुनिया का उपयोग operator-()होता है, और यह बहुत ही अजीब (या विषम) होगा यदि आप ओवरलोडिंग की अनुमति देने के लिए थे, operator-()लेकिन नहीं operator+()

मेरा मानना ​​है कि मैंने पहली बार स्ट्रॉस्ट्रॉप से ​​इस तर्क को पढ़ा, लेकिन मेरे पास इसे सत्यापित करने के लिए मेरी किताबें नहीं हैं। मैं गलत हो सकता हूं।


3

Unary plus C में मौजूद था, जहाँ इसने कुछ भी नहीं किया ( autoकीवर्ड की तरह )। ऐसा नहीं करने के लिए, स्ट्रॉस्ट्रुप को सी के साथ एक गंभीर असंगति का परिचय देना होगा।

एक बार जब यह C ++ में था, तो यह एक अधिभार कार्य की अनुमति देने के लिए स्वाभाविक था, बिल्कुल एक शून्य शून्य की तरह, और Stroustrup ने इसे उस कारण से पेश किया होगा यदि यह पहले से ही नहीं था।

तो, इसका मतलब कुछ भी नहीं है। उदाहरण के लिए -1.5 के विपरीत +1.5 का उपयोग करके चीजों को और अधिक सममित बनाने के लिए सजावट के प्रकार के रूप में इसका उपयोग किया जा सकता है। C ++ में, इसे अतिभारित किया जा सकता है, लेकिन यह operator+()कुछ भी करने पर भ्रमित करने वाला है । मानक नियम याद रखें: अंकगणित ऑपरेटरों को ओवरलोड करते समय, intएस जैसी चीजें करें।

यदि आप एक कारण की तलाश कर रहे हैं कि यह क्यों है, तो सी के शुरुआती इतिहास के बारे में कुछ पता करें। मुझे संदेह है कि कोई अच्छा कारण नहीं था, क्योंकि सी वास्तव में डिज़ाइन नहीं किया गया था। बेकार autoकीवर्ड पर विचार करें (संभवतः इसके विपरीत static, अब C ++ 0x में पुनर्नवीनीकरण किया जा रहा है), और entryकीवर्ड, जिसने कभी कुछ नहीं किया (और बाद में C90 में छोड़ा गया)। एक प्रसिद्ध ईमेल है जिसमें रिची या कर्निघन का कहना है कि, जब उन्हें एहसास हुआ कि ऑपरेटर की प्रक्रिया में समस्या थी, तो कोड की हजारों लाइनों के साथ पहले से ही तीन स्थापनाएं थीं जिन्हें वे तोड़ना नहीं चाहते थे।


1
केवल गैर-अंकगणितीय अधिभार, जो मैंने देखा है कि समझ में आता है कि नियमित अभिव्यक्ति या व्याकरण में था (जहां + शब्द) का अर्थ है एक या अधिक तंबू। (जो काफी मानक नियमित अभिव्यक्ति सिंटैक्स है)
माइकल एंडरसन

के बारे में entry: ( stackoverflow.com/q/254395/153285 )। इन दिनों, यदि आप कई प्रवेश बिंदु चाहते हैं, तो केवल टेल कॉल और प्रोफाइल-निर्देशित अनुकूलन का उपयोग करें।
पोटाटोज़वाटर

मेरा मानना ​​है कि C99 में भी, दिए गए extern volatile int foo;एक संकलक के कथन +foo;को किसी भी मंच पर संकेतित पते की एक रीडिंग करने की आवश्यकता होगी, जहां कोई भी साधन निर्धारित करने के लिए मौजूद हो सकता है कि रीड जगह ले ली है। मुझे यकीन नहीं है कि अगर बयान सिर्फ "फू" थे, तो इसकी आवश्यकता होगी, हालांकि कई संकलक इसे शिष्टाचार के रूप में करेंगे।
सुपरकैट

2

मैं इसके लिए किसी स्रोत का हवाला नहीं दे सकता, लेकिन मुझे यह समझ में आ गया है कि यह स्पष्ट प्रकार के प्रचार के लिए है, जिसका अर्थ है दोषरहित प्रकार का रूपांतरण। यह रूपांतरण पदानुक्रम के शीर्ष पर रखता है,

  • संवर्धन: new_type operator+(old_type)
  • रूपांतरण: new_type(old_type)
  • कास्ट: operator(new_type)(old_type)
  • बलात्कार: new_type operator=(old_type)

बेशक, यह एक microsoft (वास्तव में पुराना) c / c ++ मेनुअल में से एक में एक नोट की मेरी व्याख्या से है जो मैंने लगभग 15 साल पहले पढ़ा था, इसलिए इसे नमक के दाने के साथ लें।


1
#include <stdio.h>
int main()
{
    unsigned short x = 5;
    printf ("%d\n",sizeof(+x)); 
    printf ("%d\n",sizeof(x)); 
    return 0;
}

जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया है, unary + वास्तव में क्रमशः 4 और 2 के प्रकार, आकार बदलती है। अजीब है कि अभिव्यक्ति + x वास्तव में आकार में गणना की जाती है, मैंने सोचा कि ऐसा नहीं माना जाता था। शायद यह इस तथ्य के कारण है कि आकार-प्रकार की प्राथमिकता + के समान ही है।


-1

मुझे लगता है कि आप इसका उपयोग हमेशा एक नंबर सकारात्मक बनाने के लिए कर सकते हैं। अनुपस्थित होने के लिए बस यूनीरी + ऑपरेटर को ओवरलोड करें। वास्तव में अपने साथी डेवलपर्स को भ्रमित करने के लायक नहीं है, जब तक कि आप वास्तव में सिर्फ अपने कोड को बाधित नहीं करना चाहते हैं। तब यह अच्छी तरह से काम करेगा।


इससे यह एकात्मक माइनस के विपरीत नहीं होगा जो कि भ्रमित करने वाला होगा, जब तक कि आप नेरी माइनस को नकारात्मक एब्स के रूप में अधिभारित नहीं करते हैं, जो सभी प्रकार की गणित की चीजों को अजीब बना देगा
डेविए 8

उह, हाँ। इसलिए मैंने इसे न करने का सुझाव दिया।
पैट्रिक

1
@ डेवी 8: क्या आपको लगता है कि यूनीरी प्लस वर्तमान में एकसमान माइनस के "विपरीत" है? बिटवाइज़ पूरक ऑपरेटर के "विपरीत" क्या है ~? मुझे यकीन नहीं है कि आपकी "विपरीत" की परिभाषा क्या है, लेकिन मुझे संदेह है कि वर्तमान में जो कुछ भी होता है, वह एकतरफा प्लस और एकात्मक ऋण के अनुभव से पक्षपाती है।
ndkrempel

-1

EDIT पूरी तरह से लिखा, क्योंकि मैं अपने मूल उत्तर में छूट गया था।

इससे आपको अपने प्रकार की स्पष्ट घोषणा को एक सकारात्मक मूल्य के रूप में संभालने की अनुमति मिलनी चाहिए (मुझे लगता है कि ज्यादातर गैर-गणितीय कार्यों में)। ऐसा लगता है कि नकारना अधिक उपयोगी होगा, लेकिन मुझे लगता है कि यहाँ एक उदाहरण है जहाँ इससे फर्क पड़ सकता है:

public struct Acceleration
{
    private readonly decimal rate;
    private readonly Vector vector;

    public Acceleration(decimal rate, Vector vector)
    {
        this.vector = vector;
        this.rate = rate;
    }

    public static Acceleration operator +(Acceleration other)
    {
        if (other.Vector.Z >= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public static Acceleration operator -(Acceleration other)
    {
        if (other.Vector.Z <= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public decimal Rate
    {
        get { return rate; }
    }

    public Vector Vector
    {
        get { return vector; }
    }
}

यह मेरे लिए एक अपरिपक्व ऑपरेशन की तरह नहीं दिखता है। यह दो तर्क (अप्रैल और मई) लेता है ताकि यह द्विआधारी हो।
BlueMonkMN

वह बाइनरी प्लस है। यूनीरी प्लस केवल "+1" या कुछ ऐसा है, जिसमें कोई लेफ्ट ऑपरेंड नहीं है।
जेफरी हेंटिन 20

मेरी गलती। मेरा CS101 भूल गया। तय की।
माइकल मीडोज 20

3
यदि मुझे उत्पादन कोड में उस तरह का अधिभार मिला है, तो मैं निश्चित रूप से इसे बग के रूप में चिह्नित करूंगा और इसे जल्द से जल्द ठीक करूंगा। का शब्दार्थ +मूल्य को सकारात्मक बनाना नहीं है, बल्कि इसके संकेत को अपरिवर्तित छोड़ देना है।
आर्टुरो टॉरेस सांचेज़

-1

बस यह समझाने के लिए प्रयोग किया जाता है कि कौन सी संख्या सकारात्मक है

जैसे;

int a=10;
System.out.println(+x);// prints 10(that means,that number 10 multiply by +1,{10*+1})

//if we use unary minus

int a=10;
System.out.println(-x);//prints -10(that means,that number 10 multiply by +1,{10*-1})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.