2011-03-02 22 views
5

हम सिर्फ पाया एक सहयोगी और मैं, हैं सशर्त वाक्य रचना के साथ एक अजीब संकलन वाक्य रचना:अस्पष्ट सशर्त जावा सिंटेक्स

if (true); { 
    foo(); 
} 

यहाँ यह अजीब वाक्य रचना हमें समझा के लिए किसी वहाँ है? धन्यवाद।

+7

अगर (we_are_at_war); {launch_all_nukes(); }: डी – Augusto

उत्तर

6

पहला भाग, if (true); केवल कुछ ऐसा नहीं है जो ; पर समाप्त होता है। बाकी एक नए स्कोप ब्लॉक के अंदर foo() पर कॉल है। आपको यह पता होना चाहिए कि foo() हमेशा कहा जाता है।

8

मेरे लिए, यह एक खाली निकाय के साथ एक कथन जैसा दिखता है, उसके बाद एक कोड ब्लॉक जो हमेशा निष्पादित करता है (और यदि कथन से संबंधित नहीं है)। उदाहरण के लिए, foo भी यहाँ पर अमल करता है:

if (false); { 
    foo(); 
} 
1

मुझे लगता है कि जब से अगर statemnt अर्धविराम और foo बयान सिर्फ एक ब्लॉक में रखा गया के बाद समाप्त हो गया है इस

if (true) {}; 
foo(); 

करने के समान है ({ }) ...

1

हो सकता है कि एक अगर एक पुराने डिबगिंग से बने हुए हैं, या कोई एक शर्त है बाद में लिखने के लिए योजना बना रहा था, लेकिन किया था यह कभी नहीं ...

मैं आपको लगता है अगर कथन में सुरक्षित रूप से इसे हटाया जा सकता है, तो ऐसा करने में बिल्कुल कोई बात नहीं है।

0

यह मृत कोड है। अगर ब्लॉक बेकार है।

if(doesn't matter whats here) {} 
foo(); 
+0

कोई फर्क नहीं पड़ता कि यहाँ क्या है? क्या होगा अगर यह अपवाद फेंकता है? जैसे 'अगर (Long.parseLong (" मैं एक लंबा नहीं हूँ ")> 1) {} foo();' :-) –

4

यह कोई वास्तविक समझ में आता है लेकिन वाक्य रचना सही है के बराबर। इसे

if (true) 
{  
    // do nothing 
} 
{ 
    foo(); 
} 

{} के आसपास foo() के साथ भी लिखा जा सकता है; इस मामले में कुछ भी नहीं है। यदि चर परिभाषित किए गए थे तो यह {} के भीतर परिभाषित चर के दायरे को सीमित कर देगा।

{ 
    int i=0; 
    System.out.println(i); 
} 
{ 
    String i="hello"; 
    System.out.println(i); 
} 

बस ठीक काम करता है।

1

जैसा कि अन्य ने इंगित किया है, सिंटैक्टिक रूप से यह रिक्त निष्पादन कथन (यानी कुछ नहीं करता) के साथ एक सशर्त है जिसके बाद स्कोपिंग ब्रैकेट्स में संलग्न foo() को कॉल किया जाता है। foo() हमेशा निष्पादित किया जाता है।अभ्यास में, यदि आप एक असली मामले में यह पाया जाता है और नहीं एक प्रोग्रामिंग परीक्षण मैं निम्न में से एक पर शक:

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