2012-11-28 48 views
5

में सच है, मेरा प्रश्न शायद बेवकूफ लगता है, लेकिन मुझे अपनी स्नातक परीक्षा में खुद को तैयार करते समय इसका उत्तर देना होगा।अभिव्यक्ति 'ab' == "ab" सी ++

तो, आप सी ++ में ऐसी अभिव्यक्ति 'ab' == "ab" के बारे में क्या सोचते हैं? क्या यह सच नहीं है या बस कानूनी और संकलन त्रुटि नहीं है? मैं एक छोटे से googled और पता चला है कि 'अब' प्रकार int और निश्चित नहीं की "ab" में है मिलता है ...

मैं नहीं क्या compilator कहते हैं लेकिन क्या भाषा के औपचारिक विवरण का कहना है के संबंध में करने के लिए है ..

+2

यदि यह मानक-अनुरूप है तो संकलक मानक का एक अच्छा संकेत होना चाहिए। – chris

+0

http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters यह –

+0

किसी भी "यह संकलन करता है" के लिए अनिवार्य प्रतिक्रिया में मदद कर सकता है? प्रश्न: क्या आपने इसे संकलित करने की कोशिश की है? – Kevin

उत्तर

4

यह निश्चित रूप से एक चेतावनी उत्पन्न करता है, लेकिन डिफ़ॉल्ट रूप से, gcc इसे संकलित करता है। यह सामान्य रूप से गलत होना चाहिए।

कहा जा रहा है, यह सैद्धांतिक रूप से संभव, संकलन समय निरंतर "ab" एक स्मृति स्थान जिसका पता संख्यात्मक मूल्य के लिए संख्यात्मक मूल्य में बराबर है पर है करने के लिए किया जाना चाहिए प्लेटफ़ॉर्म के आधार पर निश्चित रूप से आप इस पर चला रहे हैं, 'ab' का, जिस मामले में अभिव्यक्ति सच होगी (हालांकि तुलना निश्चित रूप से अर्थहीन है)।

1

यह आपको एक चेतावनी देने जा रहा है, लेकिन यह निर्माण करेगा। यह क्या करेगा स्ट्रिंग अक्षर "ab" के पते के साथ multibyte पूर्णांक 'ab' की तुलना करें।

नीचे की रेखा, तुलना का परिणाम अक्षरों की पसंद को समान या नहीं दिखाएगा।

0

मानक के पास एक अभिन्न प्रकार की तुलना करने के बारे में कहने के लिए बिल्कुल कुछ भी नहीं है।

The operands shall have arithmetic, enumeration, or pointer type, or type std::nullptr_t...

यह तो क्या यह दो संकेत तुलना करने के लिए इसका मतलब है, और दो पूर्णांकों की तुलना उल्लेख पर एक विस्तृत वर्णन में चला जाता है: सभी यह कहते हैं निम्नलिखित (खंड 5.9 इंच) है। तो विनिर्देश की कमी की मेरी व्याख्या "जो भी संकलक लेखक निर्णय लेती है" होगी, जो या तो एक त्रुटि या चेतावनी है।

+1

वास्तव में, मानक उपज में विनिर्देश की कमी अपरिभाषित व्यवहार। मुझे लगता है कि इसका मतलब यह हो सकता है कि "जो भी संकलक निर्णय लेता है," लेकिन यह अनिर्दिष्ट व्यवहार से भ्रमित हो सकता है। Unspec व्यवहार एक अच्छी तरह से गठित कार्यक्रम पैदा करता है, लेकिन Undef व्यवहार नहीं करता है। –

0

इसे सरल सी में भागों पर विचार करने दें, 'सी' एक साधारण चार है यदि आप स्ट्रिंग्स में हेरफेर करना चाहते हैं तो आपको वर्णों की सरणी का उपयोग करना होगा, नतीजतन 'सीए' आपको जिस तरह से उम्मीद करनी चाहिए , और सी ++ में यह सामान अभी भी मान्य है। यदि आप स्ट्रिंग्स का उपयोग करना चाहते हैं तो आपको स्ट्रिंग क्लास का उपयोग करना होगा जो कच्चे प्रकार का नहीं है। और यह सब कुछ करता है जिसमें विधियों और प्रकार def के साथ एक वर्ग है ताकि आप सरणी के वर्णों को आसान बना सकें। नतीजतन सी-स्टाइल-स्ट्रिंग और वर्णों की सरणी अलग-अलग चीजें हैं, क्योंकि परिणाम 'ab' == "ab" वैध बुलियन प्रतिक्रिया देने वाला नहीं है। यह एक स्ट्रिंग के लिए एक int की तुलना करने की कोशिश की तरह है। तो, यह comaprison सबसे अधिक संभावना एक फेंक फेंक देगा।

4

सी और सी ++ अभिव्यक्ति दोनों में 'ab' == "ab" अमान्य है। इसका कोई मतलब नहीं है। न तो भाषा पॉइंटर मूल्यों के साथ मनमानी अभिन्न मूल्यों की तुलना करने की अनुमति देती है। इस कारण से, इसका विषय "सत्य" है या नहीं भी उठता है। इसे एक संकलित अभिव्यक्ति में बदलने के लिए आपको ऑपरेटरों को तुलनीय प्रकारों में स्पष्ट रूप से डालना होगा।

यहां केवल एक ही छेड़छाड़ यह है कि मल्टी-चार वर्ण निरंतरता का मान कार्यान्वयन-परिभाषित है। अगर कुछ कार्यान्वयन में 'ab' का मान शून्य होता है, तो यह शून्य-सूचक स्थिरांक के रूप में कार्य कर सकता है। उस स्थिति में 'ab' == "ab"0 == "ab" और NULL == "ab" के बराबर हो जाता है। यह झूठी होने की गारंटी है।