दिलचस्प पोस्ट
सी कोड में त्रुटि संभाल डाटाब्लूल से ब्लॉब? प्रोग्रामेटिक रूप से एक रंग हल्का है Kinect उपयोगकर्ता खोज गिट: एक लाइक-रिमोट लाओ? प्रकार के मामले पर स्विच करें # JqGrid में एकाधिक खोज कैसे कार्यान्वित करें एएसपी.नेट 5 WCF सेवा संदर्भ जोड़ें छवि रंग प्राप्त करें SQLSTATE : अमान्य पैरामीटर संख्या: बाउंड वैरिएबल की संख्या लाइन 102 पर टोकनों की संख्या से मेल नहीं खाती लाइनों में स्ट्रिंग विभाजित करने का सर्वोत्तम तरीका Xcode 4.4 त्रुटि – लॉन्च करने के लिए ऐप के लिए प्रतीक्षा समाप्त हो गई Android.os.DeadObjectException एंड्रॉइड एक्स कैसे ठीक करें Std :: नक्शा में कुंजी के रूप में char * का उपयोग करना लिनक "अभिव्यक्ति का … एसक्यूएल में अनुवाद नहीं कर सका और इसे स्थानीय अभिव्यक्ति के रूप में नहीं माना जा सका।"

वेरिएबल के नाम से पहले स्टाइल, बजाय टाइप के बाद क्यों?

क्यों सबसे सी प्रोग्रामर इस तरह नाम चर:

int *myVariable; 

इस तरह से:

 int* myVariable; 

दोनों वैध हैं यह मुझे लगता है कि तारांकन प्रकार का एक हिस्सा है, चर का एक हिस्सा नहीं है क्या कोई इस तर्क को समझा सकता है?

Solutions Collecting From Web of "वेरिएबल के नाम से पहले स्टाइल, बजाय टाइप के बाद क्यों?"

वे बिल्कुल बराबर हैं हालांकि, में

 int *myVariable, myVariable2; 

ऐसा लगता है कि मेरे वैरिएबल का प्रकार int * है , जबकि myVariable2 का प्रकार int है में

 int* myVariable, myVariable2; 

ऐसा प्रतीत हो सकता है कि दोनों प्रकार के प्रकार * int * के होते हैं , लेकिन यह सही नहीं है क्योंकि मेरी myVariable2 में टाइप myVariable2 है

इसलिए, पहली प्रोग्रामिंग शैली अधिक सहज है।

यदि आप इसे दूसरे तरीके से देखते हैं, तो मेरा *myVariable प्रकार का प्रकार है, जो कुछ समझ में आता है।

क्योंकि * प्रकार की तुलना में चर से अधिक निकटता से बांधता है:

 int* varA, varB; // This is misleading 

हालांकि, यहां तक ​​कि सबसे अच्छी एकल-पंक्ति घोषणाएं मेरे प्रति सहज-प्रतीत होती हैं, क्योंकि * इस प्रकार का एक हिस्सा है। मैं इसे इसके बजाय करना चाहता हूं:

 int* varA; int varB; 

हमेशा की तरह, कम आपके कॉम्पैक्ट कोड, अधिक पठनीय है यह। 😉

मैं यहां एक अंग पर बाहर जा रहा हूं और कहता हूं कि इस प्रश्न का सीधा जवाब है , वेरिएबल डिस्क्रिप्शन के लिए और पैरामीटर और रिटर्न प्रकार के लिए, जो कि तारांकन चिह्न नाम के आगे जाना चाहिए: int *myVariable; । सराहना के लिए, आप सी में अन्य प्रकार के प्रतीक कैसे घोषित करते हैं:

int my_function(int arg); एक समारोह के लिए;

एक सरणी के लिए float my_array[3]

सामान्य पैटर्न, जिसे घोषणापत्र के रूप में संदर्भित किया जाता है, इसका उपयोग करता है , यह है कि नाम के पहले, और नाम के चारों ओर एक प्रतीक के भाग में, और नाम के आसपास के इन हिस्सों को सिंटैक्स की नकल के रूप में विभाजित किया जाता है जिसे आप प्राप्त करने के लिए उपयोग करेंगे बाईं ओर प्रकार का मान:

int a_return_value = my_function(729);

float an_element = my_array[2];

और: int copy_of_value = *myVariable;

सी ++ संदर्भों के साथ काम करता है एक स्पैनर फेंकता है, क्योंकि उस बिंदु पर वाक्यविन्यास जहां आप संदर्भ का उपयोग करते हैं वह मूल्य प्रकार के समान है, इसलिए आप तर्क दे सकते हैं कि C ++ सी के लिए एक अलग दृष्टिकोण लेता है। दूसरी ओर, सी ++ एक ही रहता है संकेतक के मामले में सी का व्यवहार, इसलिए संदर्भ वास्तव में इस संबंध में अजीब एक के रूप में खड़े हैं।

यहाँ कुछ भी यहाँ उल्लेख नहीं किया है कि यह तारांकन वास्तव में सी में " dereference ऑपरेटर " है

 *a = 10; 

