2009-06-08 13 views
7

मैं अक्सर देखते हैं और कुछ के रूप में व्यवहार झूलते: जो "अगर (y> 0)" अगर बयानविभिन्न भाषाएं "लटकती हुई अन्य" को कैसे संभालती हैं?

if (x > 0) 
    if (y > 0) 
    print "hello" 
else 
    print "world" 

पार्सर या दुभाषिया करीबी के साथ वास्तव में किसी और की भरपाई कर देंगे।

क्या किसी भी भाषा में वास्तव में बाहरी या अन्य से अधिक के साथ मेल खाने का नुकसान होता है? (स्पष्ट पायथन को छोड़कर)

+0

दिलचस्प सवाल है, लेकिन कौन सा सही जवाब होगा? – ralphtheninja

+1

मुझे लगता है कि उत्तर हो सकता है: शायद कोई ऐसी भाषा नहीं है जो कि सबसे दूर से मेल खाती है। कुछ भाषाएं अनिवार्य बनाती हैं कि आप ब्रेसिज़ को लागू करके इसे स्पष्ट करते हैं या इंडेंटेशन का उपयोग केवल यह इंगित करने के लिए करते हैं कि कौन सा मिलान (पायथन) से मेल खाता है। इंडेंटेशन के अलावा –

उत्तर

6

स्पेस-संवेदनशील भाषाओं (जैसे पाइथन, जैसा कि आपने कहा था) का उपयोग करने से कम, मुझे नहीं लगता कि कोई समझदार व्याख्या बाहरीतम if ब्लॉक से क्यों मेल खाती है। विशेष "और अगर" वाक्य रचना है, आमतौर पर elsif, elif, या elseif प्रदान

  1. सभी ब्लॉकों के लिए ब्रेसिज़ की आवश्यकता होती है, और
  2. :

    कुछ भाषाओं में से इस संभावित अस्पष्टता से रोकती हैं।

2

पर्ल में, ब्रेसिज़ में मदद करता है हमें इस तरह के मुद्दों से बचने के वैकल्पिक नहीं हैं:

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
    else { 
     print "world" 
    } 
} 

बनाम

if ($x > 0) { 
    if ($y > 0) { 
     print "hello" 
    } 
} 
else { 
    print "world" 
} 

IIRC, सबसे सी शैली दिशा निर्देशों की आवश्यकता होती है/छोरों और सशर्त, के लिए ब्रेसिज़ सलाह देते हैं।

1

सी # "सही" चीज करता है। दृश्य स्टूडियो के स्मार्ट मांगपत्र स्वचालित रूप से भी सही जगह पर कहते हैं:

if (x > 0) 
    if (y > 0) 
     Console.WriteLine("hello"); 
    else 
     Console.WriteLine("world"); 

यह उम्मीद है कि सिर्फ एक सैद्धांतिक प्रश्न होना चाहिए, हर जगह घुंघराले के जोड़ने सबसे सी डेरिवेटिव में गहरा दीर्घस्थायी होना चाहिए की आदत के बाद से, अन्यथा आप खोल रहे हैं बुरा आश्चर्य की संभावना ऊपर।

+0

विजुअल स्टूडियो, 'एंड अगर' का उपयोग करके, "अस्पष्टता" को भी कार्यात्मक रूप से हटा देता है। "सिंटैक्स के भीतर किसी और के बीच के लिंक को स्पष्ट करके समस्या को हल किया जा सकता है। यह आमतौर पर मानव त्रुटियों से बचने में मदद करता है। विकिपीडिया https://en.wikipedia.org/wiki/Dangling_else संभावित समाधान [" संदिग्ध "लटकना अन्य] हैं: " कथन "अगर" कथन "है। ऐसी भाषाओं के उदाहरण हैं ALGOL 68, एडा, एफिल, पीएल/एसक्यूएल, विजुअल बेसिक, और मॉडुला -2 "मुझे लगता है कि यह संदिग्ध नहीं है क्योंकि किसी भी भाषा में उस भाषा में इसकी व्याख्या नहीं होती है। – barlop

3

तो किसी भी भाषा ऐसा ही किया (खरोज केंद्रित भाषाओं को छोड़ कर), वे में से एक में जाने के लिए होता है "क्या सबसे खराब भाषा है" सूचियों। कारण है कि मैं लगभग हमेशा सशर्त, के लिए ब्रेसेस का उपयोग करें

यह भी है, और समय है जब वहाँ नेस्ट सशर्त, या लूप बने हैं की 100%। कुछ अतिरिक्त पात्र भ्रम की संभावना को खत्म करने लायक है।

1

पायथन में आप इसके बारे में अस्पष्ट नहीं हो सकते हैं। या तो आप

if (x > 0): 
    if (y > 0): 
    print "hello" 
