2016-02-10 12 views
8

कुछ दिन पहले मैं जावा में इस कोड के बारे में अपने सहयोगियों के साथ बात कर रहा था:सिंटेक्स के लिए लूप

for(; ;) { } 

यहां कुछ भी विशेष, बस एक अनंत लूप।

लेकिन हमें आश्चर्य है कि यह वाक्य रचनात्मक रूप से सही क्यों है। आप JLS §14.14.1 को एक बार देख ले, तो आप इस देखेंगे:

for ([ForInit] ; [Expression] ; [ForUpdate]) Statement 

मैं समझता हूँ कि ForInit और ForUpdate छोड़ा जा सकता है। लेकिन कम से कम मैं उम्मीद करेंगे कि Expression अनिवार्य है, जबकि पाश में की तरह:

while() {} // compile error, Expression is missed 

तो क्यों अभिव्यक्ति एक के लिए लूप पर छोड़ा जा सकता है? और यहां तक ​​कि एक और सोचता है - क्यों मिस्ड अभिव्यक्ति true को हल किया गया है? मेरी उम्मीद यह होगी कि खाली अभिव्यक्ति false पर हल हो गई है।

वही सोच अन्य भाषाओं के लिए मान्य है (मैंने इसे सी और जावास्क्रिप्ट के साथ आजमाया है, लेकिन मेरा मानना ​​है कि फॉर-लूप के साथ हर भाषा इस तरह से व्यवहार करती है)।

फॉर-लूप में एक अभिव्यक्ति खंड अनिवार्य क्यों नहीं है (लेकिन जबकि-लूप में)? खाली अभिव्यक्ति true को हल क्यों करती है और false पर नहीं?

+6

यदि आप इस बारे में चिंतित हैं तो आपके हाथों पर बहुत अधिक समय है :) – tokamak

+1

इंटरस्टेली, दोनों के लिए '; (;)' और 'जबकि (सत्य) 'एई केवल एक' गोटो 0 'निर्देश के साथ प्रतिस्थापित किया गया है: पी – TheLostMind

+0

@ टोकामाक ने मेरा दिन बनाया: डी – osanger

उत्तर

3

तर्क in JLS 14.14.1.1 से शुरू होता है और 14.14.1.2 में जारी रहता है, मेरा जोर।

तो ForInit हिस्सा वर्तमान नहीं है, कोई कार्रवाई नहीं की है।

हैं Expressionवर्तमान नहीं है, या यह मौजूद है और इसके मूल्यांकन से उत्पन्न मूल्य (किसी भी संभव unboxing सहित) सही है, तो निहित Statement क्रियान्वित किया जाता है ...

JLS रिक्त ForInit, Expression और ForUpdate कथनों की अनुमति देता है और उनकी अनुपस्थिति से निपटने के लिए स्थितियां हैं, इसलिए उन्हें छोड़ना स्वीकार्य है।

यह while छोरों, per JLS 14.12 साथ ऐसा करने के लिए अनुमति नहीं है।

Expression प्रकार boolean या Boolean, या एक संकलन समय त्रुटि होती होना आवश्यक है।

इस से, विनिर्देश के बाद से है कि इसके बाद के संस्करण के अनुसार एक संकलन समय त्रुटि में परिणाम होगा, नहीं एक खाली अभिव्यक्ति के माध्यम से पारित करने की अनुमति देने के लिए है।


यदि आप थोड़ा और ऐतिहासिक कारण ढूंढ रहे हैं, तो C specification mandates this as well

enter image description here

के बाद से जावा सी से भारी प्रेरणा ली (और ज्यादातर उस में कार्यान्वित किया जाता है), यह सही समझ में जावा के छोरों सी छोरों की तरह ही व्यवहार करने के लिए बनाता है, और यह उनका व्यवहार है: भाव में वैकल्पिक हैं सी का for कथन, और इसके while कथन में अनिवार्य है।

+1

हां ... मैंने पहले ही जेएलएस देखा था। लेकिन मेरा सवाल था 'क्यों' ऐसा है? –

+1

"क्योंकि ओरेकल ने ऐसा कहा" आप यहां से सबसे अच्छी चीज के बारे में बता सकते हैं। यह सी के साथ भी संगत है, जिसे जावा ज्यादातर बंद कर दिया जाता है। – Makoto

+2

मैंने यह प्रश्न लिखा क्योंकि मुझे उम्मीद है कि किसी के पास बेहतर जवाब है "क्योंकि ओरेकल ने ऐसा कहा"। निश्चित रूप से, मेरा मानना ​​है कि जावा इसे सी के साथ संगत बनाएगा लेकिन इस निर्णय के लिए प्रारंभिक कारण क्या है? हो सकता है कि ऐतिहासिक कारण हैं जैसे 'इस तरह से कंपाइलर को कार्यान्वित करना आसान था' या 'बस गलती - लेकिन संगतता के कारण यह बाद में नहीं बदला गया'। शायद अन्य कारण हैं ... मेरा प्रश्न यह है कि इसे ढूंढना है। –

संबंधित मुद्दे