2012-10-17 18 views
5

हैलो मैं नीचे दिए गए कोड:अनुकूलित रास्ता

enum {a, b, c, d, ..., z} abc; 

int main() 
{ 
    int val = 20; 
    if (val == a || val == b ||val == c||val == d..... || val == z) 
    { 
    /*Do something*/ 
    } 
} 

क्या कोई अन्य रास्ता नहीं है ताकि हम OR आपरेशन को छोड़ सकते हैं क्योंकि अगर वहाँ enum के 1000s हैं सदस्य तो हम सभी सदस्यों के साथ जांच के साथ आगे कैसे कर सकते हैं। कृपया मदद करें।

+4

'अगर (वैल> = एक || वैल <= जेड) {/ * कुछ */करना}' – jrok

+0

@jrok: यदि 'एक = 1', और 'डी = 20' फिर? –

+2

आपका पोस्ट कोड गलत है। यह 'बिट' मानता है 'या' मानों 'ए', 'बी',' सी', ... और परिणाम के लिए 'val' की तुलना करता है। (और 'मुख्य' के लिए सही घोषणा सी ++ के लिए सी, 'int मुख्य()' के लिए 'int मुख्य (शून्य) है।) –

उत्तर

0

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

अगर (वैल < = जेड)

+1

enum के लिए क्रमिक मान एक नियम नहीं है जिसमें आप enum {a = 1; b = 4; c = 34 ..} abc; जो निश्चित रूप से सी ++ –

+2

में मान्य है। लेकिन, उदाहरण में, वे अनुक्रमिक रूप से असाइन किए गए हैं। – Alican

+0

@ एड्रियनहेरिया: और समान रूप से मान्य सी, लेकिन यह केवल तभी प्रासंगिक है जब गणना प्रकार को इस तरह परिभाषित किया गया हो। –

0

आप सी में एक नक्शे के इस्तेमाल कर सकते हैं ++। मानचित्र के साथ आप कई == और || के बिना एक कॉम्पैक्ट परीक्षण लिख सकते हैं।

लेकिन आपको पहले नक्शा आरंभ करने की आवश्यकता है और मुझे यकीन नहीं है कि क्या आप इस प्रारंभिकरण को मनमाने ढंग से enum के लिए एक कॉम्पैक्ट तरीके से कर सकते हैं।

#include <iostream> 
#include <map> 

using namespace std; 

enum abc { a = 1, b = -1, c = 3, d = 0 }; 

int main() 
{ 
    map<int, int> m; 
    m[a] = m[b] = m[c] = m[d] = 1; 
    cout << "b is " << ((m.find(b) == m.end()) ? "NOT " : "") << "in m" << endl; 
    cout << "3 is " << ((m.find(3) == m.end()) ? "NOT " : "") << "in m" << endl; 
    cout << "10 is " << ((m.find(10) == m.end()) ? "NOT " : "") << "in m" << endl; 
    return 0; 
} 

आउटपुट (ideone):

b is in m 
3 is in m 
10 is NOT in m 
5

एक आधुनिक संकलक सिर्फ हैं, तो आपके मामले में, अभिव्यक्ति के मूल्य संकलन समय पर जाना जाता है इस तरह के कोड का अनुकूलन करने में सक्षम होना चाहिए। पठनीयता और त्रुटि जाँच के लिए मुझे लगता है कि एक switch का उपयोग कर बेहतर होगा:

switch (val) { 
case a:; 
case b:; 
.... 
// your code goes here 
} 

के रूप में कहा, प्रदर्शन बुद्धिमान वहाँ नहीं अधिक अंतर होना चाहिए, संकलक एक मेज देखने को यह बदल सकते हैं (या अन्य चालाक बातें) अगर val संकलन समय पर जाना जाता है तो उचित या पूरी तरह अनुकूलित करें।

लेकिन आप यहां त्रुटि जांच कंपाइलर्स का लाभ उठा सकते हैं। यदि आपके पास default केस नहीं है, तो अधिकांश कंपाइलर आपको चेतावनी देंगे कि क्या आप गणित स्थिरांक में से एक को छोड़ देते हैं। इसके अलावा मुझे लगता है कि यह स्पष्ट है, क्योंकि यह पूरे स्थान पर val के मूल्यांकन को दोहराता नहीं है।

1

अन्य (तेज) समाधान हो जाएगा निम्नलिखित

bool isInenum (int val) 
{ 
    bool retVal = false 
     switch(val) 

    { 
     case a: 
     case b: 
     case c: 
     case d: 
      { 
       retVal = true; 
      } 

    } 
    return retVal; 
} 
संबंधित मुद्दे