2011-09-17 10 views
7

पृष्ठभूमिसी कारण में अंतर्निहित कास्ट कर सकते हैं?

पिछली बार मैं चाहे कोष्ठकों निहित डाली (here) पैदा कर रहे थे के बारे में पूछा, @pmg काफी अच्छा करते रहे कि 'सी में कुछ भी पूर्णांक नीचे किया जाता है "लेकिन वहाँ था, चर्चा के बारे में था bitwise ऑपरेटरों, और कोष्ठक सिर्फ एक व्याकुलता के रूप में बाहर निकला।

परिचय

नीचे, कोष्ठकों मुख्य आकर्षण हैं। या, अधिक उबाऊ लेकिन सटीक होने के लिए, मैं देखता हूं केवल एकमात्र ऑपरेटरों कोष्ठक और असाइनमेंट ऑपरेटर हैं।

At this reference about the C parentheses operator, मुझे इस प्रकार को बदलने वाले कोष्ठक के बारे में कुछ भी नहीं दिख रहा है (टाइपकास्ट सिंटैक्स के बाहर, जो इस मामले में नहीं है)।

इस बीच, here's a reference that reminds that there is automatic type conversion on assignment, लेकिन मुझे नहीं लगता कि यह स्थिर विश्लेषण टूल व्यवहार की व्याख्या करेगा जो मैं यहां बताऊंगा।

मेरे पिछले प्रश्न के रूप में, "ठीक है" का मतलब है कि स्थिर विश्लेषण उपकरण नहीं एक निहित जैसे रूपांतरण के बारे में चेतावनी किया था, और "नहीं ठीक है" का मतलब है कि यह किया।

int main(void) 
{ 
    unsigned int ui; 
    int i; 

    ui = (256U); // NOT OK (*) (1) 
    i = (256U); // NOT OK (*) (2) 

    i = 256; // OK 
    i = 256U; // NOT OK 
    ui = 256U; // OK (3) 
    ui = 256; // NOT OK 

return(0); 
} 

मैं उन्हें पहले दो को छोड़कर सभी को समझ सकता हूं - कोष्ठक क्या करते हैं? अगर वे अंतर्निहित टाइपकास्टिंग के रास्ते में कुछ भी नहीं करते हैं, तो मैं उम्मीद करता हूं कि (1) ठीक हो और (2) ठीक न हो। यदि वे int int int से छोटे प्रकार के स्वचालित प्रकार के प्रचार करते हैं, तो मैं उम्मीद करता हूं कि (1) ठीक नहीं होगा और (2) ठीक होने के लिए। लेकिन यह टूल कहता है कि दोनों ठीक नहीं हैं।

क्या यह एक स्थिर विश्लेषण उपकरण त्रुटि है, या उपकरण सही है और सी में अंतर्निहित प्रकार रूपांतरणों के बारे में जानने के लिए मुझे कुछ और चाहिए?

Btw (मुझे आशा है कि मूल्य 256 पर्याप्त मेरी मशीन पर अतिप्रवाह नहीं उत्पन्न कर छोटा है ...)

+2

आपका स्थिर विश्लेषण उपकरण संभवतः गलत है। आप किस उपकरण का उपयोग कर रहे हैं, और यह आपको क्या त्रुटियां बताता है? – nos

+0

सी मानक गारंटी देता है कि 256 का मान अंकगणित में नहीं, पूर्वप्रोसेसर में नहीं होगा - जब तक इसे किसी प्रकार के 'char' को असाइन नहीं किया जाता है। –

उत्तर

8

सबसे पहले, कुछ शब्दावली को साफ़ करते हैं। कुछ भी "निहित कास्ट" का कारण बन सकता है, क्योंकि ऐसी कोई चीज़ नहीं है। कास्ट एक स्पष्ट ऑपरेटर है, जिसमें अभिव्यक्ति से पहले कोष्ठक में एक प्रकार का नाम शामिल है, जैसे (double)42; यह रूपांतरण निर्दिष्ट करता है। रूपांतरण या तो स्पष्ट हो सकते हैं (एक कास्ट ऑपरेटर द्वारा निर्दिष्ट) या अंतर्निहित, double x = 42; में। तो आप वास्तव में क्या पूछ रहे हैं कि क्या ब्रांड्स एक अंतर्निहित रूपांतरण का कारण बन सकता है।

और उत्तर, कम से कम उस कोड में जो आपने हमें दिखाया है, है ना।

C99 standard (3,7 एमबी पीडीएफ) का हवाला देते हुए, खंड 6.5.1p5:

एक parenthesized अभिव्यक्ति एक प्राथमिक अभिव्यक्ति है। इसका प्रकार और मान अनपेक्षित अभिव्यक्ति के समान हैं।यह लैवल्यू, एक फ़ंक्शन डिज़ाइनर, या शून्य अभिव्यक्ति है यदि अनपेक्षित अभिव्यक्ति क्रमशः एक लवल्यू, एक फ़ंक्शन डिज़ाइनर या शून्य अभिव्यक्ति है।

और 256U के बाद से पहले से ही एक primary expression है, कोष्ठक सभी में कोई फर्क; कोष्ठक आमतौर पर प्राथमिकता को इंगित करते हैं, लेकिन इस मामले में संकेत देने के लिए कोई पूर्वाग्रह नहीं है।

आप किस स्थिर विश्लेषण उपकरण का उपयोग कर रहे हैं? आपको शायद एक बग रिपोर्ट जमा करनी चाहिए।

+1

+1 उसी के लिए भी मेरे द्वारा कास्ट –

+0

+1 की परिभाषा को स्पष्ट करने के लिए +1। मैं भविष्य में शब्दावली के साथ और अधिक सावधान रहूंगा। – talkaboutquality

4

उपकरण किसी भी तरह उलझन में है। यहां कोई कास्टिंग नहीं है। वे कोष्ठक सिर्फ प्राथमिकता इंगित करते हैं।

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