2009-07-10 12 views
6

में कंडीशन ऑर्डर सबसे पहले, शुरू होने से पहले, मैं वीसी ++ 2008 पेशेवर का उपयोग कर रहा हूं, विंडोज ओएस पर इंटेल कोर 2 चला रहा हूं। मुझे यह भी पता है कि यह कोड कोर 2/कोरि 7 विंडोज के अलावा किसी अन्य चीज़ पर कभी भी निष्पादित नहीं होगा।लूप

मेरे पास 2 स्थितियों के साथ थोड़ी देर लूप है जो इस तरह दिखता है: नोट: यह एक बहुत ही सरल संस्करण है।

while((a != b) && (array[a] < c)) 

पहली शर्त (a != b) एक झूठी उत्पन्न करता है, दूसरी शर्त भी मूल्यांकन किया जाएगा? या लूप अभी ठीक से समाप्त हो जाएगा?

मैंने कुछ परीक्षण किए और ऐसा लगता है कि यह वास्तव में सच है।

हालांकि, यहां पकड़ है। कब और यदि पहली स्थिति झूठी मूल्यांकन करती है, तो दूसरी स्थिति का मूल्यांकन होने पर पहुंच उल्लंघन उत्पन्न होगा। हालांकि, मैं जो देख सकता हूं उससे, पहली शर्त को झूठी के रूप में मूल्यांकन करने के बाद, कार्यक्रम दूसरी स्थिति का मूल्यांकन करने के लिए परेशान नहीं होता है और लूप छोड़ देता है, इस प्रकार मुझे बचाता है।

समस्या यह है कि मैं अपने बहुत अच्छे और साफ कोड को अचानक बिना उड़ाते हुए एक्सेस उल्लंघन समस्या से छुटकारा नहीं पा सकता हूं। हालांकि, छोटी "बग" के कारण (मुझे पता है कि यह एक कंपाइलर अनुकूलन है, बग नहीं है), मुझे लगता है कि इससे दूर जाने में सक्षम होना चाहिए। मुझे यह भी पता है कि यह संभवतः अच्छा प्रोग्रामिंग अभ्यास नहीं है, लेकिन ईमानदार होने के लिए, मेरी स्थिति में, यदि यह काम करता है, तो मैं पहले से ही खेल से आगे हूं।

मेरा सवाल है, क्या यह "बग" या प्रोग्रामिंग कदाचार वापस आ जाएगा और मुझे कुछ दिन काट देगा? यहां तक ​​कि जब मैंने इस खंड से बाहर नरक का परीक्षण किया और यह केवल एक बार इसका उपयोग करेगा?

+0

वाह आपको बहुत सारे प्रश्न हैं! आपको बस अपना मैसेंजर हाहा –

+0

जोड़ना चाहिए! मैं आपको एमएम पर संदेश भेजता हूं और आपको अपना संदेशवाहक देता हूं। दोस्त, यह 3 एमए की तरह है जहां आप हैं! क्या तुम सोते हो क्या आपको बस पसंद है ... यहाँ रहो? (मैं केवल इस देर से हूं क्योंकि यह एकमात्र समय है जब हर कोई सो रहा है और मुझे परेशान नहीं करता है इसलिए मैं अपने थीसिस पर कुछ काम कर सकता हूं)। – Faken

+0

मैं समय-समय पर अपनी कुछ साइटों की जांच करता हूं और आपके प्रश्न हमेशा मेरी रुचि रखते हैं और पृष्ठ के शीर्ष के पास होते हैं। यह थोड़ा डरावना हो रहा है। मैं वास्तव में जल्दी - जिम 2 घंटे में हूँ। –

उत्तर

22

दूसरी स्थिति का मूल्यांकन नहीं किया जाएगा जब तक कि पहले व्यक्ति का मूल्यांकन सही न हो। आप इस पर भरोसा कर सकते हैं। लाखों लाइन कोड काम करते हैं क्योंकि इस प्रकार सी और सी ++ शॉर्ट-कर्किट लॉजिकल एक्सप्रेशन मूल्यांकन करते हैं।

