यूनीरी प्लस ऑपरेटर क्या करता है? ऐसी कई परिभाषाएं हैं जो मैंने ( यहां और यहां ) पाई हैं लेकिन मुझे अभी भी पता नहीं है कि इसका क्या उपयोग किया जाएगा। ऐसा लगता है कि यह कुछ भी नहीं करता है, लेकिन इसके लिए एक कारण है, है ना?
जवाबों:
यदि आपको आवश्यकता महसूस हो तो यह अतिभारित होना चाहिए; सभी पूर्वनिर्धारित प्रकारों के लिए यह अनिवार्य रूप से एक नो-ऑप है।
एक नो-ऑप यूनिअरी अंकगणितीय ऑपरेटर के व्यावहारिक उपयोग बहुत सीमित हैं, और केवल ऑपरेटर के बजाय एक अंकगणितीय अभिव्यक्ति में मूल्य का उपयोग करने के परिणामों से संबंधित हैं। उदाहरण के लिए, इसका उपयोग छोटे अभिन्न प्रकारों से चौड़ीकरण करने के लिए किया जा सकता है int
, या यह सुनिश्चित करने के लिए कि अभिव्यक्ति के परिणाम को एक अवतरण के रूप में माना जाता है और इसलिए गैर- const
संदर्भ पैरामीटर के साथ संगत नहीं है । मैं, हालांकि, ये उपयोग पठनीयता की तुलना में कोड गोल्फ के लिए बेहतर अनुकूल हैं। :-)
int
और एक परिणाम के परिणामस्वरूप अभिव्यक्ति के प्रभाव हैं। -नेस, खुद के + संचालक की नहीं।
वास्तव में, यूनियरी प्लस कुछ करता है - यहां तक कि सी में भी। यह ऑपरेंड पर सामान्य अंकगणितीय रूपांतरण करता है और एक नया मूल्य देता है, जो अधिक से अधिक चौड़ाई का पूर्णांक हो सकता है। यदि मूल मान इससे कम चौड़ाई का एक अहस्ताक्षरित पूर्णांक था 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 ने एक अलग प्रकार और हस्ताक्षर के साथ एक नया मान बनाया ।
an integer of greater width
?
मैंने इसका उपयोग स्पष्टता के लिए किया है, सकारात्मक मान को नकारात्मक मूल्य से अलग मानने के लिए:
shift(+1);
shift(-1);
लेकिन यह एक बहुत कमजोर उपयोग है। जवाब निश्चित रूप से ओवरलोडिंग है।
vec3(+1,-1,-1)
एक चीज़ जो बिल्ट-इन अनअरी +
करती है, वह एक प्रतिद्वंद्विता में बदल जाती है। उदाहरण के लिए, आप ऐसा कर सकते हैं
int x;
&x;
लेकिन आप ऐसा नहीं कर सकते
&+x;
:)
PS "ओवरलोडिंग" निश्चित रूप से सही उत्तर नहीं है। Unary +
को C से विरासत में मिला था और C में ओवरलोडिंग का कोई उपयोगकर्ता-स्तरीय ऑपरेटर नहीं है।
मुख्य चीज़ एकरी + उपलब्धियाँ छोटे-से-अंतर डेटा प्रकारों के लिए एक इंट के लिए पदोन्नति है। यह काफी उपयोगी हो सकता है यदि आप std::cout
सांख्यिक डेटा के रूप में चार डेटा का उपयोग करने की कोशिश कर रहे हैं ।
char x = 5;
std::cout << +x << "\n";
से बहुत अलग है
char x=5;
std::cout << x << "\n";
यह ओवरलोडिंग के लिए भी उपलब्ध है, लेकिन व्यवहार में आपका अधिभार लगभग NOP होना चाहिए।
यदि आपको कभी डिबग या जो भी कारण के लिए कच्चे बाइट्स के संख्यात्मक मान (जैसे, छोटी संख्या चार के रूप में संग्रहीत) को प्रिंट करने की आवश्यकता होती है, तो 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 + अपने बाइट्स को टेक्स्ट की बजाय संख्याओं की तरह व्यवहार करने में मदद कर सकता है।
एक ऐतिहासिक ख़बर। C99 मानकीकरण समिति ने यह भी सोचा था कि यूनीरी प्लस के मौजूदा उपयोग काफी दुर्लभ थे, जैसा कि उनके द्वारा भाषा में एक और विशेषता प्राप्त करने के लिए इसका पुन: उपयोग करने पर विचार किया गया था: फ्लोटिंग-पॉइंट स्थिर अभिव्यक्तियों के अनुवाद-समय मूल्यांकन का निषेध। C Rationale, खंड F.7.4 से निम्नलिखित उद्धरण देखें:
इस विनिर्देश के प्रारंभिक संस्करण ने अनुवाद-समय निरंतर अंकगणित की अनुमति दी, लेकिन निरंतर भावों के अनुवाद-समय के मूल्यांकन को बाधित करने के लिए, एक ऑपरेंड पर लागू होने पर, यूनिरी + ऑपरेटर को सशक्त बनाया।
अंत में, शब्दार्थ उलट गए, अधिकांश संदर्भों में रन-टाइम मूल्यांकन लागू किया गया (कम से कम "जैसा कि अगर" नियम), और स्थैतिक शुरुआती के उपयोग द्वारा अनुवाद-समय मूल्यांकन को लागू करने की क्षमता। ध्यान दें कि मुख्य अंतर फ्लोटिंग पॉइंट अपवादों की घटना में होता है, और अन्य फ़्लोटिंग पॉइंट राउंडिंग या सटीक सेटिंग्स, जहां मौजूद हैं।
बहुत ज्यादा नहीं। ओवरलोड की अनुमति देने का सामान्य तर्क operator+()
यह है कि ओवरलोडिंग के लिए निश्चित रूप से वास्तविक दुनिया का उपयोग operator-()
होता है, और यह बहुत ही अजीब (या विषम) होगा यदि आप ओवरलोडिंग की अनुमति देने के लिए थे, operator-()
लेकिन नहीं operator+()
।
मेरा मानना है कि मैंने पहली बार स्ट्रॉस्ट्रॉप से इस तर्क को पढ़ा, लेकिन मेरे पास इसे सत्यापित करने के लिए मेरी किताबें नहीं हैं। मैं गलत हो सकता हूं।
Unary plus C में मौजूद था, जहाँ इसने कुछ भी नहीं किया ( auto
कीवर्ड की तरह )। ऐसा नहीं करने के लिए, स्ट्रॉस्ट्रुप को सी के साथ एक गंभीर असंगति का परिचय देना होगा।
एक बार जब यह C ++ में था, तो यह एक अधिभार कार्य की अनुमति देने के लिए स्वाभाविक था, बिल्कुल एक शून्य शून्य की तरह, और Stroustrup ने इसे उस कारण से पेश किया होगा यदि यह पहले से ही नहीं था।
तो, इसका मतलब कुछ भी नहीं है। उदाहरण के लिए -1.5 के विपरीत +1.5 का उपयोग करके चीजों को और अधिक सममित बनाने के लिए सजावट के प्रकार के रूप में इसका उपयोग किया जा सकता है। C ++ में, इसे अतिभारित किया जा सकता है, लेकिन यह operator+()
कुछ भी करने पर भ्रमित करने वाला है । मानक नियम याद रखें: अंकगणित ऑपरेटरों को ओवरलोड करते समय, int
एस जैसी चीजें करें।
यदि आप एक कारण की तलाश कर रहे हैं कि यह क्यों है, तो सी के शुरुआती इतिहास के बारे में कुछ पता करें। मुझे संदेह है कि कोई अच्छा कारण नहीं था, क्योंकि सी वास्तव में डिज़ाइन नहीं किया गया था। बेकार auto
कीवर्ड पर विचार करें (संभवतः इसके विपरीत static
, अब C ++ 0x में पुनर्नवीनीकरण किया जा रहा है), और entry
कीवर्ड, जिसने कभी कुछ नहीं किया (और बाद में C90 में छोड़ा गया)। एक प्रसिद्ध ईमेल है जिसमें रिची या कर्निघन का कहना है कि, जब उन्हें एहसास हुआ कि ऑपरेटर की प्रक्रिया में समस्या थी, तो कोड की हजारों लाइनों के साथ पहले से ही तीन स्थापनाएं थीं जिन्हें वे तोड़ना नहीं चाहते थे।
entry
: ( stackoverflow.com/q/254395/153285 )। इन दिनों, यदि आप कई प्रवेश बिंदु चाहते हैं, तो केवल टेल कॉल और प्रोफाइल-निर्देशित अनुकूलन का उपयोग करें।
extern volatile int foo;
एक संकलक के कथन +foo;
को किसी भी मंच पर संकेतित पते की एक रीडिंग करने की आवश्यकता होगी, जहां कोई भी साधन निर्धारित करने के लिए मौजूद हो सकता है कि रीड जगह ले ली है। मुझे यकीन नहीं है कि अगर बयान सिर्फ "फू" थे, तो इसकी आवश्यकता होगी, हालांकि कई संकलक इसे शिष्टाचार के रूप में करेंगे।
मैं इसके लिए किसी स्रोत का हवाला नहीं दे सकता, लेकिन मुझे यह समझ में आ गया है कि यह स्पष्ट प्रकार के प्रचार के लिए है, जिसका अर्थ है दोषरहित प्रकार का रूपांतरण। यह रूपांतरण पदानुक्रम के शीर्ष पर रखता है,
new_type operator+(old_type)
new_type(old_type)
operator(new_type)(old_type)
new_type operator=(old_type)
बेशक, यह एक microsoft (वास्तव में पुराना) c / c ++ मेनुअल में से एक में एक नोट की मेरी व्याख्या से है जो मैंने लगभग 15 साल पहले पढ़ा था, इसलिए इसे नमक के दाने के साथ लें।
#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 वास्तव में आकार में गणना की जाती है, मैंने सोचा कि ऐसा नहीं माना जाता था। शायद यह इस तथ्य के कारण है कि आकार-प्रकार की प्राथमिकता + के समान ही है।
मुझे लगता है कि आप इसका उपयोग हमेशा एक नंबर सकारात्मक बनाने के लिए कर सकते हैं। अनुपस्थित होने के लिए बस यूनीरी + ऑपरेटर को ओवरलोड करें। वास्तव में अपने साथी डेवलपर्स को भ्रमित करने के लायक नहीं है, जब तक कि आप वास्तव में सिर्फ अपने कोड को बाधित नहीं करना चाहते हैं। तब यह अच्छी तरह से काम करेगा।
~
? मुझे यकीन नहीं है कि आपकी "विपरीत" की परिभाषा क्या है, लेकिन मुझे संदेह है कि वर्तमान में जो कुछ भी होता है, वह एकतरफा प्लस और एकात्मक ऋण के अनुभव से पक्षपाती है।
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; }
}
}
+
मूल्य को सकारात्मक बनाना नहीं है, बल्कि इसके संकेत को अपरिवर्तित छोड़ देना है।
बस यह समझाने के लिए प्रयोग किया जाता है कि कौन सी संख्या सकारात्मक है
जैसे;
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})