খ [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?



আমি এখন আমার ভুল দেখতে পাচ্ছি এবং আমি পয়েন্টারগুলির সাথে তুলনা করে নিজেকে প্রথম বিভ্রান্ত করার কারণে দেজা ভের অনুভূতি পেয়েছি v
NoComprende

উত্তর:


14

এই অভিব্যক্তি

s.c_str()==""

দুটি তুলনায় দুটি পয়েন্টার (ঠিকানা) রয়েছে। প্রথমটি হ'ল পয়েন্টারটি ফেরত আসে s.c_str()এবং দ্বিতীয়টি হ'ল স্ট্রিংয়ের প্রথম অক্ষর (শূন্য অক্ষরের সমাপ্তি) এর পয়েন্টার ""

এটা স্পষ্ট যে ঠিকানাগুলি আলাদা (স্ট্রিং আক্ষরিকের স্ট্যাটিক স্টোরেজ সময়কাল থাকে তা মনে রাখবেন)।

প্রত্যাশিত ফলাফল পেতে আপনার পরিবর্তে লিখতে হবে

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

এই দুটি এক্সপ্রেশন হিসাবে

s==""

এবং

s==s.c_str()

তারপরে সেখানে তুলনামূলক স্ট্রিং রয়েছে কারণ স্ট্যান্ডার্ড ক্লাস স্ট্যান্ড :: স্ট্রিংয়ের ডান অপারেণ্ডের জন্য অপারেটর == ওভারলোড হয়েছে।


শেষের ক্ষেত্রে কী মানটি পয়েন্টারকে আলাদা হওয়ার নিশ্চয়তা দেয় ? আমি বুঝতে পারি তারা হতে পারে।
জেফ্রি

কেবল এটি যুক্ত করতে পারে এটি ইউবি হওয়া উচিত। "অনির্দিষ্ট আচরণে স্ট্রিং আক্ষরিক ফলাফলের সাথে তুলনা"
রোউট

@ জেফ্রে এটি গ্যারান্টিটিস কারণ কমপক্ষে স্ট্রিং ফাঁকা আছে :)
মস্কো থেকে ভ্লাদ

1
@ রুআউট - "ইউবি" এর অর্থ অনির্ধারিত আচরণ "It এর অর্থ হ'ল ভাষার সংজ্ঞা আপনাকে ** প্রোগ্রামের আচরণ কী তা বলে দেয় না und অপরিবর্তিত আচরণ সহ একটি প্রোগ্রাম বৈধ সি ++ প্রোগ্রাম নয়" "অনির্ধারিত আচরণ" এর অর্থ হ'ল বেশ কয়েকটি বিকল্প রয়েছে, এবং মানক আপনাকে জানায় না যেগুলির মধ্যে কোনটি বেছে নেওয়া হবে The প্রোগ্রামটি বৈধ, এবং বাস্তবায়ন বিকল্পগুলির মধ্যে যে কোনও একটি চয়ন করতে পারে
পিট বেকার

@PeteBecker UB সঙ্গে একটি প্রোগ্রাম হয় এখনও বৈধ সি ++ প্রোগ্রাম (অন্তত এই অর্থে যে এটা সফলভাবে প্রনয়ন এবং চালানোর হতে পারে মধ্যে)।
ট্রলি 813
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.