क्यों ख [2] झूठा है?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

सेट

b[] = {true, true, false};

क्यों b[2]झूठा है?

तो A==Bऔर A==C, कि संकेत नहीं दे सकते B==C?



मुझे अब अपनी गलती दिखती है और मुझे डीजा वु की अनुभूति हुई है क्योंकि यह पहली बार नहीं है जब मैंने बिंदुओं की तुलना में खुद को भ्रमित किया है।
NoComprende

जवाबों:


14

इस अभिव्यक्ति में

s.c_str()==""

दो बिंदुओं (पतों) की तुलना की जाती है। पहला पॉइंटर द्वारा लौटाया गया है s.c_str()और दूसरा स्ट्रिंगर के पहले वर्ण (टर्मिनेटिंग जीरो कैरेक्टर) का पॉइंटर है ""

यह स्पष्ट है कि पते अलग हैं (यह भी ध्यान रखें कि स्ट्रिंग शाब्दिक में स्थिर भंडारण अवधि है)।

अपेक्षित परिणाम प्राप्त करने के लिए आपको इसके बजाय लिखना चाहिए

std::strcmp( s.c_str(), "" ) == 0

इन दो भावों के लिए

s==""

तथा

s==s.c_str()

तब स्टिंग्स की तुलना की जाती है क्योंकि मानक वर्ग std :: string में ओवरलोडेड ऑपरेटर == सही ऑपरेंड के लिए होता है।


क्या मानक अंतिम बिंदु में, अलग-अलग होने की गारंटी देता है? मैं समझता हूं कि वे हो सकते हैं।
जेफरी

केवल यह जोड़ सकता है कि यह यूबी होना चाहिए। "अनिर्दिष्ट व्यवहार में स्ट्रिंग शाब्दिक परिणामों के साथ तुलना"
रॉउट

@ जेफ्री यह गारंटी देता है क्योंकि कम से कम स्ट्रिंग खाली है। :) लेकिन किसी भी स्थिति में वर्ग std :: string इसके निर्माता के तर्क की एक प्रति का उपयोग करता है।
मॉस्को

1
@Roout - "UB" का अर्थ अपरिभाषित व्यवहार है "। इसका मतलब है कि भाषा की परिभाषा आपको यह नहीं बताती है कि ** कार्यक्रम का व्यवहार क्या है। अपरिभाषित व्यवहार वाला कोई प्रोग्राम वैध C ++ प्रोग्राम नहीं है।" अनिर्दिष्ट व्यवहार "का अर्थ है कि कई विकल्प हैं, और मानक आपको यह नहीं बताता है कि उनमें से किसे चुना जाएगा। कार्यक्रम वैध है, और कार्यान्वयन किसी भी विकल्प को चुन सकता है।
पीट बेकर

@PeteBecker यूबी के साथ एक कार्यक्रम है अभी भी मान्य सी ++ प्रोग्राम (कम से कम इस अर्थ में कि इसे सफलतापूर्वक संकलित करता है तथा चलाया जा सकता है में)।
trolley813
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.