क्या मैं, j = 1 वास्तव में भ्रामक है? [बन्द है]


11

एक लाइनर में कई वेरिएबल इनिशियलाइज़ेशन के बारे में एक सामान्य तर्क है, वह है:

उदाहरण के लिए विचार करें int i, j = 1; जिसके कारण कुछ लोग गलती से यह मान सकते हैं कि दोनों चरों को आरंभीकृत किया जा रहा है

हम यह तर्क दे सकते हैं कि किसी को उसकी भाषा के बारे में इतना पता होना चाहिए कि उसके बारे में गलती न हो। एक और तर्क डेवलपर्स के रूप में हो सकता है कि हम इतनी सारी भाषाएँ सीखते हैं जो हम भाषाओं के बीच विशिष्टताओं के बीच गलतियाँ कर सकते हैं।

हालाँकि उस बहुत विशिष्ट मामले के लिए मैं निम्नलिखित सोच रहा हूँ कि क्या यह एक ऐसी भाषा में भी मौजूद है जहाँ बहुत ही वाक्यविन्यास i, j = 1 दोनों वैरिएबल को इनिशियलाइज़ करते हैं?

यदि वह तर्क नहीं है तो लागू नहीं होता है।


2
यदि आपकी भाषा समझदार है, तो संभावित भ्रम हानिरहित है, क्योंकि एक असिंचित चर तक पहुंच एक कंपाइलर त्रुटि को ट्रिगर करता है।
कोडइंचोस

4
@CodesInChaos क्या आप कह रहे हैं कि C समझदार नहीं है?
बाल्ड्रिक

2
सिर्फ इसलिए कि एक भाषा कुछ ऐसा करने की अनुमति देती है जिसका अर्थ यह नहीं है कि आप मनुष्यों को अनावश्यक पीड़ा नहीं दे रहे हैं। इस कोड को केवल उसी स्थान के लिए कहा जाता है, जो भाषा विनिर्देश को याद नहीं रखने वालों को दंडित करने के लिए डिज़ाइन किए गए क्विज़ के दौरान है। मैं हमेशा इस प्रकार के प्रश्नों में असफल रहा। Bleh।
कैंडिड_ऑरेंज

2
विजुअल बेसिक 6 Dim Apple, Orange, Pear as Fruitमें एक कानूनी घोषणा है। मान लीजिए आप वीबी को नहीं जानते हैं। क्या आपकी पहली धारणा Appleप्रकार की है Fruit? यह नहीं। याद रखें, भाषाओं को अक्सर उन लोगों द्वारा पढ़ा जाता है जो उस भाषा के विशेषज्ञ नहीं हैं; यदि आप एक विशेषज्ञ हैं, तो स्पष्ट रूप से गैर-विशेषज्ञों के लिए भी अपने इरादों को संप्रेषित करने के लिए समझदारी से भाषा का उपयोग करें। मैं कभी भी किसी भी भाषा में कई इनिशियलाइज़ेशन का उपयोग नहीं करता।
एरिक लिपर्ट

13
इसी तरह: विचार var x = 1, y = 1.5; करें कि क्या यह वैसा ही है int x = 1; double y = 1.5;या जैसा है वैसा ही है double x = 1, y = 1.5;? जब हमने varC # 3.0 में जोड़ा तो मैंने एक सर्वेक्षण किया और पाया कि लगभग आधे लोगों का मानना ​​था कि पहला "स्पष्ट रूप से" सही था और दूसरे आधे का मानना ​​था कि दूसरा स्पष्ट रूप से सही था, और इसलिए हमने इसे अवैध बना दिया। एक विशेषता जो पूरी तरह से आधी आबादी को गुमराह करती है वह एक बुरी विशेषता है।
एरिक लिपर्ट

जवाबों:


37

मुझे लगता है कि नहीं, लेकिन यह बात नहीं है। मुद्दा यह है कि i, j = 0बहुत आसानी से गलत हो जाता है i = j = 0, जो दोनों को शुरुआती करता है। शुद्धता के बगल में स्रोत कोड पर स्पष्टता सबसे महत्वपूर्ण आवश्यकता है, और तथ्य यह है कि यह सवाल भी उठता है यह साबित करता है कि स्पष्टता को अपनाने की आवश्यकता है।


