IMO, वे जावा और C # में मुख्य रूप से शामिल हैं क्योंकि वे पहले से ही C ++ में मौजूद थे। वास्तविक प्रश्न, फिर, C ++ ऐसा क्यों है। सी + + ()16.3) के डिजाइन और विकास के अनुसार :
try
कीवर्ड पूरी तरह से बेमानी है और इसलिए कर रहे हैं { }
, जहां कई बयान वास्तव में एक कोशिश ब्लॉक या हैंडलर में किया जाता है को छोड़कर कोष्ठक। उदाहरण के लिए, यह अनुमति देने के लिए तुच्छ होगा:
int f()
{
return g() catch(xxii) { // not C++
error("G() goofed: xxii");
return 22;
};
}
हालांकि, मुझे यह समझाने में इतनी मुश्किल हुई कि समर्थन कर्मियों को भ्रमित उपयोगकर्ताओं से बचाने के लिए अतिरेक पेश किया गया था।
संपादित करें: जैसा कि यह भ्रामक होगा, इसलिए मुझे लगता है कि किसी को @Tom जेफरी के उत्तर (और विशेष रूप से, अप-वोटों की संख्या जो प्राप्त हुई है) में गलत दावे को देखने के लिए यह महसूस करना होगा कि कोई समस्या होगी। पार्सर के लिए, यह वास्तव में else
एस के साथ मेल खाने वाले एस से अलग नहीं है if
- अन्य समूह को मजबूर करने के लिए ब्रेसिज़ की कमी है, सभी catch
खंड सबसे हाल के साथ मेल खाएंगे throw
। उन दुर्व्यवहारों के लिए जो इसमें शामिल हैं, finally
खंड एक ही करेंगे। पार्सर के दृष्टिकोण से, यह शायद ही वर्तमान स्थिति से नोटिस करने के लिए अलग-अलग है - विशेष रूप से, क्योंकि व्याकरण अब खड़ा है, वहाँ वास्तव में catch
एक साथ खंडों को समूह करने के लिए कुछ भी नहीं है - ब्रैकेट समूह द्वारा नियंत्रित कथनों का समूहcatch
खंड, नहीं पकड़ खुद को रोक देता है।
एक पार्सर लिखने के दृष्टिकोण से, अंतर लगभग नोटिस करने के लिए बहुत छोटा है। अगर हम कुछ इस तरह से शुरू करते हैं:
simple_statement: /* won't try to cover all of this */
;
statement: compound_statement
| simple_statement
;
statements:
| statements statement
;
compound_statement: '{' statements '}'
catch_arg: '(' argument ')'
तब अंतर इस प्रकार होगा:
try_clause: 'try' statement
तथा:
try_clause: 'try' compound_statement
इसी तरह, क्लॉस पकड़ने के लिए:
catch_clause: 'catch' catch_arg statement
बनाम
catch_clause: 'catch' catch_arg compound_statement
एक पूर्ण कोशिश / कैच ब्लॉक की परिभाषा को हालांकि बिल्कुल भी बदलने की आवश्यकता नहीं होगी। किसी भी तरह से यह कुछ इस तरह होगा:
catch_clauses:
| catch_clauses catch_clause
;
try_block: try_clause catch_clauses [finally_clause]
;
[यहां मैं [whatever]
कुछ वैकल्पिक इंगित करने के लिए उपयोग कर रहा हूं , और मैं वाक्य रचना को छोड़ रहा हूं finally_clause
क्योंकि मुझे नहीं लगता कि इसका प्रश्न पर कोई असर है।]
यहां तक कि अगर आप वहां सभी Yacc जैसी व्याकरण की परिभाषा का पालन करने की कोशिश नहीं करते हैं, तो बिंदु को काफी आसानी से संक्षेप में प्रस्तुत किया जा सकता है: वह अंतिम विवरण (साथ शुरू try_block
) वह है जहां catch
क्लॉज क्लॉज के साथ मेल खाते try
हैं - और यह वास्तव में रहता है वही ब्रेस की आवश्यकता है या नहीं।
/ संक्षेप दोहराना करने के लिए: ब्रेसिज़ समूह को एक साथ नियंत्रित बयानों सेcatch
है, लेकिन ऐसा नहीं समूह catch
खुद को है। जैसे, उन ब्रेसिज़ का निर्णय लेने पर बिल्कुल कोई प्रभाव नहीं पड़ता है जो catch
किसके साथ जाती हैं try
। पार्सर / कंपाइलर के लिए कार्य समान रूप से आसान (या कठिन) है। इसके बावजूद, @ टॉम का जवाब (और इसे प्राप्त होने वाले वोटों की संख्या) इस तथ्य का पर्याप्त प्रदर्शन प्रदान करता है कि इस तरह का बदलाव उपयोगकर्ताओं को लगभग निश्चित रूप से भ्रमित करेगा ।
for
भागों के लिए कड़ाई से बोलने का नाम कुछ ऐसा होना चाहिएinitial
,condition
औरstep
जैसाinitial
कि एक चर को परिभाषित करने कीstep
आवश्यकता नहीं है और आवश्यकता नहीं है।