जावा में एक अशक्त कथन कब इस्तेमाल किया जाएगा?


10

एक पाठ्यपुस्तक में मैं एक कक्षा के लिए देख रहा हूँ, यह कहा गया है, एक कथन रिक्त हो सकता है (अशक्त कथन)। अशक्त कथन को केवल अर्धविराम के रूप में परिभाषित किया गया है।

यह निष्पादन के समय बिल्कुल कुछ नहीं करता है। अशक्त कथन का उपयोग शायद ही कभी किया जाता है।

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

संभवतः इस तरह के बयान का उपयोग क्या हो सकता है?

जवाबों:


7

यह ज्यादातर बेकार है, लेकिन कुछ जगह हैं जहां यह आवश्यक है। उदाहरण के लिए:

while (DoSomething());

यह DoSomething()विधि को तब तक कार्यान्वित करता है जब तक कि वह झूठी न हो जाए। जाहिर है यह मानता है कि विधि कुछ उपयोगी साइड-इफ़ेक्ट भी करती है। लेकिन खाली बयान, यानी अनुगामी अर्धविराम की आवश्यकता होती है, अन्यथा जबकि-लूप में इसके बजाय अगले कथन शामिल होंगे।

(लेकिन अन्य उत्तर खंडन करने के लिए, for(;;) {}है कोष्ठक के बाद से खाली बयान का एक उदाहरण है, के बाद एक खंड बयान शामिल नहीं है के लिए, यह सिर्फ अर्धविराम अलग करने के लिए (वैकल्पिक) भाव का उपयोग करता है। देखें जावा व्याकरण जानकारी के लिए।)


3
+1 - यह एकमात्र ऐसा समय है जब मैंने कभी देखा है कि यह वास्तव में उपयोग किया गया है (जैसा कि कहा गया है, '' के लिए खाली अनुभाग थोड़ा अलग है)। केवल एक बदलाव मैं यह बताना चाहूंगा कि यह इस तरह के उपयोग को पढ़ने के लिए बहुत दूर की बात है, यदि अशक्त कथन लूप के तुरंत बाद की बजाय अपनी पंक्ति पर छोड़ दिया जाता है, जहां यह सिर्फ एक साधारण कथन की तरह दिखता है टर्मिनेटर ...
जूल्स

12

आप इसका उपयोग तब कर सकते हैं जब किसी वाक्य को वाक्यविन्यास की आवश्यकता हो लेकिन शब्दार्थ की आवश्यकता न हो। सबसे आम मामला इस उदाहरण की तरह, लूप के किसी एक भाग को छोड़ना है , हालांकि अधिकांश लोगों को यह उपयोग अजीब और पढ़ने में कठिन लगता है। जैसे आपकी किताब कहती है, इसका उपयोग शायद ही कभी किया जाता है।


उस। एक बेकार भाषा की विशेषता है। मुझे Google के "केवल अर्धविराम जावा" की तुलना में स्पष्ट रूप से दोहराव पढ़ने के लिए मजबूर होना पड़ेगा।
क्रिस क्रेफ़िस

2
@ChrisCirefice दूसरी ओर "केवल एक अर्धविराम: यह स्पष्ट है कि यह आपको भाषा को मामूली रूप से जानने पर क्या करना चाहिए। यह एक अलग नियम नहीं है, यह सिर्फ अन्य नियमों का परिणाम है। इसके अलावा अगर आप एक बार सीख लेते हैं तो आप इसे हमेशा के लिए जान सकते हैं।" इसलिए मैं कहूंगा कि यह वास्तव में कोई मुद्दा नहीं है।
मॉरिशी

1
अगर आपको लगता है कि अगर आप खुद को इस तरह से लिखते हुए पाते हैं, तो आप कुछ गलत कर रहे हैं।
बेसिनेटर

मेरे पास एक नींद-मतदान पद्धति है जिसका उपयोग मैं जांचने के लिए करता हूं कि कोई उपकरण लाइन पर वापस आता है। कोड बहुत अधिक इस तरह दिखता है: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }बिल्कुल अलग लाइनों पर, बिल्कुल। मैं इसे लिख सकता था while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, लेकिन यह गलत होगा।
BobDalgleish

