पॉइंटर घोषित करने की आपकी पसंदीदा विधि क्या है?
int* i;
या
int *i;
या
int * i;
या
int*i;
कृपया समझाएं।
इसे भी देखें: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;
-
पॉइंटर घोषित करने की आपकी पसंदीदा विधि क्या है?
int* i;
या
int *i;
या
int * i;
या
int*i;
कृपया समझाएं।
इसे भी देखें: http://www.stroustrup.com/bs_faq2.html#whitespace
int*i;
-
जवाबों:
यदि आप लिखते हैं:
int* i, j, k;
आप भ्रामक रूप से सुझाव देते हैं कि i, j और k के सभी संकेत हैं int
।
तो मुझे लगता है कि यह बेहतर है कि चर नाम से एनेक्स किया जाए।
int * i;
है कि यह केवल एक गैर-दावेदार है क्योंकि यह एक त्वरित नज़र में गुणा की तरह दिखता है।
int*
एक प्रकार के रूप में देखा जाता है, और int* i, j
दो बिंदुओं की घोषणा करता है। प्रश्न को अपूर्ण माना जा सकता है - यह उस भाषा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं जो शैली उचित हैं। CI अनुसरण में int *x
, C # में अन्यथा करता हूं।
मैं पसंद करता हूं int* i
क्योंकि i
टाइप "सूचक से एक इंट" है, और मुझे लगता है कि यह इसे टाइप सिस्टम के साथ समान बनाता है। बेशक, अच्छी तरह से ज्ञात व्यवहार में आता है, जब एक लाइन पर कई बिंदुओं को परिभाषित करने की कोशिश की जाती है (अर्थात्, तारांकित को घोषित करने के लिए प्रत्येक चर नाम से पहले तारांकन को डालने की आवश्यकता होती है), लेकिन मैं बस इस तरह से बिंदुओं की घोषणा नहीं करता हूं। इसके अलावा, मुझे लगता है कि यह सी-स्टाइल भाषाओं में एक गंभीर दोष है।
*i
एक प्रकार का है int
।
C के लिए, जहाँ हमारा प्रकारों पर एक मजबूत ध्यान नहीं है, मुझे पसंद है:
int *i;
क्योंकि यह int
सूचक है, न कि सूचक पर। क्या है int
? *i
int है।
int i = 5
, का मान प्राप्त करने के लिए i
, आप नाम का उपयोग करते हैं i
। इसी तरह, यदि आपके पास है int *i; *i = 5
, तो मूल्य प्राप्त करने के लिए, आप उपयोग करते हैं *i
।
मैंने int* i
सालों से पसंद किया है। हालाँकि, इसके लिए एक मजबूत तर्क है int *i
क्योंकि पूर्व शैली का उपयोग करते समय, आपको अभी भी कई घोषणा नियम याद रखना चाहिए:
int* a, *b; // not int* a, b;
क्योंकि आपको यह नियम याद रखना चाहिए, आप कोई भी सरलता से हासिल नहीं करते हैं - लेकिन मैं यह नहीं कहूंगा कि यह अधिक जटिल है, या तो। एक पंक्ति में कई घोषणाओं से बचना इस नियम को याद रखने का एक और तरीका है। दो शैलियों के बीच अंतर मूक है।
यद्यपि मैं इसका उपयोग करता हूं, फिर भी, यह सी डिक्लेरेशन सिंटैक्स काम करने का दिखावा करने के लिए थोड़ा मूर्खतापूर्ण महसूस करता है, इसके अलावा तारांकन के बजाय टाइप के बगल में तारांकन चिह्न लगाकर करता है जिससे यह वाक्यबद्ध रूप से बाध्य होता है।
मैं इसमें नहीं खरीदता हूं कि एक सूचक प्रकार पर जोर देता है (के लिए i
), जबकि दूसरा *i
अंतर प्रकार पर जोर देता है (के लिए ), लेकिन यह हो सकता है कि 15 साल के बाद सी और सी ++ का उपयोग करें, यह सिर्फ तब होता है जब मैं इसे देखता हूं, बिना इस बारे में सोचने वाले to- सबसे शुरुआती शुरुआती जो इस सवाल को पूछते हैं वे अभी तक नहीं कर सकते हैं।
इसके अलावा, यहां तक कि अपनी पसंद को देखते हुए, मुझे दूसरी शैली में कोड पढ़ना / लिखना अजीब नहीं लगता। संगति, ब्ला ब्ला ब्ला।
जिक्र करने की भी जरूरत नहीं int * i
।
मैं पसंद करता हूं int* i
(सी ++ - शैली)।
मैं परिणामस्वरूप दृश्य अस्पष्टता ( int* i, j
) के कारण एक बयान में कई चर घोषित करने से बचता हूं ।
तर्कसंगतताओं के लिए बज़्ने स्ट्रॉस्ट्रुप की सी ++ शैली और तकनीक के अक्सर पूछे जाने वाले प्रश्न भी देखें ।
यदि आप कई चर घोषित करना चाहते हैं लेकिन तारांकन को दोहराना नहीं चाहते हैं:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(जैसा कि आप संरचना टेम्पलेट के अंदर देख सकते हैं, मुझे पसंद है int* i
शैली है।)
और यहाँ एक अधिक सामान्य समाधान है:
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
यह कोई भी "समस्याग्रस्त प्रकार" के साथ काम करता है, उदाहरण के लिए सरणियाँ और संदर्भ:
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptr
चालबाजी की होगी। ज़रूर, मुझे अलग-अलग पॉइंटर प्रकारों के लिए एक नया टाइपराइफ़ घोषित करना होगा, लेकिन व्यवहार में यह कितने होंगे? आठ सबसे ज्यादा?
मैं के लिए जाना चाहते हैं int* i;
, जबकि दूसरे भाग नाम को दर्शाता है, के बाद से पहले भाग चर का प्रकार (पूर्णांक सूचक) को दर्शाता है ( i
)। यह मेरे लिए समझ में नहीं आता है कि प्रकार है int
और नाम है *i
। इसके अलावा, int * i;
मेरे लिए एक गुणा की तरह लग रहा है।
जिन घोषणाओं में मैं उपयोग करता हूं int * i;
, आप उसे इस रूप में पढ़ेंi is a pointer to an integer
।
पॉइंटर टाइप और वैरिएबल दोनों में योगदान देता है इसलिए इसे बीच में होना चाहिए।
एक ही पंक्ति में कई चीजों की घोषणा करने से बचना अच्छी बात है: int * i, j;
मैं वास्तव में विशिष्ट परिस्थितियों में सभी तीन सम्मेलनों का उपयोग करता हूं। पहली नज़र में मैं असंगत लगता हूँ, लेकिन ...
int *
जब पहचानकर्ता मौजूद नहीं होता है, तो नेत्रहीन यह सुदृढ़ करने के लिए कि नाम मौजूद नहीं है।int* intptr
पर typedef
है और इसी तरह की घोषणाओं नेत्रहीन सुदृढ़ करने के लिए उस प्रकार के यह की ओर से। इसी तरह फ़ंक्शन पॉइंटर घोषणाओं के साथ:(int* (*foo)(int))
int *identifier
और class &identifier
फंक्शन पैरामीटर्स पर नेत्रहीन रूप से सुदृढ़ करने के लिए कि पैरामीटर संभवतः एक तथाकथित "आउट" पैरामीटर है।const int * const * const
जब भी मैं cv क्वालिफायर का उपयोग करता हूं ।int * foo;
स्थानीय घोषणाओं पर।मुझे लगता है कि मैं कुछ हद तक नेत्रहीन हूं।
C में कोई सूचक प्रकार नहीं हैं! तो, "int *" का मतलब कुछ भी नहीं है। तारांकन हमेशा इसके ठीक लिखे गए तत्व से जुड़ा होता है, यह उसी तत्व के अंतर्गत आता है। "* i" एक इंट है। और * i के कारण एक int है, यह निम्नानुसार है कि मैं int का सूचक है। इसके पीछे तर्क है और यही कारण है कि "int * i" एकमात्र संभव समाधान है। बाकी सब कुछ एक भ्रम है (जो ज्यादातर मामलों में कंपाइलर द्वारा स्वचालित रूप से ठीक किया जाता है)। C ++ और C # में यह कुछ अलग है। लेकिन सी के लिए केवल एक बाइबिल है: "डेनिस एम। रिची: द सी प्रोग्रामिंग लैंग्वेज"। डेनिस (RIP!) ने इसे लिखा: "int * i"। इस पर सवाल उठाने की जरूरत नहीं है।
int*
एक सूचक प्रकार है।