2011-02-17 20 views
18

बस कुछ कोड में भाग गया जो ऐसा नहीं कर रहा था जिसे मैंने सोचा था। क्या अन्य लोग सोचते हैं कि यह 1 वापस आना चाहिए? क्या कोई अच्छा स्पष्टीकरण है कि यह क्यों नहीं है ??सी # में "गिनती ++" वापसी क्या करती है?

int count = 0; 

count++.ToString(); // Returns 1 no? 

मुझे हमेशा यही लगता गिनती ++ गिनती के रूप में ही था = गिनती +1 ...

+1

किस बारे में (गिनती ++): मेरा उत्तर पिछली बार इस सवाल जानकारी के लिए कहा गया था करने के लिए मिलते हैं।? –

+1

@ जे अंगवेनी: यह कुछ भी नहीं बदलता है। –

उत्तर

46

x++ एक पद वेतन वृद्धि ऑपरेटर है। इसका मतलब है कि x का मान बढ़ गया है, लेकिन पुराना (गैर वृद्धि हुई) x का मान वापस कर दिया गया है (0 आपके मामले में, ToString लागू किया गया है)।

अपना इच्छित व्यवहार प्राप्त करने के लिए, पूर्व वृद्धि ऑपरेटर ++x का उपयोग करें।

+0

मीठा ... इन सभी वर्षों और मैंने सोचा कि ++ की स्थिति केवल प्रोग्रामर वरीयता थी।चीयर्स – swingdoctor

+1

@ सिन्डरडोक्टर धारणाएं - सभी की मां ...; –

+1

'++ x' कुछ भाषाओं में 'x ++' से भी तेज हो सकती है (क्योंकि मूल मान की प्रतिलिपि बनाई जानी चाहिए और पोस्ट के साथ वापस लौटने के लिए अलग से संग्रहीत किया जाना चाहिए -increment)। आम तौर पर मुझे लगता है कि प्री-एन्हांसमेंट ऑपरेटर का हमेशा उपयोग करना एक अच्छा विचार है क्योंकि अंतर-वृद्धि ऑपरेटर के पास कभी-कभी इरादा परिणाम होता है जब अंतर मायने रखता है। –

2
(++i).ToString(); 

वही करता है जो आप उम्मीद करते हैं।

+0

यह कंपाइलर की एक विषमता है। सी ++। ToString() संकलित करता है, लेकिन ++ c.ToString() नहीं है ...! हालांकि, ++ सी का निहित कास्टिंग इसलिए काम करेगा (++ सी)। टोस्टिंग()। अजीब ... – code4life

+0

@ कोड 4 लाइफ: अजीबता नहीं, ऑपरेटर बाध्यकारी प्राथमिकता का केवल एक परिणाम ... '++ c.ToString()' 'ToString()' –

8

x ++ पोस्ट वृद्धि है; वर्तमान मान (0) परिणाम के रूप में प्रयोग किया जाता है, तो ++ होता है।

जैसा है:

var tmp = count; 
count++; 
Consle.WriteLine(tmp); 

पूर्व वेतन वृद्धि (++ एक्स) कैसा व्यवहार करेंगे जैसा कि आप उम्मीद।

1

आपका मूल कोड हमेशा 0.

दिखाएगा इस प्रयास करें:

(++c).ToString(); 

यह वापस आ जाएगी 1.

From the MSDN site:

पहला रूप एक उपसर्ग वेतन वृद्धि है ऑपरेशन। ऑपरेशन का परिणाम के बाद ऑपरेंड का मान बढ़ाया गया है।

दूसरा फॉर्म एक पोस्टफिक्स वृद्धि ऑपरेशन है। ऑपरेशन का परिणाम से पहले ऑपरेंड का मान बढ़ाया गया है।

+0

द्वारा लौटाई गई स्ट्रिंग को पूर्वनिर्धारित करने का प्रयास है अंतिम वाक्य है बिल्कुल गलत ++ की स्थिति के बावजूद वृद्धि * हमेशा * कॉल करने के लिए ToString() पर होती है। यदि आप मुझ पर विश्वास नहीं करते हैं, तो इसे आजमाएं: स्थैतिक वर्ग एक्स {सार्वजनिक स्थैतिक शून्य एम (यह int x) {Console.WriteLine (C.c); }} कक्षा सी {int सार्वजनिक स्थैतिक int सी = 0; स्थैतिक शून्य मुख्य() {(सी सी ++)। एम(); }} जैसा कि आप देख सकते हैं, सी ** की वृद्धि ** कॉल ** से पहले ** ** ** ** के निष्पादन के बाद ** नहीं होती है। सी # गारंटी देता है कि दुष्प्रभाव बाएं से दाएं क्रम में होते हैं। अधिक जानकारी के लिए –

+0

http://stackoverflow.com/questions/3346450/c-what-is-the-difference-between-i-and-i/3346729#3346729 देखें। –

+0

एएके! मैं संपादित करूंगा। – code4life

-2

नहीं, ++ गिनती वापसी "1"। गिनती ++। ToString() ToString() विधि निष्पादित करें और फिर गिनती बढ़ जाती है, इसलिए यह "0" लौटाती है।

+0

दूसरी वाक्य गलत है। कारण के लिए http://stackoverflow.com/questions/3346450/c-what-is-the-difference-between-i-and-i/3346729#3346729 देखें। –

+0

अपनी टिप्पणी पढ़ना, मुझे संदेह था, और फिर मैंने यह लिखा। यह पुष्टि करता है कि मैं गलत नहीं था: \t सार्वजनिक स्थैतिक शून्य मुख्य() \t { \t \t int cpt = 0; \t \t \t कंसोल। राइटलाइन (सीपीटी ++।तार()); \t \t \t \t cpt = 0; \t \t \t \t कंसोल। राइटलाइन ((++ सीपीटी)। टॉस्ट्रिंग()); \t \t कंसोल। रीडलाइन(); \t} – Seb

+0

एचएम ... मेरा दिमाग खराब हो गया है ... मुझे समझ में नहीं आया कि आपने निष्पादन प्रवाह के बारे में बताया था। मैंने shloud लिखा है "ToString() विधि गैर वृद्धि मूल्य पर निष्पादित किया गया है" – Seb

17

अब तक पोस्ट किए गए कम से कम चार उत्तरों गलत हैं। यह विश्वास करने में एक बेहद आम त्रुटि है कि ++ ऑपरेटर के पास समान बीमार परिभाषित अर्थशास्त्र है क्योंकि यह सी में करता है। ++ ऑपरेटर के अर्थशास्त्र अच्छी तरह से परिभाषित हैं, और यहां गलत उत्तरों द्वारा वर्णित किए गए वर्णन से काफी अलग हैं। ToString()

What is the difference between i++ and ++i?

+0

स्पष्टीकरण के लिए धन्यवाद, एरिक। – code4life

+0

+1, सामान्य रूप से बहुत अंतर्दृष्टिपूर्ण। मैंने निहितार्थ से बचने के लिए अपना जवाब संशोधित कर दिया है कि इसका "पहले होता है" के साथ कुछ करना है। – Heinzi

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