3
मैं यह भी तर्क दूंगा कि अगर इस तरह के बयान से दोनों बयानों की शुरुआत नहीं होती है, तो इसका अस्तित्व क्यों है?
बेरिन लोरिट्श

2
@BerinLoritsch भाषा पर निर्भर करता है। यह अक्सर घोषणा फहराने के कारण जावास्क्रिप्ट में किया जाता है: यह कई लोगों द्वारा उस दायरे के शीर्ष पर चरों को घोषित करने के लिए सबसे अच्छा अभ्यास माना जाता है जिसमें वे उपलब्ध होते हैं भले ही आप उन्हें तब तक इनिशियलाइज़ न करें जब तक कि वे कोड में उपयोग नहीं किए जाते हैं। । लगभग सभी कोड परिवर्तन उपकरण इस फैशन में आउटपुट करते हैं।
जेरेड स्मिथ

1
मुझे लगता है कि यह एक बात है अगर एक कोड आउटपुट टूल ने ऐसा किया, क्योंकि उस पर भरोसा किया जाना चाहिए। हालांकि, मनुष्यों के लिए मैं केवल एक लाइन पर घोषणा और अंतिम तत्व के प्रारंभ के संयोजन के खिलाफ सुझाऊंगा। यह सिर्फ एक बग होने की प्रतीक्षा कर रहा है।
बेरिन लोरिट्श

2
@JaredSmith मेपल के अलावा, मैं ऐसी भाषा के बारे में नहीं सोच सकता जहां यह वर्तमान में वांछित है, यहां तक ​​कि सी भी अब गुंजाइश के करीब है (जैसे सी ++ और आधे सभ्य स्थैतिक संकलक के साथ अधिकांश अन्य भाषाएं) क्योंकि यह संभावित बगों को रोकने का लाभ देता है और अनुमति देता है संकलक यह तय करने के लिए कि चर के साथ क्या करना है जब तक कार्यक्षमता में बदलाव नहीं होता है, संभवतः बेहतर अनुकूलन को अनुमति देता है जिसे आप कम रजिस्टरों के साथ दूर कर सकते हैं।
whn

6
भाषा के बावजूद, किसी को पूछना चाहिए कि " बनाम (या इससे भी बेहतर, अलग-अलग लाइनें) लिखने का क्या फायदा है ?" int i, j=1int i; int j = 1
शेपनर

2

मुझे लगता है, आप दोनों पक्षों के लिए बहस कर सकते हैं:

  • कोंटा i, j = 0:
    गणितज्ञ इसका उपयोग इस अर्थ में करते हैं कि दोनों शून्य हैं iऔर jमाना जाता है।

  • प्रो i, j = 0:
    यह आपके ऑपरेटरों की पूर्वता जानने का एक साधारण मामला है। और अगर आपको उनकी पूर्वता के बारे में संदेह है, तो अब इसे देखने का समय है।

    यही कारण है कि हम a.b += c[i]*d[i];बिना कोष्ठक के सामान लिखते हैं । बेशक यह इसके बराबर है (a.b) += ((c[i])*(d[i]));, लेकिन प्रोग्रामर से यह उम्मीद की जा सकती है कि वे दिल से सबसे अधिक इस्तेमाल किए जाने वाले ऑपरेटरों की पूर्वता को जानें, और जब वे सुनिश्चित न हों तो ऑपरेटरों की पूर्वता को देख सकते हैं। इस प्रकार, कोष्ठकों को आम तौर पर बेकार अव्यवस्था माना जाता है जब तक कि वे ऑपरेटर पूर्वता की तुलना में एक अलग मूल्यांकन आदेश को लागू नहीं करते।

    बेशक, वहां अपवाद हैं। की वरीयता <<और +आमतौर पर दोनों मामलों में वारंट कोष्ठक के लिए पर्याप्त अस्पष्ट माना जाता है। लेकिन वह अपवाद है जो नियम को साबित करता है।

मैं, एक के लिए, प्रो पक्ष पर और अधिक गिर जाएगा, लेकिन मैं किसी भी स्टाइलगाइड से बचने के लिए तैयार हूं जो ऐसी घोषणाओं को मना करता है। यह सिर्फ लड़ने लायक बात नहीं है।


