"a" == "a"
यह अभिव्यक्ति true
या false
उपज सकता है; कोई गारंटी नहीं है। दो "a"
स्ट्रिंग अक्षर एक ही भंडारण पर कब्जा कर सकते हैं या वे स्मृति में दो अलग-अलग स्थानों पर मौजूद हो सकते हैं।
मुझे लगता है कि सी ++ मानक में सबसे नज़दीकी भाषा है: "क्या सभी स्ट्रिंग अक्षर अलग हैं (यानी, nonoverlapping ऑब्जेक्ट्स में संग्रहीत हैं) कार्यान्वयन परिभाषित किया गया है" (सी ++ 11 §2.14.5/12)। कोई अन्य आवश्यकताएं या प्रतिबंध नहीं हैं, इसलिए परिणाम अनिर्दिष्ट छोड़ दिया गया है।
"a" != "b"
यह अभिव्यक्ति false
उपज चाहिए कोई रास्ता नहीं है कि इन दो स्ट्रिंग शाब्दिक स्मृति में एक ही स्थान पर कब्जा कर सकते हैं क्योंकि वहाँ: "a"[0] != "b"[0]
।
आप इस तरह से स्ट्रिंग शाब्दिक तुलना, तुम सच में सरणियों में प्रारंभिक तत्वों की ओर इशारा तुलना कर रहे हैं जब।
क्योंकि हम संकेत दिए गए, संबंधपरक तुलना तुलना कर रहे हैं (<
, >
, <=
, और >=
) भी समानता तुलना (==
और !=
) की तुलना में अधिक समस्याग्रस्त क्योंकि सूचक तुलना की केवल एक सीमित सेट रिलेशनल का उपयोग किया जा सकता है तुलना। दो पॉइंटर्स केवल तुलनात्मक रूप से तुलना किए जा सकते हैं यदि वे दोनों एक ही ऑब्जेक्ट में पॉइंटर्स या उसी ऑब्जेक्ट में पॉइंटर्स हैं।
दो "a"
स्ट्रिंग शाब्दिक स्मृति में एक ही स्थान पर कब्जा है, तो "a" < "a"
अच्छी तरह से परिभाषित किया जाएगा और false
प्राप्त होते हैं, क्योंकि दोनों एक ही संकेत देता है की प्रारंभिक तत्व ('a'
) को इंगित।
हालांकि, अगर दो "a"
स्ट्रिंग शाब्दिक स्मृति में अलग स्थानों पर कब्जा है, "a" < "a"
का परिणाम अपरिभाषित, क्योंकि दो संकेत तुलना की जा रही पूरी तरह से असंबंधित वस्तुओं में बिंदु है।
क्योंकि "a"
और "b"
स्मृति में उसी स्थान पर कभी भी कब्जा नहीं कर सकता, "a" < "b"
हमेशा व्यवहार को अपरिभाषित करता है। अन्य रिलेशनल तुलना ऑपरेटर के लिए भी यही सच है।
यदि आपने कुछ कारणों से, दो स्ट्रिंग अक्षर की तुलनात्मक रूप से तुलना करना चाहते हैं और अच्छी तरह से परिभाषित परिणाम चाहते हैं, तो आप std::less
तुलनाकर्ता का उपयोग कर सकते हैं, जो सभी पॉइंटर्स पर सख्त कमजोर आदेश प्रदान करता है। std::greater
, std::greater_equal
, और std::less_equal
तुलनाकर्ता भी हैं।यह देखते हुए कि एक ही सामग्री के साथ स्ट्रिंग अक्षर बराबर की तुलना नहीं कर सकते हैं, मुझे नहीं पता कि कोई ऐसा क्यों करना चाहेगा, लेकिन आप कर सकते हैं।
आपको ऐसा करने की आवश्यकता क्यों होगी? गारंटीकृत झूठी के लिए, 'जोर दें (! "संदेश यहां जाता है"); ' – chris
@ क्रिस: एक के लिए जिज्ञासा। एक enum- जैसे वर्ग कार्यान्वयन विचार के लिए भी। –
[जीसीसी और टर्बो सी में आउटपुट अंतर] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3289354/output-difference-in-gcc-and-turbo-c) – kennytm