C ऑटो कीवर्ड का उपयोग कहाँ किया जाता है?


104

अपने कॉलेज के दिनों में मैंने autoकीवर्ड के बारे में पढ़ा और समय के साथ मैं वास्तव में भूल गया कि यह क्या है। इसे इस प्रकार परिभाषित किया गया है:

स्थानीय चर को स्थानीय जीवनकाल के रूप में परिभाषित करता है

मैंने कभी नहीं पाया कि इसका उपयोग कहीं भी किया जा रहा है, क्या यह वास्तव में उपयोग किया जाता है और यदि ऐसा है तो इसका उपयोग कहां और किन मामलों में किया जाता है?

जवाबों:


90

autoएक संशोधक की तरह है static। यह एक चर के भंडारण वर्ग को परिभाषित करता है। हालाँकि, चूंकि स्थानीय चर के लिए डिफ़ॉल्ट है auto, आपको इसे मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता नहीं है।

यह पृष्ठ सी में विभिन्न भंडारण वर्गों को सूचीबद्ध करता है।


13
किसी के अपोजिट मेरे जवाब के बाद बस फिर से यही देख रहा था। आप कहते हैं कि "सामान्य रूप से इसे मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता नहीं है।" मुझे सिर्फ यह पूछना है: क्या वास्तव में ऐसी परिस्थिति है जिसमें निर्दिष्ट किया auto जा सकता है लेकिन डिफ़ॉल्ट रूप से ऐसा नहीं होगा?
जेरी कॉफिन

2
@ जेरीकॉफिन सी में नहीं। सी ++ 11 में, इसे फिर से तैयार किया गया है और आप इसका उपयोग प्रभावी रूप से स्थानीय वैरिएबल प्रकार की इंट्रेंस प्राप्त करने के लिए कर सकते हैं।
मेहरदाद अफश्री

2
एक संभावित उपयोग GNU C में नेस्टेड फ़ंक्शंस की आगे की घोषणा में है - हालांकि यह मूल परिभाषा का अपहरण है autotigcc.ticalc.org/doc/keywords.html#auto
josiah

2
जुड़ा हुआ पेज पुराना है। C11 के बाद से, _Thread_localविवरण भी है : en.cppreference.com/w/c/language/storage_duration और stackoverflow.com/a/14289720/6557621
MCCCS

132

यदि आप IAQ (आमतौर पर पूछे जाने वाले प्रश्न) सूची को पढ़ेंगे , तो आपको पता चल जाएगा कि ऑटो मुख्य रूप से परिभाषित करने या किसी वाहन को घोषित करने के लिए उपयोगी है:

auto my_car;

एक वाहन जो लगातार बाहर पार्क किया जाता है:

extern auto my_car;

उन लोगों के लिए जिनमें हास्य की कोई कमी नहीं है और वे चाहते हैं कि "सिर्फ तथ्य मैम": संक्षिप्त जवाब यह है कि इसका उपयोग करने का कोई कारण नहीं है auto। आपके द्वारा उपयोग किए जाने की अनुमति केवल autoएक चर के साथ है, जिसमें पहले से ही autoभंडारण वर्ग है, इसलिए आप बस कुछ ऐसा निर्दिष्ट कर रहे हैं जो वैसे भी होगा। autoकिसी भी वैरिएबल पर उपयोग करने का प्रयास जिसमें autoस्टोरेज क्लास नहीं है, जिसके परिणामस्वरूप कंपाइलर आपके कोड को अस्वीकार कर देगा। मुझे लगता है कि यदि आप तकनीकी प्राप्त करना चाहते हैं, तो आपके कार्यान्वयन के लिए संकलक नहीं होना चाहिए (लेकिन यह है) और यह सैद्धांतिक रूप से नैदानिक ​​जारी करने के बाद कोड को संकलित करना जारी रख सकता है (लेकिन यह नहीं होगा)।

द्वारा छोटे परिशिष्ट kaz :

वहाँ भी:

static auto my_car;

जिसे ISO C. के अनुसार डायग्नोस्टिक की आवश्यकता होती है। यह सही है, क्योंकि यह घोषणा करता है कि कार टूट गई है। नैदानिक ​​नि: शुल्क है, लेकिन डैशबोर्ड की रोशनी को बंद करने से आपको अस्सी डॉलर खर्च होंगे। (बीस या उससे कम, यदि आप ईबे से ऑन-बोर्ड डायग्नोस्टिक्स के लिए अपना स्वयं का यूएसबी डोंगल खरीदते हैं)।

उपर्युक्त के लिए extern auto my_carभी एक नैदानिक ​​की आवश्यकता होती है, और इस कारण से यह कभी भी संकलक के माध्यम से नहीं चलाया जाता है, इसके अलावा शहर के कर्मचारियों द्वारा पार्किंग प्रवर्तन के साथ काम किया जाता है।