आप इसका उपयोग कर सकते हैं और उस पर भरोसा कर सकते हैं। यदि पहली अभिव्यक्ति गलत होने का मूल्यांकन करती है तो दूसरा भी मूल्यांकन शुरू नहीं करेगा।

+3

लेकिन क्या यह उपयोग करना ठीक है, भले ही दूसरी स्थिति संभावित रूप से प्रोग्राम को क्रैश कर देगी यदि कभी राज्य में मूल्यांकन किया जाता है जो पहली शर्त को झूठी वापसी का कारण बनता है? – Faken

+0

हां, कोई मानक-अनुरूप सी ++ कार्यान्वयन इसकी गारंटी देगा। – sharptooth

+1

@ फ़ेकन - हाँ, यह ठीक है। डोंट वोर्री! –

2

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

+0

मैं समझता हूं, लेकिन मेरे द्वारा लिखे गए कोड की मेरी छोटी अच्छी और साफ 13 लाइनें सही तरीके से काम करने के लिए इस पर निर्भर करती हैं ... अगर मैं इसे ठीक करता हूं तो मुझे बहुत कम अंतराल की गति और दक्षता खोने के लिए बहुत कुछ मिलता है। जब मेरा मतलब बहुत कम है तो मेरा मतलब है कि कोड निष्पादन 2-3 गुना धीमी गति से होगा। – Faken

+0

बस चिंता मत करो। हम शॉर्ट-कर्क्यूट मूल्यांकन के आधार पर भी कोड लिखते हैं। यदि आप लूप की स्थिति शुरुआत में झूठी हैं तो आप लूप को शुरू करने की उम्मीद नहीं करते हैं, है ना? वही यहाँ जाता है। – sharptooth

+0

मुझे रूचि है, आप क्यों सहमत हैं कि यह एक खराब प्रोग्रामिंग अभ्यास है? –

4

यह एक बग नहीं है। सी ++ शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है, इसलिए दूसरी स्थिति का मूल्यांकन कभी नहीं किया जाएगा जब पहली स्थिति गलत होती है।

1

भाषा इस छोटे सर्किटिंग व्यवहार की गारंटी देती है ताकि आपको इसका उपयोग करके सभी पर चिंता न हो। यह || के साथ भी काम करता है - यदि पहली शर्त सच है, तो दूसरे का मूल्यांकन नहीं किया जाता है।

1

सी ++ लॉजिकल के छोटे-सर्किटिंग व्यवहार पर निर्भर करते हुए और या ऑपरेटरों को खराब अभ्यास नहीं माना जाना चाहिए। यह पूरी तरह से मूर्खतापूर्ण है और अक्सर स्पष्ट और अधिक संक्षिप्त कोड की ओर जाता है।

उदा।

std::auto_ptr<SomeObject> data; 
शॉर्ट-सर्किट && साथ

:

// Clear expired data, if present 
if(data.get() && data->expired) 
    data.reset(); 

&& से कम-सर्किटिंग का उपयोग कर के बिना आप जो और अधिक वर्बोज़ कोड की ओर जाता है if की एक अतिरिक्त स्तर की जरूरत है।

// Clear expired data, if present 
if(data.get()) 
{ 
    if (data->expired) 
     data.reset(); 
} 
1

दूसरी स्थिति का मूल्यांकन नहीं किया जाएगा जब पहली शर्त सत्य नहीं है। जैसा कि आपने कहा था, यह अनुकूलन सभी सी ++ कंपाइलर्स द्वारा पीछा किया जाता है।

यदि आप अभी भी इसके साथ नहीं जा सकते हैं, तो थोड़ी देर में कथन जोड़ें।

while (a != b) { 
    if (array[a] < c) 
    { 
     // your code goes here. 
    } 
    else 
    { 
     break; 
    } 
}