C में मनमानी ब्लॉकों का मुहावरेदार उपयोग क्या है?


15

एक ब्लॉक निष्पादित किए जाने वाले बयानों की एक सूची है। C में ब्लॉक कहां आते हैं, उदाहरण थोड़ी देर के बाद और यदि कथन में हैं

while( boolean expression)
    statement OR block

if (boolean expression)
    statement OR block

C किसी ब्लॉक में ब्लॉक होने की अनुमति भी देता है। मैं चर नामों का पुन: उपयोग करने के लिए इसका उपयोग कर सकता हूं, मान लीजिए कि मुझे वास्तव में 'x' पसंद है

int x = 0;
while (x < 10)
{
    {
        int x = 5;
        printf("%d",x)
    }
    x = x+1;
}

5 दस बार नंबर प्रिंट करेगा। मुझे लगता है कि मैं उन स्थितियों को देख सकता हूं जहां चर नामों की संख्या कम रखना वांछनीय है। शायद स्थूल विस्तार में। हालाँकि, मुझे इस सुविधा की आवश्यकता के लिए कोई कठिन कारण दिखाई नहीं दे रहा है। क्या कोई मुझे कुछ मुहावरों की आपूर्ति करके इस सुविधा के उपयोग को समझने में मदद कर सकता है जहाँ इसका उपयोग किया जाता है।


1
ईमानदारी से, मैं केवल सी सिंटैक्स को समझने की कोशिश कर रहा हूं, और उत्सुक हूं।
जोनाथन गलाघर

C की भावना प्रोग्रामर पर भरोसा करना है। प्रोग्रामर के पास अपने निपटान में कुछ महान बनाने के लिए ... या कुछ भयानक बनाने की शक्ति है। व्यक्तिगत रूप से, मुझे ओवरलोडेड वैरिएबल नाम पसंद नहीं हैं, लेकिन एक और प्रोग्रामर हो सकता है। दिन के अंत में अगर हम पूरा कर रहे हैं तो हम न्यूनतम कीड़े के साथ क्या कर रहे हैं ... हमें क्यों बहस करनी चाहिए?
फिडिंग बिट्स

1
यही वह अनुभूति है जो मैं सी से प्राप्त करता हूं। मैं सिंटैक्स के लिए हूं जो कोडिंग की विभिन्न शैलियों का समर्थन करता है (साथ ही जब तक भाषा का शब्दार्थ ठीक है)। यह सिर्फ इतना है कि ... मैंने इसे देखा, और मेरी तत्काल प्रतिक्रिया थी, मैं एक स्रोत-से-स्रोत परिवर्तन लागू कर सकता था, जिसमें ब्लॉक के सभी चर को नए नाम के साथ बदल दिया गया, और ब्लॉक को पूरी तरह से समतल कर दिया। किसी भी समय मुझे लगता है कि मैं कुछ से छुटकारा पा सकता हूं, मुझे लगता है कि कुछ ऐसा है जो मैंने याद किया है।
जोनाथन गलाघर

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

जवाबों:


8

यह विचार चर नामों की संख्या कम रखने या अन्यथा नामों के पुन: उपयोग को प्रोत्साहित करने के लिए नहीं है, बल्कि चर के दायरे को सीमित करने के लिए है। यदि आपके पास है:

int x = 0;
//...
{
    int y = 3;
    //...
}
//...

तब का दायरा yब्लॉक तक सीमित है, जिसका अर्थ है कि आप ब्लॉक के पहले या बाद में इसके बारे में भूल सकते हैं। आप इसका उपयोग छोरों और सशर्तियों के संबंध में सबसे अधिक बार करते हैं। आप इसे C ++ जैसी सी भाषाओं में भी अधिक बार देखते हैं, जहां एक चर दायरे से बाहर होने के कारण यह विनाश होता है।


मुझे लगता है कि ब्लॉक स्वाभाविक रूप से सशर्त, लूप और फ़ंक्शन बॉडी के साथ होता है। मैं इस बारे में उत्सुक हूं कि सी में, मैं कहीं भी एक ब्लॉक रख सकता हूं। C ++ के बारे में आपकी दूसरी टिप्पणी दिलचस्प है - कि एक गुंजाइश छोड़ने से विनाश होता है। क्या यह केवल कचरा संग्रहण का जिक्र है, या निम्नलिखित एक और उपयोग है: क्या मैं एक फ़ंक्शन बॉडी ले सकता हूं, जिसमें अलग-अलग "अनुभाग" हैं और वेरिएबल स्पेस के विनाश को ट्रिगर करके मेमोरी फ़ुटप्रिंट को नियंत्रित करने के लिए ब्लॉक का उपयोग करें?
जोनाथन गलाघर

1
जहां तक ​​मुझे जानकारी है, C फ़ंक्शन में सभी चर के लिए सभी मेमोरी का प्रचार करेगा। किसी फ़ंक्शन के माध्यम से उनके पास स्कोप स्कोप का तरीका होने से सी में कोई प्रदर्शन लाभ नहीं होगा। इसी तरह वेरिएबल्स के "केवल कभी-कभी" स्कोप होने से फंक्शन के लिए किसी भी कॉल के दौरान मेमोरी फ़ुटप्रिंट नहीं बदलेगा
Gankro