यदि आप extern static auto ...किसी भी कोड आधार में बहुत कुछ देखते हैं , तो आप एक खराब पड़ोस में हैं; एक बेहतर काम के लिए तुरंत देखो, इससे पहले कि पूरी जगह जंग में बदल जाए।


@ स्वयं: आईएसओ को "आईएसओ 2011" का पता नहीं लगता है। आप क्या मानते हैं कि यह मानकीकृत हो सकता है?
जेरी कॉफिन

6
यह एक अच्छी बात है कि मेरे मुंह में कॉफी, कोला, स्टाउट या कुछ अन्य गहरे रंग का तरल पदार्थ नहीं था। आप मुझे एक कंप्यूटर स्क्रीन, @JerryCoffin देना चाहेंगे, क्या यह मामला था। सबसे अच्छा कभी!
डेविड हैमेन

2
@ दान: यह ईमानदारी से आपको पाठ की 5 पंक्तियों को पढ़ने के लिए "काफी समय" लगा, और उस भाग के लिए प्राप्त करें जहां यह कहता है: "संक्षिप्त उत्तर यह है कि कभी भी ऑटो का उपयोग करने का कोई कारण नहीं है"? गंभीरता से? आपकी टिप्पणी को तुरंत देखते हुए, यह प्रतीत होता है कि कम से कम कुछ लोगों को यह एक सकारात्मक योगदान लगता है।
जेरी कॉफिन

@JerryCoffin मैंने पहले ही समझाया था, मेरी टिप्पणी को फिर से पढ़ें। हेंडसाइट 20/20 है।
डैन बेचर

2
मैं हाल ही में एक गंभीर आग (दो लेनों बंद) उस के लिए एक की जरूरत का सुझाव पारित कर दियाchar auto my_car;
निरा

46

autoकीवर्ड सी भाषा में बेकार है। यह इसलिए है क्योंकि सी भाषा से पहले एक बी भाषा मौजूद थी जिसमें स्थानीय चर घोषित करने के लिए वह कीवर्ड आवश्यक था। (बी को एनबी में विकसित किया गया था, जो सी बन गया)।

यहाँ B के लिए संदर्भ पुस्तिका है

जैसा कि आप देख सकते हैं, मैनुअल autoउपयोग किए गए उदाहरणों के साथ व्याप्त है। ऐसा इसलिए है क्योंकि कोई intकीवर्ड नहीं है । "यह एक चर की घोषणा है" कहने के लिए किसी प्रकार के कीवर्ड की आवश्यकता होती है, और यह कीवर्ड यह भी बताता है कि यह एक स्थानीय या बाहरी ( autoबनाम extrn) है। यदि आप एक या दूसरे का उपयोग नहीं करते हैं, तो आपके पास एक सिंटैक्स त्रुटि है। यह कहना है, x, y;अपने आप से एक घोषणा नहीं है, लेकिन auto x, y;है।

चूँकि B में लिखे गए कोड बेस को NB में पोर्ट किया जाना था और C को भाषा के विकसित होने के बाद, भाषा के नए संस्करणों ने कुछ पिछड़े हुए सुसंगतता के लिए कुछ सामान दिया, जिसका अनुवाद कम काम में किया गया। के मामले में auto, प्रोग्रामर को हर घटना का शिकार करने autoऔर उसे हटाने की जरूरत नहीं थी।

यह मैनुअल से स्पष्ट है कि सी में अब अश्लील "अंतर्निहित int" cruft ( सामने main() { ... }किसी के बिना लिखने में सक्षम int) भी बी से आता है। यह बी कोड का समर्थन करने के लिए एक और पिछड़ी संगतता सुविधा है। फ़ंक्शंस में बी में निर्दिष्ट रिटर्न प्रकार नहीं है क्योंकि कोई प्रकार नहीं हैं। सब कुछ एक शब्द है, जैसे कई विधानसभा भाषाओं में।

ध्यान दें कि किसी फ़ंक्शन को केवल कैसे घोषित किया जा सकता है extrn putcharऔर फिर केवल एक चीज जो इसे एक फ़ंक्शन बनाती है जो पहचानकर्ता का उपयोग करती है : इसका उपयोग फ़ंक्शन कॉल अभिव्यक्ति की तरह किया जाता है putchar(x), और यही वह संकलक को उस टाइपलेस शब्द को फ़ंक्शन पॉइंटर के रूप में व्यवहार करने के लिए कहता है।


24

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

हालाँकि, C ++ 11 मानक में autoकीवर्ड को प्रकार के अनुमान का समर्थन करने के लिए 'अपहृत' किया गया है, जहां एक चर का प्रकार इसके आरंभिक के प्रकार से लिया जा सकता है:

auto someVariable = 1.5;   // someVariable will have type double