7
मैं ध्यान देता हूं कि int i, j = 0;इसमें कोई ऑपरेटर नहीं है। उस कथन में केवल अभिव्यक्ति है और इसलिए ऑपरेटर पूर्वता इसमें नहीं आती है। पार्सर कॉमा ऑपरेटर या असाइनमेंट ऑपरेटर के रूप में व्यवहार नहीं करता है ; बल्कि, ये घोषणा के बयान के व्याकरणिक भाग हैं। 0,=
एरिक लिपर्ट

@EricLippert जहां तक ​​पूर्ववर्ती नियमों का सवाल है, यह अंतर अप्रासंगिक है: मुझे पता है कि कोई भी सी-शैली भाषा अन्य अभिव्यक्तियों के रूप में एक घोषणा में एक ही मिसाल का उपयोग करती है। और कुछ भी वंश को आमंत्रित करेगा।
विस्फ़ोटक -

but programmers can be expected to know the precedence of the most used operators by heart, तुम कहो। आपके द्वारा दिए गए उदाहरण में, मुझे यकीन नहीं है कि अधिकांश (औसत) प्रोग्रामर सदस्य पहुंच ऑपरेटर या सरणी इंडेक्स ऑपरेटर के गर्भ धारण करते हैं, जो गणितीय अर्थों में ऑपरेटर हैं, लेकिन इसके बजाय उन्हें प्राकृतिक भाषा संज्ञा और गुणन के रूप में अधिक समझते हैं। क्रिया के रूप में संचालक। इसीलिए int i, j, k = 0;ऐसा पैशाचिक निर्माण है, क्योंकि यह "इंट वैरिएबल i, j, और k, की प्राकृतिक भाषा एनालॉग के रूप में प्रस्तुत होता है, घोषित किया जाता है और इसे 0 पर सेट किया जाएगा"!
स्टीव

@ आप प्रोग्रामर के रूप में पूर्ववर्ती नियमों को कैसे याद करते हैं, यह पूरी तरह आपके ऊपर है। अगर यह आपको भाषा की संज्ञा के रूप में सोचने में मदद करता है, तो इसे करें। हालाँकि, उस मामले में आप समस्याओं में भाग लेंगे जब आप सामान देखेंगे *a[i], मुझे नहीं लगता कि आप "संज्ञा" सादृश्य के साथ पर्याप्त रूप से पार्स कर सकते हैं। जैसा int i, j, k = 0;कि, यदि आप नियमों को नहीं देखते हैं, तो इसका मतलब कुछ भी हो सकता है: एक तीसरी व्याख्या को घोषित करना होगा int i, फिर मूल्यांकन करना होगा jऔर अंत में असाइन करना होगा k = 0। जब तक आप अपनी भाषा का सिंटैक्स नहीं जानते, आप ऐसे निर्माणों को पार्स नहीं कर सकते। यदि आप ऐसा करते हैं तो यह आपकी समस्या है।
cmaster - मोनिका

@cmaster, मैं अपनी विशिष्ट यादगार रणनीति haha ​​व्यक्त नहीं कर रहा था। मैं सी प्रोग्रामर नहीं हूं, इसलिए सी में ऑपरेटर पूर्वता के साथ मेरी परिचित दूसरी दर है। लेकिन जब मैंने आपके उदाहरण पर ध्यान दिया, तो यह है कि मैंने गुणन ऑपरेटर के बारे में सोचा भी नहीं था कि वह सरणी इंडेक्स ऑपरेटर के सापेक्ष सापेक्षता रखता है। यह है, मैं a[i]एक अनुक्रमणिका ऑपरेटर के रूप में लागू नहीं पढ़ा था a, लेकिन दोनों को एक साथ एक अप्रासंगिक सिंटैक्टिक तत्व के रूप में पढ़ा गया जो गुणन ऑपरेटर के संचालक को निर्दिष्ट करता है, और इस प्रकार मुझे पूर्ववर्तीता का मूल्यांकन करने के लिए भी प्रेरित नहीं किया गया था। (१/२)
स्टीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.