यह शून्य कथन नहीं है कि हम 'शून्य' विधियों से बाहर निकलने के लिए क्या उपयोग करते हैं? void method(){ //code here. If(condition){return ;}}
Laiv

9

मैं थोड़ी देर के लूप का उपयोग करना पसंद करता हूं , लेकिन एक अशक्त अभिव्यक्ति आपको यह लिखने देती है:

for (;;) { thread.run(); }

हालाँकि, एक अशक्त कथन आइए आप इसे लिखते हैं:

while(true);
{
    thread.run();
}

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

यह कहना नहीं है कि वहाँ अच्छा उपयोग नहीं कर रहे हैं। वे सिर्फ दुर्लभ हैं। वे आमतौर पर इस तरह दिखते हैं:

{
    ;
}

क्योंकि इस तरह से ऐसा लगता है कि आप ऐसा करने का मतलब है (यहां तक ​​कि यह कभी-कभी पर्याप्त नहीं होता है)।

असेंबली में इस अशक्त कथन को एनओपी कहा जाता है । पायथन में इसे पास कहा जाता है । जावा में (और c के अन्य बच्चे) यह एक अर्धविराम है जैसा कि आपने कहा है, या यहां तक कि सत्य का दावा करते हैं;

मुझे कुछ उपयोगों की जानकारी है:

शब्दार्थ

एक खाली जगह और एक जवाब के रूप में एक शून्य नीचे रखने के बीच अंतर है। यह स्पष्ट रूप से कहता है, नहीं, मैं यहां कुछ रखना नहीं भूलता। यह कुछ भी नहीं होने का मतलब है। यह स्पष्ट नहीं है। यह जगह जानबूझकर खाली छोड़ी गई है। इस प्रकार हमें संकलन करने के लिए एन / ए मिलता है।

अशक्त पैटर्न

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

कभी-कभी आप बहुरूपता का उपयोग करना चाहते हैं बस कुछ को तोड़ने के बिना कुछ बंद करें।

डिबगिंग

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

वास्तव में एक जावा चीज़ नहीं है, लेकिन यह भी है:

बाइनरी फ़िडलिंग

असेंबली NOP निर्देश संकलित बाइनरी निष्पादन योग्य के साथ फ़िडलिंग की अनुमति देता है। लेकिन आधुनिक जावा कंपाइलर बहुत दूर का अनुकूलन करते हैं, मुझे यकीन नहीं है कि अर्धविराम सिर्फ जहर नहीं है। लेकिन पुराने दिनों में हमने टाइमिंग को नियंत्रित करने या बाद में हुक में छोड़ने की अनुमति देने के लिए इन खाली स्थानों का उपयोग किया। एनओपी के बिना वहां वास्तविक निर्देश होंगे, इसलिए यदि आप हुक करना चाहते हैं तो आपको हुक के लिए जगह बनाने के लिए उन निर्देशों को कहीं और कॉपी करना होगा। यह ठीक उसी भाषा में काम करता है जिस तरह से जावा को इसके वाक्य-विन्यास से बहुत कुछ मिलता है। लेकिन मुझे नहीं लगता कि यह हुक फ़िडलिंग जावा में बहुत होता है। हम ऐसा करने के लिए Aspect Oriented प्रोग्रामिंग का उपयोग करते हैं।


2
यह पांडित्य लग सकता है, लेकिन उदाहरण के साथ forअशक्त कथन नहीं है। अशक्त कथन (उर्फ खाली कथन) उसी स्थान पर हो सकते हैं जहां अन्य कथन (जैसे if) हो सकते हैं, लेकिन निम्नलिखित कोष्ठक forअर्धविराम के बीच कथन की अनुमति नहीं देते हैं, लेकिन केवल एक इनिशियलाइज़र और दो अभिव्यक्ति होते हैं, जो वैकल्पिक होते हैं। तो यह एक स्टेटमेंट-टर्मिनेटर की तुलना में अर्धविराम का एक अलग उपयोग है। एक खाली विवरण अंतिम अर्धविराम होगाfor(;;);
जैक्सबी

आप सही हैं, यह पांडित्य लगता है: पी। ठीक है, कृपया मेरे संपादन पर ध्यान दें।
कैंडिड_ऑरेंज

-7

मैं इसका उपयोग करता हूं क्योंकि जावा को इस तरह से डिजाइन किया गया है जो मानव भाषा के अनुरूप नहीं है। सी। का भी यही हाल है।

एक बयान है statement;

एक अगर-तो-और बयान है if (condition) statement; else statement;

यौगिक ब्लॉकों के साथ एक if-then-अन्यथा कथन है if (condition) {statements} else {statements}

यह स्पष्ट रूप से बकवास है।

मैं तदनुसार लिखता हूं if (condition) {statements} else {statements};जो तार्किक और उचित है।

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


यह है if (condition) {statements;} else {statements;}। इसके अलावा, जावा के ;बाद की जरूरत नहीं है के बारे में बहुत संगत है }। इस तरह की तरह कि मानव भाषा अक्सर एक वाक्य के अंत में एक अवधि को कैसे नहीं रोकती है जो पहले से ही एक प्रश्न चिह्न के साथ समाप्त हो गई है। (ज़रूर, वहाँ !?या ?!अंत कर रहे हैं , लेकिन उन बस के अंतर्संबंध हैं, चरित्र )।
8bittree

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