मुख्य रूप से टेम्प्लेट में वेरिएबल घोषित करने में सहायता के लिए टाइप इंट्रेंस जोड़ा जा रहा है या टेम्प्लेट फ़ंक्शंस से लौटाया गया है, जहां टेम्प्लेट पैरामीटर पर आधारित प्रकार (या जब टेम्पलेट इंस्टेंट किया जाता है तो कंपाइलर द्वारा घटाया जाता है) अक्सर मैन्युअल रूप से घोषित करने के लिए काफी दर्दनाक हो सकता है।


1
"चर एक ब्लॉक के लिए स्थानीय है" - यह बिल्कुल सच नहीं है। किसी ब्लॉक में घोषित सभी चर उस ब्लॉक के लिए स्थानीय हैं (स्कोप के संबंध में)। वे कार्यक्रम में अन्य चर से जुड़े हो सकते हैं, लेकिन घोषणा केवल उस ब्लॉक में दिखाई देती है। autoभंडारण वर्ग के बारे में है जिसका दृश्यता से कोई लेना देना नहीं है।
fuz

12

पुराने एज़्टेक सी कंपाइलर के साथ, कमांड-लाइन स्विच का उपयोग करके सभी स्वचालित चर को स्थिर चर (बढ़ी हुई गति के लिए) में बदलना संभव था।

लेकिन स्पष्ट रूप से घोषित autoकिए गए चरों को उस स्थिति में छोड़ दिया गया था। (पुनरावर्ती कार्यों के लिए आवश्यक है जो अन्यथा ठीक से काम नहीं करेंगे!)


7

autoकीवर्ड अजगर में अर्धविराम के शामिल किए जाने के समान है, यह पिछले एक भाषा की आवश्यकता थी ( B), लेकिन डेवलपर्स महसूस किया कि यह अनावश्यक था क्योंकि ज्यादातर चीजों थे auto

मुझे संदेह है कि यह बी से सी में संक्रमण के साथ मदद करने के लिए छोड़ दिया गया था। संक्षेप में, एक उपयोग बी भाषा संगतता के लिए है।

बी और 80 सी में उदाहरण के लिए:

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}

1

ऑटो कीवर्ड एक भंडारण वर्ग (कुछ प्रकार की तकनीकें जो चर और भंडारण स्थान का जीवनकाल तय करती हैं) उदाहरण हैं। इसका एक व्यवहार है जिसके द्वारा उस कीवर्ड की मदद से बनाया गया चर जीवनकाल (आजीवन) घुंघराले ब्रेसिज़ के भीतर ही रहता है

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          

0

autoकेवल ब्लॉक-स्कोप किए गए चर के लिए उपयोग किया जा सकता है। extern auto intयह बकवास है क्योंकि संकलक यह निर्धारित नहीं कर सकता है कि यह बाहरी परिभाषा का उपयोग करता है या नहीं या ऑटो परिभाषा के साथ बाहरी को ओवरराइड करना है (ऑटो और एक्सटर्न पूरी तरह से अलग भंडारण अवधि हैं, जैसे static auto int, जो स्पष्ट रूप से बकवास भी है)। यह हमेशा इसे एक तरीके से व्याख्या करने के लिए चुन सकता है लेकिन इसके बजाय इसे एक त्रुटि के रूप में चुनता है।

एक सुविधा है जो autoप्रदान करती है और जो एक फ़ंक्शन के अंदर 'सब कुछ एक इंट' नियम को सक्षम करती है। किसी फ़ंक्शन के बाहर के विपरीत, जहां a=3एक परिभाषा के रूप में व्याख्या की जाती है int a =3क्योंकि असाइनमेंट फ़ाइल के दायरे में मौजूद नहीं हैं, a=3एक फ़ंक्शन के अंदर एक त्रुटि है क्योंकि जाहिरा तौर पर कंपाइलर इसे एक परिभाषा के बजाय एक बाहरी चर के असाइनमेंट के रूप में व्याख्या करता है (भले ही वहां हो नहीं कर रहे हैं extern int aसमारोह में या फ़ाइल दायरे में आगे घोषणाओं), लेकिन की तरह एक विनिर्देशक static, const, volatileया autoअर्थ होगा कि यह एक परिभाषा है और संकलक एक परिभाषा के रूप में यह लेता है, सिवाय इसके कि autoअन्य विनिर्देशक के साइड इफेक्ट भी नहीं है। auto a=3इसलिए अंतर्निहित है auto int a = 3। बेशक,signed a = 3एक ही प्रभाव है और unsigned a = 3हमेशा एक अहस्ताक्षरित int है।

यह भी नोट करें 'इस बात autoका कोई प्रभाव नहीं पड़ता है कि किसी वस्तु को एक रजिस्टर को आवंटित किया जाएगा (जब तक कि कुछ विशेष संकलक उस पर ध्यान नहीं देते, लेकिन यह संभावना नहीं है)'


-1

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

यह सिद्धांत जीसीसी संकलक के लिए काम नहीं करता था, हालांकि मैंने अन्य संकलक की कोशिश नहीं की है।

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