2017-04-05 18 views
7

क्यों कोडसी # स्ट्रिंग अपने मूल्य का मूल्यांकन कैसे करती है?

string str = 30 + 20 + 10 + "ddd"; 
Console.WriteLine(str); 

पैदा करता 60ddd के इस स्निपेट,

और यह एक

string str = "ddd" + 30 + 20 + 10; 
Console.WriteLine(str); 

पैदा करता ddd302010 करता है?

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

धन्यवाद!

+4

[ ऑपरेटर सहयोगीता] (https://en.wikipedia.org/wiki/Operator_associativity) और [सी # विशेष रूप से] (https://msdn.microsoft.com/en-gb/library/aa691323 (v = vs.71) के लिए। एएसपीएक्स) –

+0

[प्राथमिकता और मूल्यांकन का आदेश] (https://msdn.microsoft.com/en-us/library/2bxt6kc4.aspx) – Aron

+0

@Damien_The_Unbeliever असल में, इस मामले में 'ऑपरेटर + (int, int)' और 'ऑपरेटर ((स्ट्रिंग) int, स्ट्रिंग की अस्पष्टता) भ्रम का कारण है। – Aron

उत्तर

11

+ ऑपरेटरों, क्योंकि वे एक ही ऑपरेटर रहे बराबर पूर्वता है इसलिए दाएं से बाएं मूल्यांकन किया जाता है:

30 + 20 + 10 + "ddd" 
-- + (int, int) returns (int)50 
------- + (int, int) returns (int)60 
------------ + (object, string) returns (string)"60ddd" 
फिर अन्य मामले के लिए

:

"ddd" + 30 + 20 + 10 
----- + (string, object) returns (string)"ddd30" 
---------- + (string, object) returns (string)"ddd3020" 
--------------- + (string, object) returns (string)"ddd302010" 
+1

नहीं ** सभी ** ऑपरेटरों का मूल्यांकन बाएं से दाएं किया जाता है। विशेष रूप से, विचाराधीन पूर्ण बयानों में पहला ऑपरेटर असाइनमेंट ऑपरेटर है और इसका मूल्यांकन अंतिम बार किया जाता है। इसी प्रकार '2 + 3 * 5' * * का मूल्यांकन बाएं से दाएं नहीं किया जाएगा। –

+0

@ डेमियन बिल्कुल सही, इसके लिए धन्यवाद। संपादन देखें, बेहतर? – CodeCaster

+1

मैं हाइलाइट करता हूं कि यह केवल इसलिए है क्योंकि ये सभी ऑपरेटर * वही * ऑपरेटर हैं (और इसलिए समान प्राथमिकता है) और '+' को सी # (और अन्य भाषाओं में भी) में सहयोगी छोड़ दिया गया है –

2

ऐसा इसलिए है क्योंकि एक अभिव्यक्ति का मूल्यांकन बाएं तरफ से दाएं तरफ किया जाता है। पहले उदाहरण में 30 + 20 + 10 आपको int + स्ट्रिंग (30 + 20 + 10) - int, "ddd" - स्ट्रिंग देता है। दूसरे उदाहरण में "ddd" + 30 एक स्ट्रिंग "ddd30" है जो इसे "20" और "10" जोड़ती है। यह ऑर्डर के बारे में है (जब तक आपके पास पैराथेसिस न हो)।

1

ऑपरेटर + विभिन्न भार के होते हैं:

पूर्णांक + पूर्णांक = पूर्णांक

पूर्णांक + स्ट्रिंग = स्ट्रिंग

स्ट्रिंग + पूर्णांक = स्ट्रिंग

के बाद अभिव्यक्ति में:

string str = 30 + 20 + 10 + "ddd"; 
Console.WriteLine(str); 

पहले 30 + 20 मूल्यांकन दोनों पूर्णांक हैं इसलिए ऑपरेटर का आउटपुट पूर्णांक होगा जो है।

फिर 50 + 10 मूल्यांकन किया जाएगा जो दोनों कर रहे हैं फिर से पूर्णांकों तो पूर्णांक उत्पादन जो है किया जाएगा।

फिर 60 + "ddd" जो पूर्णांक + स्ट्रिंग आपरेशन इस मामले उत्पादन स्ट्रिंग में ऑपरेटर है तो 60 + "ddd" होगा उत्पादन 60ddd

के बाद अभिव्यक्ति में:

string str = "ddd" + 30 + 20 + 10; 
Console.WriteLine(str); 

पहले "ddd" + 30 मूल्यांकन करता है, जिसमें स्ट्रिंग + पूर्णांक आपरेशन जगह लेता है तो उत्पादन ddd30 होगा मिला है।

फिर ddd30 + 20 का मूल्यांकन किया जाएगा, जिसमें फिर से स्ट्रिंग + पूर्णांक आपरेशन जगह लेता है तो उत्पादन ddd3020 हो जाएगा।

फिर ddd3020 + 10 का मूल्यांकन किया जाएगा, जिसमें फिर से स्ट्रिंग + पूर्णांक आपरेशन जगह लेता है तो उत्पादन ddd302010 हो जाएगा।

0

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

1

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

संबंधित मुद्दे