2009-12-16 14 views
7

मैं सिर्फ कोड की निम्न पंक्ति लिखा है:समुचित उपयोग

if (++(data_ptr->count) > threshold) { /*...*/ } // example 1 

मेरे इरादे डेटा संरचना के भीतर count चर बढ़ाने के लिए है कि data_ptr अंक threshold की तुलना करने से पहले, और कोड की यह पंक्ति काम करता है।

मैं बजाय तुलना करने से पहले data_ptr बढ़ाने के लिए चाहते थे, तो मैं इस प्रश्न के लिखित है |:

if ((++data_ptr)->count > threshold) { /*...*/ } // example 2 
जिज्ञासा से बाहर

, मैं भी कोड की इस पंक्ति की कोशिश की:

if (++data_ptr->count > threshold) { /*...*/ } // example 3 

और पाया कि यह बिल्कुल पहले जैसा ही व्यवहार करता है।

पहला सवाल:क्यों 3 काम # 1 उदाहरण के रूप में ही होता है उदाहरण #? क्या यह ऑपरेटर की सटीकता का मामला है? मानक में कुछ? मुझे एक त्वरित परीक्षण कार्यक्रम लिखना पड़ा क्योंकि जवाब मेरे लिए स्पष्ट नहीं था।

दूसरा प्रश्न: क्या मुझे यह if कथन अलग-अलग लिखना चाहिए? मैं पहले अपनी लाइन पर वृद्धि कर सकता हूं, और तो किसी भी संभावित भ्रम से बचने के लिए स्थिति का परीक्षण कर सकता हूं। क्या यह आवश्यक है, या पहले दो उदाहरण अपने आप पर पर्याप्त स्पष्ट हैं?

उत्तर

11

1) पूर्वता

2) पसंद

+3

+1 संक्षिप्त। '' –

3
  1. -> ऑपरेटर ++ से अधिक कठिन होता है।
  2. वे दोनों अच्छी तरह से परिभाषित हैं और मुझे लगता है कि वे पढ़ने में आसान हैं। यदि आपके पास समान अभिव्यक्ति में data_ptr के अतिरिक्त संदर्भ थे, तो चीजें केवल तभी मिल जाएंगी।
5

हां, यह ऑपरेटर प्राथमिकता का सवाल है। वृद्धि ऑपरेटर की तुलना में तीर ऑपरेटर has higher precedence

अपने दूसरे सवाल का जवाब करने के लिए, मैं आम तौर पर दो अलग-अलग बयानों में निर्माण बाहर के इस प्रकार अलग होगा:

++(data_ptr->count); 
if(data_ptr->count > threshold) { /*...*/ } 

इस पर जोर देती है कि क्या हो रहा है और संभव भ्रम समाप्त कर रहा है। हालांकि, यह शायद वरीयता का सवाल है।

5
  1. ऑपरेटर पूर्वता व्यवहार आप मनाया तय।
  2. यदि आप इस उदाहरण में तुलना से वृद्धि को अलग करते हैं तो यह अधिक चोट नहीं पहुंचाएगा, लेकिन कभी-कभी आप शर्तों के अनुक्रम के बीच में वृद्धि के साथ एक शर्त चाहते हैं, और फिर परीक्षण से वृद्धि को अलग करने की कोशिश कर रहे हैं नेस्टिंग शुरू करके कोड की पठनीयता को नुकसान पहुंचा सकता है जो अन्यथा अनावश्यक होगा।

उदाहरण के लिए:

if (...1...) 
    ...2... 
else if (++data_ptr->count > threshold) 
    ...3... 
else 
    ...4... 

बनाम:

if (...1...) 
    ...2... 
else 
{ 
    ++data_ptr->count; 
    if (data_ptr->count > threshold) 
     ...3... 
    else 
     ...4... 
}