else: 
    print "world" 

या

if (x > 0) 
    if (y > 0) 
    print "hello" 
    else: 
    print "world" 

खरोज दिखाती है कि कौन "अगर" से मेल खाता है "और" है। [नोट: जैसा कि मैं कर सकता हूं, कोशिश करें, मुझे पहले उदाहरण में "अन्य" के रूप में सही तरीके से लाइन करने के लिए "अन्य" नहीं मिल सकता है।]

उन सभी भाषाओं में मैंने देखा है जो इस विशेष अस्पष्टता की अनुमति देते हैं, सबसे हालिया "अगर" के साथ "अन्य" मैचों। यह उन सभी भाषाओं के बारे में सच नहीं हो सकता है जो कभी अस्तित्व में थे। आम तौर पर पार्सर लिखते समय सबसे आसान काम है "स्टैक पर" निकटतम "अगर" के साथ "अन्य" से मेल खाना।

इसी तरह का प्रश्न: 5 - 2 + 1 का नतीजा क्या है? क्या यह 4 या 2 है? व्यक्तिगत रूप से मैं हमेशा ब्रांड्स का उपयोग करता हूं जब मैं लिखता हूं (एक्स - वाई) + जेड या एक्स - (वाई + जेड) क्योंकि मैं कभी याद नहीं कर सकता कि पार्सर किस तरह से जाएगा।

+0

अंतिम भाग के लिए, आईएमओ यह जवाब देने के लिए समझ में नहीं आता 2. एक दूसरे के लिए संचालन के आदेश को अनदेखा करना, यह पीछे की तरफ होगा। मैंने जिन भाषाओं के साथ काम किया है, वे बाएं से दाएं जाते हैं। (हालांकि मुझे लगता है कि अगर भाषा को दाएं से बाएं होने के लिए डिज़ाइन किया गया था, जो समझ में आएगा, लेकिन फिर प्रोग्रामर को इसके बारे में पता होना चाहिए।) –

+3

5 - 2 + 1 की व्याख्या करने के 2 तरीके हैं और दोनों के परिणामस्वरूप 0 1 5 + (-2 +1) - -2 और 1 पहले 2. (5 - 2) + 1 को गठबंधन करें - 5 और -2 पहले – Hardwareguy

0

यदि यह सबसे हालिया मैच से मेल नहीं खाता है, तो पूरी चीज गैरकानूनी हो जाती है या आप अन्य ifs से मेल नहीं खा सकते हैं। यह (केवल वास्तविक विकल्प मैं कल्पना कर सकता हूं) समझ में नहीं आता:

if(first) 
    if(second) 
     if(third) 
      doFirst(); 
     else 
      doSecond(); 
     else 
      doThird(); 

जो कि वैसे भी बहुत wtf है।

0

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

+0

-1 को गठबंधन करें "अधिकांश भाषाएं सबसे कम से कम मेल खाती हैं" < --- जो बताता है कि आप कुछ ऐसा कर सकते हैं जो करते हैं नहीं। और प्रश्नकर्ता क्या पूछ रहा था कि कौन सी भाषाएं नहीं हैं। तो आपने सवाल से परहेज किया है, और आपने सुझाव दिया है कि कुछ भाषाएं दूसरी व्याख्या लेती हैं, जब संभवतः कोई भाषा अन्य व्याख्या नहीं लेती है।यदि आप "अधिकतर भाषाओं" कहने जा रहे हैं तो आपको कम से कम 1 कहना चाहिए जो अन्यथा नहीं है, अन्यथा आप भ्रामक हैं। – barlop

1

द सी सी # काम करता है कि यह अन्य बयानों के इस्तेमाल के लिए अन्य बयानों से मेल खाता है।

यानी।

if (x == 1) 
    if (y == 1) 
     Console.WriteLine("Hello"); 
    else 
     Console.WriteLine("World"); 
else 
    Console.WriteLine("All your base are belong to us."); 

लेकिन यदि आप और कहाँ चला जाता है बदलना चाहते हैं।

if (x == 1) 
{ 
    if (y == 1) 
     Console.WriteLine("Hello World"); 
} 
else 
    Console.WriteLine("All your base are belong to us."); 
0

कोबोल, अंत अगर की शुरूआत करने से पहले, ठहराता है कि else if निकटतम के अंतर्गत आता है।

पिछले कुछ के अलावा, किसी को भी ईएलएस की समान संख्या के साथ आईएफ को संतुलित करना होगा। क्योंकि एक अनिवार्य होना चाहिए एक अगला संवेदना खंड जोड़ा जाना चाहिए। COBOL में किसी भी अन्य मामले [1] के रूप में समाधान की पसंद सबसे verbose कल्पना करने योग्य लगता है।

[1]: जब अन्य

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