ऊपर दी गई रेखा का यह अर्थ नहीं है कि मैं 10 से a को असाइन करना चाहता हूं, इसका मतलब है कि मैं 10 को किसी भी मेमोरी स्थान को a बिंदु के रूप में निर्दिष्ट करना चाहता हूं। और मैंने कभी किसी को भी लिखना नहीं देखा है

 * a = 10; 

क्या तुम? तो dereference ऑपरेटर बहुत ज्यादा हमेशा एक अंतरिक्ष के बिना लिखा है संभवत: इसे एकाधिक पंक्तियों में टूटी हुई गुणा से अलग करना है:

 x = a * b * c * d * e * f * g; 

यहाँ *e भ्रामक होगा, है ना?

ठीक है, अब निम्नलिखित पंक्ति का क्या अर्थ है:

 int *a; 

अधिकांश लोग कहेंगे:

इसका मतलब है कि a एक int मान के लिए एक सूचक है।

ये तकनीकी रूप से सही है, ज्यादातर लोग इसे पढ़ते हैं / पढ़ते हैं और इसी तरह से आधुनिक सी मानकों को कैसे परिभाषित किया जाता है (ध्यान दें कि भाषा सी स्वयं सभी एएनएसआई और आईएसओ मानकों की भविष्यवाणी करता है)। लेकिन यह देखने का एकमात्र तरीका नहीं है। आप निम्नानुसार इस लाइन को भी पढ़ सकते हैं:

एक के dereferenced मान a प्रकार int

इसलिए वास्तव में इस घोषणापत्र में तारांकन को एक डिफरेंस ऑपरेटर के रूप में देखा जा सकता है, जो इसके प्लेसमेंट को भी बताता है। और यह कि a सूचक वास्तव में बिल्कुल नहीं घोषित किया गया है, यह इस तथ्य से निहित है, कि केवल एक चीज आप वास्तव में dereference कर सकते हैं एक सूचक है

सी मानक केवल * ऑपरेटर के लिए दो अर्थ परिभाषित करता है:

  • इंडिरेक्शन ऑपरेटर
  • गुणन ऑपरेटर

और indirection सिर्फ एक ही अर्थ है, एक सूचक घोषित करने के लिए कोई अतिरिक्त अर्थ नहीं है, वहाँ सिर्फ indirection है, जो कि dereference ऑपरेशन क्या करता है, यह एक अप्रत्यक्ष प्रवेश करता है, तो भी int *a; यह एक अप्रत्यक्ष प्रवेश है ( * अप्रत्यक्ष प्रवेश का मतलब है) और इस तरह ऊपर दिए गए दूसरे बयान पहले की तुलना में मानक के करीब है।

यह वरीयता का मामला है

जब आप कोड पढ़ते हैं, तो दूसरे मामले में चर और पॉइंटर्स के बीच भेद करना आसान होता है, लेकिन जब आप एक ही पंक्ति में एक सामान्य प्रकार के दोनों चर और पॉइंटर्स दोनों को डालते हैं, (जो कि अक्सर परियोजना दिशानिर्देशों द्वारा अक्सर निराश हो जाता है) क्योंकि पठनीयता घटती है)।

मैं नाम टाइप करने के बगल में उनके संबंधित चिह्न के साथ पॉइंटर्स घोषित करना पसंद करता हूं, उदा

 int* pMyPointer; 

एक महान गुरु ने एक बार कहा था, "इसे संकलक के तरीके से पढ़ें, आपको चाहिए।"

http://www.drdobbs.com/conversationsa-midsummer-nights-madness/184403835

यह निश्चित है कि const प्लेसमेंट के विषय पर था, लेकिन वही नियम यहां लागू होता है।

कंपाइलर इसे इस रूप में पढ़ता है:

 int (*a); 

नहीं के रूप में:

 (int*) a; 

यदि आप वेरिएबल के बगल में स्टार रखने की आदत में आते हैं, तो यह आपकी घोषणाओं को पढ़ने में आसान बना देगा। यह आँखों से बचा जाता है जैसे कि:

 int* a[10]; 

क्योंकि जब आपके पास घोषणाएं होती हैं तो यह अधिक समझ में आता है:

 int *a, *b; 

कई बिंदुओं को एक पंक्ति में घोषित करने के लिए, मैं int* a, * b; जो अधिक सहजता से एक पूर्णांक में एक सूचक के रूप में "ए" घोषित करता है, और इसी तरह "बी।" घोषित होने पर शैलियों को मिला नहीं करता है जैसे किसी ने कहा, मैं वही बयान में दो अलग-अलग प्रकार के घोषित नहीं करता।

के आर में, वे टाइपर के बजाय वेरिएबल नाम के बगल में सूचक ऑपरेटर रखते हैं। निजी तौर पर, मैं उस पुस्तक को अंतिम सी प्राधिकरण / बाइबल मानता हूं। इसके अलावा एक उद्देश्य-सी पृष्ठभूमि से आ रहा है, मैं * नाम सम्मेलन का पालन करता हूं।

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