यदि कई अनन्य नेस्टेड स्कोप हैं तो @Gankro पर इसका प्रभाव पड़ सकता है। एक कंपाइलर इन स्कोपों ​​में से प्रत्येक में चर के लिए मेमोरी के एक अनूठे प्रचारित चंक का पुन: उपयोग कर सकता है। बेशक, इसका कारण यह नहीं आता है कि यदि एक एकल मनमाना दायरा पहले से ही एक संकेत है, तो आपको शायद किसी फ़ंक्शन को निकालने की आवश्यकता है, दो या अधिक मनमाने तरीके से स्कोप निश्चित रूप से एक अच्छा संकेत है जिसे आपको रिफ्लेक्टर करने की आवश्यकता है। फिर भी, यह समय-समय पर स्विच केस ब्लॉक जैसी चीजों में एक सेंस समाधान के रूप में पॉप अप करता है।
tne

16

क्योंकि सी के पुराने दिनों में नए चर केवल एक नए ब्लॉक में घोषित किए जा सकते थे।

इस तरह से प्रोग्रामर एक फंक्शन के बीच में नए वेरिएबल को लीक किए बिना और स्टैक का इस्तेमाल कम से कम कर सकते हैं।

आज के ऑप्टिमाइज़र के साथ यह बेकार है और एक संकेत है जिसे आपको अपने फ़ंक्शन में ब्लॉक निकालने पर विचार करने की आवश्यकता है।

स्विच स्टेटमेंट में, दोहरे घोषणा से बचने के लिए मामलों को अपने स्वयं के ब्लॉक में संलग्न करना उपयोगी है।

C ++ में यह RAII लॉक गार्ड के लिए उदाहरण के लिए बहुत उपयोगी है और यह सुनिश्चित करने के लिए कि जब निष्कासन कार्यक्षेत्र से बाहर चला जाए और तब भी महत्वपूर्ण सेक्शन के बाहर अन्य सामान कर रहा हो, तब डिस्ट्रक्टर्स रिलीज़ लॉक को चलाना सुनिश्चित करें।


2
RAII लॉक गार्ड के लिए +1। यह कहा जा रहा है, यह एक ही अवधारणा भी एक दिनचर्या के हिस्से के भीतर बड़े ish स्टैक बफर सौदा के लिए उपयोगी नहीं हो सकता है? मैंने इसे कभी नहीं किया है, लेकिन कुछ ऐसा लगता है जो निश्चित रूप से कुछ एम्बेडेड कोड में हो सकता है ...
J Trana

2

मैं इसे "मनमाने" ब्लॉक के रूप में नहीं देखूंगा। यह डेवलपर उपयोग के लिए बहुत अधिक विशेषता नहीं है, लेकिन जिस तरह से सी ब्लॉक का उपयोग करता है उसी ब्लॉक निर्माण को एक ही शब्दार्थ के साथ कई स्थानों पर उपयोग करने की अनुमति मिलती है। एक ब्लॉक (सी में) एक नया क्षेत्र है, और चर जो इसे छोड़ देते हैं, वे समाप्त हो जाते हैं। यह एक समान है कि ब्लॉक का उपयोग कैसे किया जाए।

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

मैंने शायद ही कभी सी या सी ++ में उपयोग किए जाने वाले स्टैंडअलोन ब्लॉकों को देखा है - अक्सर जब एक बड़ी संरचना या एक वस्तु होती है जो एक कनेक्शन या कुछ का प्रतिनिधित्व करती है जिसे आप विनाश के लिए मजबूर करना चाहते हैं। आमतौर पर यह एक संकेत है कि आपका कार्य बहुत सारी चीजें कर रहा है और / या बहुत लंबा है।


1
दुर्भाग्य से मैं नियमित रूप से अकेले ब्लॉक देखता हूं - लगभग सभी मामलों में क्योंकि फ़ंक्शन बहुत कुछ कर रहा है और / या बहुत लंबा है।
मटनज़

मैं नियमित रूप से C ++ में स्टैंडअलोन ब्लॉक देखता हूं और लिखता हूं, लेकिन केवल तालों और अन्य साझा संसाधनों के आसपास रैपर को नष्ट करने के लिए मजबूर करता हूं।
जे ट्राना

2

आपको महसूस करना होगा, प्रोग्रामिंग सिद्धांत जो स्पष्ट लगते हैं कि अब हमेशा नहीं थे। C सर्वोत्तम अभ्यास इस बात पर निर्भर करता है कि आपके उदाहरण कितने पुराने हैं। जब C को पहली बार पेश किया गया था, तो आपके कोड को छोटे कार्यों में तोड़ना बहुत अक्षम माना जाता था। डेनिस रिची ने मूल रूप से झूठ बोला और कहा कि फ़ंक्शन कॉल वास्तव में सी में कुशल थे (वे उस समय नहीं थे), जो कि लोगों को मिला उन्हें अधिक उपयोग करना शुरू कर दिया, हालांकि सी प्रोग्रामर किसी भी तरह से वास्तव में समय से पहले अनुकूलन की संस्कृति से पूरी तरह से जुड़े नहीं थे।

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

