2011-11-11 13 views
5

पीसी फाहा के अनुसार, निम्नलिखित बयान TRUE कभी नहीं होगा:क्या यह सी/सी ++ अगर() कथन कभी भी सत्य का मूल्यांकन कर सकता है?

if((variable & 0x02) == 1) 

मैं TRUE को एम्बेडेड सिस्टम के लिए एक सी संकलक है कि यह मूल्यांकन करता है का उपयोग कर रहा है जब भी variable में इसी बिट सेट है। मुझे लगता है कि संकलक TRUE/FALSE परिणामस्वरूप संख्याओं की तुलना करने के बजाय == के दोनों किनारों की तुलना कर रहा है। दूसरे शब्दों में, हर बार अभिव्यक्ति (varable & 0x02) नहीं शून्य (अर्थात TRUE), बयान भी TRUE हो जाएगा, मूल्य के बाद से 1 is also TRUE (नहीं शून्य)।

अगर C/C++ मानकों स्पष्ट रूप से कैसे एक संकलक इस मामले में व्यवहार करना चाहिए परिभाषित मैं नहीं जानता। क्या वहां कोई C/C++ विशेषज्ञ हैं जो मानकों के आधार पर इस प्रश्न का उत्तर दे सकते हैं (उदा। C90, C99, आदि) कहें?

पी.एस .: बयान में इसके बाद के संस्करण, "चर" एक अहस्ताक्षरित चार है।

+4

'variable' के प्रकार क्या है हो जाएगा इंगित करता है? –

+2

क्या आप इस कंपाइलर को नाम दे सकते हैं? मेरा एक दोस्त अजीब कंपाइलर कीड़े का संग्रह बनाता है। – blaze

+1

क्या यह संभव है कि आपके असली कोड में डबल एम्पर्सेंड (उदा। "Var && 0x02") है? यह संकलक को यथासंभव मूल्यांकन करने की व्याख्या करेगा। – tinman

उत्तर

11

पीसी-लिंट सही है। मान लिया जाये कि var एक पूर्णांक चर रहा है, अभिव्यक्ति var & 0x02 दो मूल्यों का मूल्यांकन कर सकते हैं: 0 और 2। यह कभी भी 1 के बराबर नहीं होगा, जो if कथन का परीक्षण कर रहा है।

इस पर विस्तार करने के लिए, समानता ऑपरेटर दो पूर्णांक मूल्यों के लिए लागू किया जा रहा है। क्या मायने रखता है कि दोनों ऑपरेंड एक ही संख्या का मूल्यांकन करते हैं, भले ही वे दोनों एक साथ "सत्य" या "झूठी" हों।

परीक्षण करने के लिए थोड़ा और 1 सेट कर दिया जाता है, एक का उपयोग कर सकते हैं:

if (variable & 0x02) { 
    ... 
} 

यह देखते हुए कि अपने संकलक जिस तरह से आप कहते हैं कि यह होता है, यह स्पष्ट रूप से गैर-संगत है व्यवहार करता है। हालांकि, यह लगभग निश्चित रूप से if (variable & 0x02) को सही ढंग से संभाल लेगा। मेरी सिफारिश कोड को ठीक करना होगा ताकि आप कभी भी कंपाइलर्स को बदलने के लिए चुपचाप तोड़ नहीं पाएंगे। (1) कोड सी ++ और नहीं सी है,:

अंत में, स्थिति अलग है, तो है और (2) variable एक वर्ग का उदाहरण है; और (3) कक्षा ऑपरेटर को प्रश्न में अधिभारित करती है। उस स्थिति में, ओवरलैड ऑपरेटर वास्तव में क्या करते हैं, इस पर व्यवहार कम हो जाता है।

+0

ऐसा इसलिए है क्योंकि '0x02' के अपने बिट पैटर्न में बस एक बिट सेट है। –

+4

ओवरलोडेड ऑपरेटरों की उपस्थिति के कारण सी ++ में यह मामला नहीं है। – bdonlan

+2

आदर्श रूप से आपको हमेशा 'if ((variable & CONST) == CONST) पैटर्न का उपयोग करना चाहिए, यदि आप यह देखना चाहते हैं कि किसी दिए गए मुखौटा में सभी बिट्स सेट हैं या नहीं। – tylerl

6

