2011-12-30 20 views
11

इस कोड:क्या int और a और int और a के बीच कोई अंतर है?

int a = 5; 
int& b = a; 
b = 7; 
cout << a; 

से 7 प्रिंट, और int &b साथ int& b की जगह भी बाहर प्रिंट 7.

वास्तव में तो int&b और int & b करता है।

मैंने इस तरह के व्यवहार को एक साधारण वर्ग के साथ भी परीक्षण किया। आम तौर पर, क्या इससे कोई फर्क पड़ता है कि एम्पर्सेंड को प्रकार और पहचानकर्ता के सापेक्ष रखा गया है या नहीं? धन्यवाद।

+1

कोई इससे कोई फर्क नहीं पड़ता। – Nerdtron

उत्तर

15

नहीं, कोडिंग शैली को छोड़कर बिल्कुल कोई अंतर नहीं है। मुझे लगता है कि शैली कोडिंग के बारे में मुख्य तर्क है इस घोषणा कि:

int& a, b; 

एक int& और b एक int के रूप में के रूप में a की घोषणा की।

+0

धन्यवाद, इसके लिए बाहर देखेंगे। – newprogrammer

+0

@Ryan मुझे लगता है कि int & a, b; संकलन त्रुटि देगा क्योंकि संदर्भ घोषित किया गया है लेकिन प्रारंभ नहीं किया गया है। – Shailesh

+0

@ शैलेश: ठीक है, यह 'int & a = foo, b = bar' होगा। – Ryan

1

यह कंपाइलर को जिस तरह से लिखा गया है, उससे कोई फर्क नहीं पड़ता है। जो सही है कोड शैली का मामला है।

9

सी-जैसी भाषाओं में, व्हाइटस्पेस ज्यादातर इससे कोई फर्क नहीं पड़ता।

सभी संस्करणों आप एक ही तीन टोकन के रूप में पार्स सूचीबद्ध:

  • int
  • &
  • b

तो वे संकलक के लिए एक ही मतलब है।

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

using namespace std;int a=5;int&b=a;b=7;cout<<a; 

शेष खाली स्थान के लिए आवश्यक है:

तो अपने कोड के रूप में कम हो सकता है।

+0

व्हाइटसाइट की आवश्यकता होने पर स्पष्टीकरण के लिए धन्यवाद। – newprogrammer

+1

यह एक और बार मायने रखता है मैक्रो परिभाषाएं है। यदि फ़ंक्शन नाम और निम्न खुले कोष्ठक के बीच कोई स्थान नहीं है, तो मैक्रो फ़ंक्शन-जैसा है। यदि वहां है, तो कंस्ट्रैसिस प्रतिस्थापन सूची का हिस्सा है। –

4

सामान्यतः, क्या इससे कोई फर्क पड़ता है कि एम्पर्सेंड को प्रकार और पहचानकर्ता के सापेक्ष रखा गया है या नहीं?

उदाहरण तैनात यह कोई बात नहीं है, लेकिन वहाँ मामलों में जहां यह करता हैं:

int & a, b; // b is not a ref 
int const * a; // pointer to const int 
int * const a; // const pointer to int 

हमेशा की तरह, खाली स्थान के फर्क नहीं पड़ता।

1

इससे कोई फर्क नहीं पड़ता क्योंकि सी/सी ++/जावा ये भाषाएं अंतरिक्ष संवेदनशील नहीं हैं।

int& a; // & associated with type 
int &a; // & associated with variable 

& या * प्रकार नाम के साथ संबद्ध कर रहा है एक अलग सूचक प्रकार है करने के लिए प्रोग्रामर की इच्छा को दर्शाता है:

1

इन दोनों कार्यात्मक रूप से बराबर घोषणाओं हैं। हालांकि, & या * को चर के बजाय टाइप नाम के साथ जोड़ने की कठिनाई यह है कि औपचारिक C++ वाक्यविन्यास के अनुसार, न तो & और न ही * चर की सूची में वितरक है। इस प्रकार, आसानी से भ्रामक घोषणाएं बनाते हैं। उदाहरण के लिए, निम्नलिखित घोषणा एक, दो नहीं, पूर्णांक संदर्भ बनाता है।

int& a, b; 

यहाँ, b एक पूर्णांक (नहीं एक पूर्णांक संदर्भ), क्योंकि जब एक घोषणा में इस्तेमाल किया, & (या *) अलग-अलग चर से जुड़ा हुआ है इससे पहले आने वाली, टाइप करने के लिए नहीं के रूप में घोषित किया जाता है यह इस प्रकार है। इस घोषणा के साथ समस्या यह है कि, दृष्टि से दोनों ए और बी संदर्भ प्रकारों के प्रतीत होते हैं, भले ही केवल a एक संदर्भ है, इस प्रकार दृश्य भ्रम न केवल नौसिखिया C++ प्रोग्रामर को गुमराह करता है, लेकिन कभी-कभी प्रोग्रामर भी अनुभव करता है।

इससे कोई फर्क नहीं पड़ता कि आप int &a या int& aC++ कंपाइलर के लिए लिखते हैं या नहीं। हालांकि, भ्रम से बचने के लिए, & और * प्रकार के बजाय परिवर्तनीय से जुड़ा होना चाहिए।

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