हालाँकि, मैंने 20 साल पहले C में प्रोग्रामिंग शुरू की थी, जब आपको अपने सभी वेरिएबल्स को एक स्कोप के शीर्ष पर घोषित करना होता था, और मुझे वैरिएबल शैडोइंग की याद नहीं आती है, जिसे कभी अच्छी शैली माना जाता है। एक स्विच स्टेटमेंट में एक के बाद एक दो ब्लॉक में रिडकलरिंग, हाँ, लेकिन छायांकन नहीं। हो सकता है कि चर पहले से ही इस्तेमाल किया गया था और विशिष्ट नाम एपीआई आप कॉल कर रहे हैं, जैसे के लिए अत्यधिक मुहावरेदार था अगर destऔर srcमें strcpy, उदाहरण के लिए।


1

मध्यस्थ ब्लॉक मध्यस्थ बिस्तरों को पेश करने के लिए उपयोगी होते हैं जो केवल एक संगणना के विशेष मामलों में उपयोग किए जाते हैं।

यह वैज्ञानिक कंप्यूटिंग में एक सामान्य पैटर्न है, जहां संख्यात्मक प्रक्रियाएं आमतौर पर होती हैं:

  1. बहुत सारे मापदंडों या मध्यस्थ मात्रा पर भरोसा करें;
  2. कई विशेष मामलों से निपटना होगा।

दूसरे बिंदु के कारण, यह सीमित दायरे के अस्थायी चर को पेश करने के लिए उपयोगी है, जो एक मनमाने ढंग से ब्लॉक का उपयोग करके या एक सहायक फ़ंक्शन को शुरू करके विकराल प्राप्त किया जाता है।

एक सहायक समारोह की शुरुआत करते समय कोई ब्रेनर की तरह लग सकता है या नेत्रहीन पालन करने के लिए सबसे अच्छा अभ्यास, वास्तव में ऐसा करने के लिए बहुत कम लाभ हैं , इस विशेष स्थिति में ।

क्योंकि इसमें बहुत सारे पैरामीटर और मध्यस्थ मात्राएं हैं, हम इन्हें सहायक कार्य में पारित करने के लिए एक संरचना पेश करना चाहते हैं।

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

इसलिए ये सहायक संरचनाएं आमतौर पर बोझिल होती हैं और उनका उपयोग करने का मतलब है कोड-ब्लॉट के बीच चयन करना या एक अमूर्तता का परिचय देना जिसका दायरा बहुत व्यापक है और प्रोग्राम के अर्थ को कमजोर करने के बजाय इसे कमजोर कर देता है

सहायक कार्यों का परिचय एक महीन परीक्षण बारीकियों को पेश करके कार्यक्रम के इकाई परीक्षण को आसान बना सकता है लेकिन निम्न स्तर की प्रक्रियाओं और प्रतिगमन के रूप में प्रतिगमन परीक्षण (संख्यात्मक रूप से) प्रक्रियाओं के संख्यात्मक निशान के संयोजन के लिए इकाई परीक्षण को एक समान रूप से अच्छा काम करता है ।


0

सामान्य तौर पर, इस तरह से चर नामों का पुन: उपयोग आपके कोड के भविष्य के पाठकों के लिए बहुत भ्रम पैदा करता है। केवल अंदर के चर को कुछ और नाम देना बेहतर है। वास्तव में, सी # भाषा विशेष रूप से इस तरह से चर के उपयोग को रोकती है।

मैं देख सकता हूं कि वृहद नामकरण टकराव को रोकने के लिए मैक्रो विस्तार में नेस्टेड ब्लॉक का उपयोग कैसे उपयोगी होगा।


0

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

switch(foo) {
   case 1:
      {
         // bar
      }
   case 2:
   case 3:
      // baz
      break;
   case 4:
   case 5:
      // bang
      break;
}

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

मेरे मामले में, अगर मैं सही ढंग से याद करता हूं, तो अधिकांश मामले एक ही कोड के मामूली बदलाव थे - सिवाय इसके कि उनमें से एक दूसरे के समान था, सिर्फ अतिरिक्त प्रीप्रोसेसिंग के साथ। कोड लेने के लिए एक स्विच सबसे सरल रूप में समाप्त हो गया, और अतिरिक्त स्कोप ने अतिरिक्त स्थानीय चर के उपयोग की अनुमति दी जो इसे और आगे के मामलों के बारे में चिंता करने की ज़रूरत नहीं थी (जैसे कि चर नाम गलती से स्विच से पहले परिभाषित एक के साथ अतिव्यापी लेकिन बाद में इस्तेमाल किया)।

ध्यान दें कि स्विच स्टेटमेंट बस इसका उपयोग है जिसे मैंने चलाया है। मुझे यकीन है कि यह कहीं और भी लागू हो सकता है, लेकिन मुझे याद नहीं है कि उन्हें प्रभावी तरीके से इस्तेमाल करते हुए देख रहा हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.