सी ++ में, यह वास्तविक मान का मूल्यांकन कर सकता है यदि (और केवल अगर) variable एक अधिभारित operator& के साथ एक वर्ग का उदाहरण है जो सामान्य बिटवाई और अर्थशास्त्र के अनुरूप नहीं है।

सी में, यह स्थिति हमेशा गलत होगी। §6.5.10 बिटवाइज़ AND ऑपरेटर के शब्दों को परिभाषित करता है, और यह काफी सरल है और बात करने के लिए:

  4. द्विआधारी & ऑपरेटर का परिणाम बिटवाइज़ और ऑपरेंड के (जो है, प्रत्येक है बिट में परिणाम सेट किया गया है यदि केवल तभी परिवर्तित किए गए ऑपरेटरों में से प्रत्येक संबंधित बिट्स सेट है)।

यह स्पष्ट है कि परिणाम 1 नहीं किया जा सकता, के रूप में 1 बिट दाएँ हाथ की ओर संकार्य की परिवर्तित मूल्य में सेट नहीं है (यानी, 0x02)।

स्वाभाविक रूप से, यदि कार्यक्रम के अतीत (या संकलन समय पर) में किसी बिंदु पर अपरिभाषित व्यवहार लागू किया गया है, तो कुछ भी हो सकता है। इस संभावना को छोड़कर, हालांकि, आपका कंपाइलर गैर-अनुपालनशील है। यह कहना है, टूटा हुआ। दुर्भाग्य से, बेहद विषम एम्बेडेड कंपाइलर्स पर आम है। यदि आप भाग्यशाली हैं, तो आप भी बग की रिपोर्ट करने और इसे ठीक करने में सक्षम हो सकते हैं।

4

मुझे नहीं लगता कि मानक इस विशिष्ट और असामान्य मुद्दे के बारे में कुछ भी परिभाषित करता है। aix के कहे अनुसार, कि बयान कभी नहीं क्योंकि (बाइनरी में) सच हो सकता है:

XXXX XXXX -> variable 
0000 0010 -> 0x02 
--------- AND 
0000 00X0 -> result 

(8-बिट करने के लिए सरल बनाने प्रकार)

तो अपने ही परिणाम 0000 0010 हो सकता है (जो 2 है) या 0000 0000 (जो 0 है)।

+1

दृश्य प्रतिनिधित्व के लिए धन्यवाद :) – AntonioCS

0

असल में, लिंट ठीक है। कम से कम किसी भी प्लेटफ़ॉर्म पर मुझे पता है कि स्थिति झूठी होगी। संख्याओं के बिट प्रतिनिधित्व को देखें: x & 2 (0010) हमेशा शून्य या 2 (0010) होगा और इस प्रकार किसी भी पूर्णांक x के लिए 1 (0001) से अलग होगा।

1

सी के लिए, उत्तर नहीं है।

C standard कहते हैं के बारे में & (6.5.10):

द्विआधारी & ऑपरेटर का परिणाम बिटवाइज़ है और ऑपरेंड (जो है की, प्रत्येक बिट में परिणाम तभी सेट किया गया है यदि परिवर्तित ऑपरेंड में संबंधित बिट्स में से प्रत्येक सेट है)।

2 में के बाद से केवल थोड़ा 1 सेट किया गया है, अभिव्यक्ति के मूल्य केवल निर्धारित किया है सकते हैं बिट 1. यह 2 और 0. न तो 2 और न ही 0 के अलावा कोई अन्य मानों को लेकर 1 के बराबर की तुलना कर सकते कर सकते हैं।

पूर्णांक के बिट प्रतिनिधित्व 6.2.6.2 (सामान्य तरीके से गैर-ऋणात्मक मानों के लिए) में परिभाषित किए गए हैं।

0

हमें 2

02 = 0010 (say a 4 bit number) 

की बाइनरी मान और 1 की बाइनरी मूल्य पर विचार करें

01 = 0001 

है 2 के कम से कम significat बिट हमेशा शून्य है कि छोड़ दिया सबसे सा 0 है SO
& (और) 0 के साथ ऑपरेशन कभी नहीं देता है इसलिए हम कह सकते हैं कि यह 1

के बराबर कभी नहीं हो सकता 210

नोट: & बिट बुद्धिमान और ऑपरेशन

2 - 0010 
    3 - 0011 
     0010 

तो xx & 2 के साथ उत्पादन 0 या 2.

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