== এবং! = পারস্পরিক নির্ভরশীল?


292

আমি সি ++ এ অপারেটর ওভারলোডিং সম্পর্কে শিখছি, এবং আমি এটি দেখতে পাচ্ছি ==এবং !=কেবল এমন কিছু বিশেষ ফাংশন যা ব্যবহারকারী-সংজ্ঞায়িত ধরণের জন্য অনুকূলিতকরণ করা যায়। আমার উদ্বেগ, যদিও, কেন দুটি পৃথক সংজ্ঞা প্রয়োজন? আমি ভেবেছিলাম যে যদি a == bএটি সত্য হয় তবে a != bতা স্বয়ংক্রিয়ভাবে মিথ্যা এবং তদ্বিপরীত, এবং অন্য কোনও সম্ভাবনা নেই, কারণ, সংজ্ঞা অনুসারে, a != bএটি !(a == b)। এবং আমি এমন কোনও পরিস্থিতি কল্পনা করতে পারি না যেখানে এটি সত্য ছিল না। তবে সম্ভবত আমার কল্পনাশক্তি সীমাবদ্ধ বা আমি কিছু সম্পর্কে অজ্ঞ?

আমি জানি যে আমি একজনের সাথে অন্যের দিক দিয়ে সংজ্ঞা দিতে পারি, তবে এটি আমি জিজ্ঞাসা করছি না। আমি মান বা পরিচয় দ্বারা বস্তুর তুলনা মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করছি না। অথবা একই সাথে দুটি বস্তু সমান এবং সমান হতে পারে কিনা (এটি অবশ্যই কোনও বিকল্প নয়! এই বিষয়গুলি পারস্পরিক একচেটিয়া)। আমি যা সম্পর্কে জিজ্ঞাসা করছি তা হ'ল:

এমন কোনও পরিস্থিতি কি সম্ভব যার মধ্যে দুটি বস্তু সমান হওয়ার বিষয়ে প্রশ্ন জিজ্ঞাসা করা অর্থবোধ করে, কিন্তু সেগুলি সমান না হওয়ার বিষয়ে জিজ্ঞাসা করা কোনও অর্থবোধ করে না? (হয় ব্যবহারকারীর দৃষ্টিকোণ, বা প্রয়োগকারী এর দৃষ্টিকোণ থেকে)

যদি এরকম কোনও সম্ভাবনা না থাকে, তবে কেন পৃথিবীতে সি ++ এই দুটি অপারেটরকে দুটি স্বতন্ত্র ফাংশন হিসাবে সংজ্ঞায়িত করা হচ্ছে?


13
দুটি পয়েন্টার উভয়ই নাল হতে পারে তবে অগত্যা সমান নয়।
আলী ক্যাগলায়ান

2
এটি এখানে অর্থবোধ করে কিনা তা নিশ্চিত নয়, তবে এটি পড়ার ফলে আমাকে 'শর্ট সার্কিট' সমস্যাগুলি সম্পর্কে ভাবতে বাধ্য করা হয়েছিল। উদাহরণস্বরূপ, যে কোনও ব্যক্তির সংজ্ঞা দেওয়া যায় যে 'undefined' != expressionসর্বদা সত্য (বা মিথ্যা, বা অপরিজ্ঞাত), অভিব্যক্তিটির মূল্যায়ন করা যায় কিনা তা নির্বিশেষে। এই ক্ষেত্রে a!=bসংজ্ঞা অনুযায়ী সঠিক ফলাফলের ফিরে আসবে, কিন্তু !(a==b)যদি ব্যর্থ হবে bমূল্যায়ন করা যাবে না। (অথবা মূল্যায়ন bব্যয়বহুল হলে অনেক সময় নিন )।
ডেনিস জাহেরউদ্দিন

2
নাল সম্পর্কে কী! = নাল এবং নাল == নাল? এটি উভয়ই হতে পারে ... সুতরাং যদি a! = B এর অর্থ সর্বদা a == খ হয় না।
জাজো

4
জাভাস্ক্রিপ্ট থেকে একটি উদাহরণ(NaN != NaN) == true
চিলেনিট

উত্তর:


272

আপনি হবে না ভাষা স্বয়ংক্রিয়ভাবে পুনর্লিখন করতে চান a != bযেমন !(a == b)যখন a == bআয় কিছু আর অন্য bool। এবং কয়েকটি কারণ রয়েছে যা আপনি এটি করতে পারেন।

আপনার কাছে এক্সপ্রেশন বিল্ডার অবজেক্ট থাকতে পারে, যেখানে a == bকোনও তুলনা করার উদ্দেশ্যে নয় এবং নয়, তবে কেবল কিছু এক্সপ্রেশন নোড উপস্থাপন করে a == b

আপনার অলস মূল্যায়ন হতে পারে, যেখানে a == bসরাসরি কোনও তুলনা সম্পাদনের উদ্দেশ্যে নয় এবং তা নয়, বরং এর পরিবর্তে কিছুটা প্রত্যাখাত বা স্পষ্টত lazy<bool>রূপান্তরিত হতে পারে boolপরবর্তী সময়ে তুলনাটি সম্পাদন করতে। মূল্যায়নের আগে সম্পূর্ণ এক্সপ্রেশন অপ্টিমাইজেশনের অনুমতি দেওয়ার জন্য এক্সপ্রেশন बिल्डर অবজেক্টগুলির সাথে সম্ভবত মিলিত।

আপনার কিছু কাস্টম optional<T>টেম্পলেট শ্রেণি থাকতে পারে , যেখানে প্রদত্ত variচ্ছিক ভেরিয়েবল tএবং u, আপনি অনুমতি দিতে চান t == u, তবে এটি ফিরিয়ে দিন optional<bool>

এমন আরও অনেক কিছুই আছে যা আমি ভাবিনি। এবং যদিও এই উদাহরণগুলিতে অপারেশন a == bএবং a != bউভয়ই উপলব্ধি করে তবে এখনও a != bএকই জিনিস নয় !(a == b), তাই পৃথক সংজ্ঞা প্রয়োজন।


72
এক্সপ্রেশন বিল্ডিং কখন আপনি এটি চাইবেন এটির একটি দুর্দান্ত ব্যবহারিক উদাহরণ, যা স্বীকৃত দৃশ্যের উপর নির্ভর করে না।
অলিভার চার্লসওয়ার্থ

6
আর একটি ভাল উদাহরণ ভেক্টর লজিকাল অপারেশন হবে। আপনি বরং তথ্য মাধ্যমে এক পাস কম্পিউটিং চাই !=কম্পিউটিং দুই পাস পরিবর্তে ==তারপর !। বিশেষত সেই দিনটিতে যেখানে আপনি লুপগুলি ফিউজ করতে সংকলকটির উপর নির্ভর করতে পারেন না। অথবা আজও আপনি যদি সংকলককে বোঝাতে ব্যর্থ হন তবে আপনার ভেক্টরগুলি ওভারল্যাপ করবেন না।

41
"আপনি বস্তুর রচয়িতা অভিব্যক্তি থাকতে পারে" - ঠিক আছে তাহলে অপারেটর !কিছু অভিব্যক্তি নোড নির্মাণ করতে পারেন এবং যারা এখনও জরিমানা প্রতিস্থাপন করছেন a != bসঙ্গে !(a == b), যতদূর যে যায়। একই জন্য যায় lazy<bool>::operator!, এটি ফিরে আসতে পারে lazy<bool>optional<bool>আরও দৃinc়প্রত্যয়ী, যেহেতু উদাহরণস্বরূপ যুক্তিযুক্ত সত্যতা boost::optionalনির্ভর করে যে কোনও মান বিদ্যমান কিনা তার উপর নির্ভর করে, মানটি নিজেই নয়।
স্টিভ জেসোপ

42
সমস্ত, এবং Nanগুলি - দয়া করে মনে রাখবেন NaNএস;
jsbueno

9
@ জেসবুয়েনো: এটি আরও উল্লেখ করা হয়েছে যে এনএএনগুলি এই বিষয়ে বিশেষ নয়।
অলিভার চার্লসওয়ার্থ

110

যদি এরকম কোনও সম্ভাবনা না থাকে, তবে কেন পৃথিবীতে সি ++ এই দুটি অপারেটরকে দুটি স্বতন্ত্র ফাংশন হিসাবে সংজ্ঞায়িত করা হচ্ছে?

কারণ আপনি এগুলি ওভারলোড করতে পারেন এবং সেগুলি ওভারলোড করে আপনি তাদের তাদের আসলটির থেকে সম্পূর্ণ আলাদা অর্থ দিতে পারেন।

উদাহরণস্বরূপ, অপারেটরটি ধরুন, <<মূলত বিটওয়াইস বাম শিফট অপারেটর, এখন সাধারণত ইনসেশন অপারেটর হিসাবে ওভারলোডেড, এর মতো std::cout << something; মূলটি থেকে সম্পূর্ণ আলাদা অর্থ।

সুতরাং, যদি আপনি গ্রহণ যে অপারেটর অর্থ পরিবর্তন যখন আপনি এটি জমিদার, তারপর অপারেটরের একটি অর্থ দান থেকে ব্যবহারকারী প্রতিরোধ কোনো কারণ নেই ==যে ঠিক নয় অস্বীকৃতি অপারেটর !=, যদিও এই বিভ্রান্তিকর হতে পারে।


18
এটিই একমাত্র উত্তর যা ব্যবহারিক ধারণা তৈরি করে।
সোনিক এটম

2
আমার কাছে মনে হচ্ছে আপনার পিছনের দিকে কারণ এবং প্রভাব রয়েছে। আপনি এগুলি পৃথকভাবে ওভারলোড করতে পারেন কারণ ==এবং পৃথক !=অপারেটর হিসাবে উপস্থিত রয়েছে। অন্যদিকে, এগুলি সম্ভবত স্বতন্ত্র অপারেটর হিসাবে উপস্থিত নেই কারণ আপনি এগুলি পৃথকভাবে ওভারলোড করতে পারেন তবে উত্তরাধিকার এবং সুবিধার কারণে (কোড ব্রেভিটি) কারণে।
nitro2k01

60

আমার উদ্বেগ, যদিও, কেন দুটি পৃথক সংজ্ঞা প্রয়োজন?

আপনি উভয় সংজ্ঞায়িত করতে হবে না।
এগুলি যদি পারস্পরিক একচেটিয়া হয় তবে আপনি এখনও স্ট্যান্ড :: rel_ops সংজ্ঞায়িত ==এবং <পাশাপাশি সংক্ষিপ্ত হতে পারেন

ফম সিপ্রেফারেন্স:

#include <iostream>
#include <utility>

struct Foo {
    int n;
};

bool operator==(const Foo& lhs, const Foo& rhs)
{
    return lhs.n == rhs.n;
}

bool operator<(const Foo& lhs, const Foo& rhs)
{
    return lhs.n < rhs.n;
}

int main()
{
    Foo f1 = {1};
    Foo f2 = {2};
    using namespace std::rel_ops;

    //all work as you would expect
    std::cout << "not equal:     : " << (f1 != f2) << '\n';
    std::cout << "greater:       : " << (f1 > f2) << '\n';
    std::cout << "less equal:    : " << (f1 <= f2) << '\n';
    std::cout << "greater equal: : " << (f1 >= f2) << '\n';
}

এমন কোনও পরিস্থিতি কি সম্ভব যার মধ্যে দুটি বস্তু সমান হওয়ার বিষয়ে প্রশ্ন করা অর্থবোধ করে, কিন্তু সেগুলি সমান না হওয়ার বিষয়ে জিজ্ঞাসা করা কোনও অর্থবোধ করে না?

আমরা প্রায়শই এই অপারেটরদের সাম্যের দিকে যুক্ত করি।
যদিও তারা মৌলিক ধরণের ক্ষেত্রে এ জাতীয় আচরণ করে, কাস্টম ডেটা ধরণের ক্ষেত্রে এটি তাদের আচরণ এমন কোনও বাধ্যবাধকতা নেই। আপনি না চাইলে আপনাকে একটি বিলও ফিরিয়ে দিতে হবে না।

আমি মানুষকে উদ্ভট উপায়ে ওভারলোড অপারেটরগুলি দেখেছি, কেবল এটির জন্য এটি তাদের ডোমেন নির্দিষ্ট অ্যাপ্লিকেশনটির জন্য অর্থবোধ করে। এমনকি যদি ইন্টারফেসটি প্রদর্শিত হয় যে তারা পারস্পরিক একচেটিয়া রয়েছে তবে লেখক নির্দিষ্ট অভ্যন্তরীণ যুক্তি যুক্ত করতে চাইতে পারেন।

(হয় ব্যবহারকারীর দৃষ্টিকোণ, বা প্রয়োগকারী এর দৃষ্টিকোণ থেকে)

আমি জানি আপনি একটি সুনির্দিষ্ট উদাহরণ চান,
সুতরাং ক্যাচ টেস্টিং ফ্রেমওয়ার্ক থেকে একটি এখানে এসেছে যা আমি ভেবেছিলাম ব্যবহারিক ছিল:

template<typename RhsT>
ResultBuilder& operator == ( RhsT const& rhs ) {
    return captureExpression<Internal::IsEqualTo>( rhs );
}

template<typename RhsT>
ResultBuilder& operator != ( RhsT const& rhs ) {
    return captureExpression<Internal::IsNotEqualTo>( rhs );
}

এই অপারেটরগুলি বিভিন্ন কাজ করছে এবং একটি পদ্ধতিটিকে অন্যটির (হিসাবে নয়) হিসাবে সংজ্ঞায়িত করার কোনও অর্থ হবে না। এটি করার কারণটি, যাতে ফ্রেমওয়ার্কটি তৈরি করা তুলনাটি মুদ্রণ করতে পারে। এটি করার জন্য, ওভারলোডেড অপারেটরটি কী ব্যবহৃত হয়েছিল তা প্রসঙ্গে ক্যাপচার করা দরকার।


14
ওহ আমার, কিভাবে আমি জানতে পারি নাstd::rel_ops ? এটি নির্দেশ করার জন্য আপনাকে অনেক ধন্যবাদ।
ড্যানিয়েল জোর

5
সিপ্রেফারেন্স (বা অন্য কোথাও) থেকে কাছাকাছি-ভারব্যাটিম অনুলিপিগুলি স্পষ্টভাবে চিহ্নিত করা উচিত এবং যথাযথভাবে চিহ্নিত করা উচিত। rel_opsযাইহোক ভয়ঙ্কর।
টিসি

@ টিসি রাজি হয়েছি, আমি কেবল বলছি এটি ওপি গ্রহণ করতে পারে এমন একটি পদ্ধতি। আমি কীভাবে rel_ops ব্যাখ্যা করতে উদাহরণের চেয়ে সহজতর ব্যাখ্যা করতে পারি না। এটি যেখানে রয়েছে আমি তার সাথে লিঙ্ক করেছি তবে রেফারেন্স পৃষ্ঠাটি সর্বদা পরিবর্তন হতে পারে বলে কোড পোস্ট করেছে।
ট্রেভর হিকি

4
আপনার এখনও এটি পরিষ্কার করতে হবে যে কোড উদাহরণটি আপনার নিজের চেয়ে সিপ্রেফারেন্স থেকে 99%।
টিসি

2
স্ট্যান্ড :: রিলপসটি অনুকূলে পড়ে গেছে বলে মনে হচ্ছে। আরও লক্ষ্যযুক্ত কিছু করার জন্য বুস্ট অপ্স পরীক্ষা করে দেখুন।
জেডিগোগস

43

সেখানে যা কিছু খুব সুপ্রতিষ্ঠিত নিয়মাবলী হয় (a == b)এবং (a != b)হয় উভয় মিথ্যা অগত্যা বিপরীতের না। বিশেষত, এসকিউএল-তে, NULL এর সাথে যে কোনও তুলনা করলে NULL পাওয়া যায়, সত্য বা মিথ্যা নয়।

যদি সম্ভব হয় তবে এর নতুন উদাহরণগুলি তৈরি করা সম্ভবত কোনও ভাল ধারণা নয়, কারণ এটি এতটা অজ্ঞাতসারে রয়েছে, তবে আপনি যদি কোনও বিদ্যমান কনভেনশনকে মডেল করার চেষ্টা করছেন তবে আপনার অপারেটরদের জন্য "সঠিকভাবে" আচরণ করার অপশনটি পাওয়া ভাল লাগবে প্রসঙ্গ।


4
সি ++ এ এসকিউএল-এর মতো নাল আচরণ বাস্তবায়ন করছেন? Ewwww। তবে আমি মনে করি এটি ভাষায় নিষিদ্ধ করা উচিত বলে আমি মনে করি তবে তা বিরক্তিজনক হতে পারে।

1
@ ড্যান 1111 আরও গুরুত্বপূর্ণ, এসকিউএল এর কিছু স্বাদগুলি সি ++ এ ভালভাবে কোড করা যেতে পারে, তাই ভাষাটি তাদের সিনট্যাক্সকে সমর্থন করতে পারে, না?
জো

1
আমাকে ভুল হলে আমাকে সংশোধন করুন, আমি এখানে কেবল উইকিপিডিয়া বন্ধ করে দিচ্ছি , তবে এসকিউএল রিটার্নে কোনও নুল মানটির সাথে তুলনা করে না অজানা, মিথ্যা নয়? এবং অজানা এর অবহেলা এখনও অজানা? সুতরাং এসকিউএল যুক্তিটি যদি সি ++ এ কোড করা থাকে তবে NULL == somethingআপনি কি NULL != somethingঅজানাতে ফিরে আসতে চান না এবং আপনিও অজানাতে ফিরে আসতে চান , এবং আপনি !Unknownফিরে আসতে চান Unknown? এবং operator!=সেক্ষেত্রে অবহেলা হিসাবে বাস্তবায়ন operator==এখনও সঠিক।
লিন্ডলি

1
@ বার্মার: ঠিক আছে, তবে তারপরে কীভাবে "এসকিউএল ন্যূনস এইভাবে কাজ করে" এই বিবৃতিটি সঠিক করে তোলে ? যদি আমরা আমাদের তুলনামূলক অপারেটর বাস্তবায়নগুলি বুলেটিনগুলি ফেরত দেওয়ার ক্ষেত্রে সীমাবদ্ধ করে থাকি তবে তার মানে কি এই অপারেটরগুলির সাথে এসকিউএল যুক্তি বাস্তবায়ন অসম্ভব?
বেনিয়ামিন লিন্ডলি

2
@ বারমার: আচ্ছা না, এটাই কথা নয়। ওপি ইতিমধ্যে সেই সত্যটি জানে বা এই প্রশ্নটির অস্তিত্ব থাকবে না। বিন্দুটি এমন একটি উদাহরণ উপস্থাপন করা হয়েছিল যেখানে এটি 1) এর মধ্যে একটির বাস্তবায়ন operator==বা operator!=অন্যটি নয়, বা 2) operator!=এর অবজ্ঞা ব্যতীত অন্যভাবে প্রয়োগ করতে পারে operator==। এবং NULL মানগুলির জন্য এসকিউএল যুক্তি প্রয়োগ করা এটির একটি ঘটনা নয়।
লিন্ডলি

23

আমি আপনার প্রশ্নের দ্বিতীয় অংশটির উত্তর দেব, যথা:

যদি এরকম কোনও সম্ভাবনা না থাকে, তবে কেন পৃথিবীতে সি ++ এই দুটি অপারেটরকে দুটি স্বতন্ত্র ফাংশন হিসাবে সংজ্ঞায়িত করা হচ্ছে?

বিকাশকারীকে উভয়কেই ওভারলোডের অনুমতি দেওয়ার কারণটি বোধ করার একটি কারণ হ'ল পারফরম্যান্স। আপনি উভয় প্রয়োগ করে অপ্টিমাইজেশন অনুমতি পারে ==এবং !=। তারপর x != yতুলনায় সস্তা হতে পারে !(x == y)করা হয়। কিছু সংকলক আপনার জন্য এটি অপ্টিমাইজ করতে সক্ষম হতে পারে, তবে সম্ভবত তা নয়, বিশেষত আপনার যদি প্রচুর ব্রাঞ্চিংয়ের সাথে জড়িত জটিল সামগ্রী থাকে।

এমনকি হাস্কেলেও, যেখানে বিকাশকারীরা আইন এবং গাণিতিক ধারণাগুলি খুব গুরুত্ব সহকারে গ্রহণ করেন, একজনকে এখনও উভয়কেই ওভারলোড করার অনুমতি দেওয়া হয় ==এবং /=যেমন আপনি এখানে দেখতে পারেন ( http://hackage.haskell.org/package/base-4.9.0.0/docs/Preule .html # ভি: -61--61- ):

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
λ> :i Eq
class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool
        -- Defined in `GHC.Classes'

এটি সম্ভবত মাইক্রো-অপটিমাইজেশন হিসাবে বিবেচিত হবে, তবে এটি কিছু ক্ষেত্রে প্রয়োজন হতে পারে।


3
এসএসই (x86 সিমডি) র‌্যাপার ক্লাসগুলি এর দুর্দান্ত উদাহরণ। এখানে একটি pcmpeqbনির্দেশনা রয়েছে, তবে কোনও! সুতরাং আপনি যদি ফলাফলগুলি যা ব্যবহার করেন তার যুক্তিটি কেবল বিপরীত করতে না পারলে এটিকে উল্টানোর জন্য আপনাকে অন্য নির্দেশ ব্যবহার করতে হবে। (মজার ঘটনা: এএমডির এক্সওপ ইন্সট্রাকশন-সেটটির জন্য প্যাক-তুলনা neqরয়েছে T খুব খারাপ ইন্টেল এক্সওপি গ্রহণ / প্রসারিত করেনি; শীঘ্রই মৃত আইএসএ এক্সটেনশনে কিছু কার্যকর নির্দেশ রয়েছে))
পিটার কর্ডস

1
প্রথমে সিমডির পুরো পয়েন্টটি হ'ল পারফরম্যান্স এবং আপনি সাধারণত এটি লুপগুলিতে ম্যানুয়ালি ব্যবহার করতে বিরত হন যা সামগ্রিক পারফের জন্য গুরুত্বপূর্ণ। একটি PXORটান লুপে একটি একক নির্দেশনা ( তুলনামূলক মুখোশের ফলাফলটি উল্টানোর জন্য সকলের সাথে) সংরক্ষণ করা গুরুত্বপূর্ণ।
পিটার কর্ডেস

যখন ওভারহেডটি একটি যৌক্তিক অবহেলা হয় তখন কারণ হিসাবে পারফরম্যান্স বিশ্বাসযোগ্য নয় ।
চিয়ার্স এবং এইচটিএইচ - আলফ

এটির চেয়ে বেশি যুক্তিসঙ্গত অবহেলা হতে পারে যদি কম্পিউটিংয়ের x == yতুলনায় আরও উল্লেখযোগ্য পরিমাণ বেশি হয় x != y। শাখার পূর্বাভাস ইত্যাদির কারণে আধুনিক
গণনা

16

এমন কোনও পরিস্থিতি কি সম্ভব যার মধ্যে দুটি বস্তু সমান হওয়ার বিষয়ে প্রশ্ন করা অর্থবোধ করে, কিন্তু সেগুলি সমান না হওয়ার বিষয়ে জিজ্ঞাসা করা কোনও অর্থবোধ করে না? (হয় ব্যবহারকারীর দৃষ্টিকোণ, বা প্রয়োগকারী এর দৃষ্টিকোণ থেকে)

এটি একটি মতামত। হতে পারে না। তবে ভাষা ডিজাইনাররা সর্বজ্ঞ নয়, এমন ব্যক্তিকে সীমাবদ্ধ না রাখার সিদ্ধান্ত নিয়েছিলেন যা এমন পরিস্থিতিতে আসতে পারে যেখানে এটি বোধগম্য হতে পারে (কমপক্ষে তাদের কাছে)।


13

সম্পাদনার প্রতিক্রিয়া হিসাবে;

এটি হ'ল যদি কোনও প্রকারের পক্ষে অপারেটর ==রাখা সম্ভব হয় তবে তার !=বিপরীতে নয়, এবং কখন তা করতে বোধ হয়।

ইন জেনারেল , না, এটা জানার জন্য না। সমতা এবং সম্পর্কিত অপারেটরগুলি সাধারণত সেটে আসে। যদি সাম্যতা থাকে তবে বৈষম্যও বটে; এর চেয়ে কম, তারপরে আরও বড় <=ইত্যাদি ইত্যাদির সাথেও একইরকম পদ্ধতি গাণিতিক অপারেটরগুলিতে প্রয়োগ করা হয়, তারা সাধারণত প্রাকৃতিক লজিক্যাল সেটে আসে।

std::rel_opsনেমস্পেসে এটি প্রমাণিত । আপনি যদি অপারেটরগুলির তুলনায় সাম্যতা এবং তার চেয়ে কম প্রয়োগ করেন তবে সেই নাম স্থানটি ব্যবহার করে আপনাকে অন্যদের দেয়, যা আপনার মূল বাস্তবায়িত অপারেটরগুলির ক্ষেত্রে প্রয়োগ করা হয়।

এগুলি সমস্তই বলেছিল, এমন পরিস্থিতি বা পরিস্থিতি রয়েছে যেখানে একজনের সাথে সাথে অন্যটির অর্থ অবিলম্বে বোঝানো হয় না, বা অন্যের শর্তে কার্যকর করা যায় না? হ্যাঁ আছে , তর্কযোগ্যভাবে খুব কম, কিন্তু তারা সেখানে আছে; আবার, rel_opsএর নিজের একটি নামস্থান হিসাবে প্রমাণিত । সেই কারণেই, এগুলিকে স্বতন্ত্রভাবে প্রয়োগ করার অনুমতি দেওয়ার ফলে আপনি ভাষাটির প্রয়োজনীয় শব্দকোষগুলি এমনভাবে অর্জন করতে পারবেন যা কোডের ব্যবহারকারী বা ক্লায়েন্টের পক্ষে এখনও প্রাকৃতিক এবং স্বজ্ঞাত।

ইতিমধ্যে উল্লিখিত অলস মূল্যায়ন এর একটি দুর্দান্ত উদাহরণ। আর একটি ভাল উদাহরণ তাদের শব্দার্থক প্রদান যা সমতা বা সাম্যের মোটেও বোঝায় না। এর অনুরূপ উদাহরণ হ'ল বিট শিফট অপারেটর <<এবং >>স্ট্রিম সন্নিবেশ এবং নিষ্কাশনের জন্য ব্যবহৃত হচ্ছে। যদিও এটি সাধারণ চেনাশোনাগুলিতে অস্বীকার করা যেতে পারে তবে কিছু ডোমেন নির্দিষ্ট ক্ষেত্রে এটি বোধগম্য হতে পারে।


12

যদি ==এবং !=অপারেটরদের আসলে সমতা, একই ভাবে যে পরোক্ষভাবে না <<এবং >>প্রবাহ অপারেটার বিট-নাড়াচাড়া পরোক্ষভাবে না। যদি আপনি চিহ্নগুলি এমনভাবে ব্যবহার করেন যেন সেগুলির অর্থ অন্য কোনও ধারণা, তবে তাদের পারস্পরিক একচেটিয়া হওয়ার দরকার নেই।

সাম্যতার ক্ষেত্রে, যদি আপনার ব্যবহারের ক্ষেত্রে সতর্কতা অবজেক্টগুলিকে অ তুলনীয় হিসাবে বিবেচনা করে তবে তা প্রতিটি অর্থের তুলনা মিথ্যা (বা একটি তুলনামূলক ফলাফলের ধরণ, যদি আপনার অপারেটররা নন-বোলে ফিরে আসে) ফিরে আসে should আমি এটি নির্দিষ্ট করা হবে এমন নির্দিষ্ট পরিস্থিতির বিষয়ে ভাবতে পারি না, তবে আমি এটি যথেষ্ট যুক্তিযুক্ত দেখতে পেলাম।


7

দুর্দান্ত শক্তির সাথে দুর্দান্তভাবে দায়িত্ব আসে, বা কমপক্ষে সত্যিই ভাল স্টাইলের গাইড রয়েছে।

==এবং !=হ্যাক আপনি যা চান তা করতে ওভারলোড করা যেতে পারে। এটি একটি আশীর্বাদ এবং অভিশাপ উভয়ই। কোন গ্যারান্টি নেই যে !=মানে !(a==b)


6
enum BoolPlus {
    kFalse = 0,
    kTrue = 1,
    kFileNotFound = -1
}

BoolPlus operator==(File& other);
BoolPlus operator!=(File& other);

আমি এই অপারেটরটিকে ওভারলোডিংকে ন্যায়সঙ্গত করতে পারি না, তবে উপরের উদাহরণে operator!=এর "বিপরীত" হিসাবে সংজ্ঞা দেওয়া অসম্ভব operator==



1
@ সোনমান: দাফাং এটিকে একটি ভাল গণনা (যেমন একটি গণনা সংজ্ঞায়িত করার পক্ষে ভাল ধারণা) বলেন না, এটি একটি দৃষ্টান্ত বর্ণনা করার উদাহরণ মাত্র। এই (সম্ভবত খারাপ) অপারেটর সংজ্ঞা দিয়ে, তাহলে !=প্রকৃতপক্ষে এর বিপরীত অর্থ হবে না ==
আলাইনড

1
@ অ্যালেনডি আপনি কি আমার পোস্ট করা লিঙ্কটি ক্লিক করেছেন এবং আপনি কি সেই সাইটের উদ্দেশ্য সম্পর্কে অবগত আছেন? একে বলা হয় "হাস্যরস"।

1
@ স্নোমান: আমি অবশ্যই করি ... দুঃখিত, আমি মিস করেছি এটি একটি লিঙ্ক এবং বিদ্রূপ হিসাবে উদ্দেশ্য! : ও)
আলাইনড

দাঁড়াও, আপনি কি ওভারলোড করছেন অ্যানারি ==?
এলএফ

5

শেষ পর্যন্ত, আপনি those অপারেটরগুলির সাথে যা যাচাই করছেন তা হ'ল অভিব্যক্তি a == bবা a != bকোনও বুলিয়ান মান ( trueবা false) প্রত্যাবর্তন করছে । এই অভিব্যক্তি পারস্পরিক একচেটিয়া হওয়ার চেয়ে তুলনার পরে একটি বুলিয়ান মান দেয়।


4

[..] কেন দুটি পৃথক সংজ্ঞা প্রয়োজন?

একটি বিষয় বিবেচনা করার বিষয় হ'ল এই অপারেটরগুলির মধ্যে একটির অপরটির অবহেলা ব্যবহারের চেয়ে আরও দক্ষতার সাথে বাস্তবায়নের সম্ভাবনা থাকতে পারে।

(এখানে আমার উদাহরণ আবর্জনা ছিল, তবে বিষয়টি এখনও দাঁড়িয়ে আছে, ব্লুম ফিল্টারগুলির কথা চিন্তা করুন, উদাহরণস্বরূপ: তারা যদি কিছু সেট না করে তবে দ্রুত পরীক্ষা করার অনুমতি দেয় , তবে এটি পরীক্ষায় আরও বেশি সময় নিতে পারে))

[..] সংজ্ঞা অনুসারে, a != bহয় !(a == b)

প্রোগ্রামার হিসাবে এটি ধরে রাখা আপনার দায়িত্ব। সম্ভবত একটি পরীক্ষা লিখতে ভাল জিনিস।


4
কিভাবে !((a == rhs.a) && (b == rhs.b))সংক্ষিপ্ত সার্কিটের অনুমতি দেয় না? যদি !(a == rhs.a), তাহলে (b == rhs.b)মূল্যায়ন করা হবে না।
বেনজামিন লিন্ডলি

যদিও এটি একটি খারাপ উদাহরণ। সংক্ষিপ্তসার্কিটিং এখানে কোনও magন্দ্রজালিক সুবিধা যুক্ত করে না।
অলিভার চার্লসওয়ার্থ

@ অলিভার চার্লসওয়ার্থ একা এটি করে না, তবে পৃথক অপারেটরদের সাথে যোগদানের পরে এটি করে: এটি ক্ষেত্রে ==প্রথম সংশ্লিষ্ট উপাদানগুলি অ-সমান হওয়ার সাথে সাথে এটি তুলনা করা বন্ধ করবে। তবে এর ক্ষেত্রে !=, যদি এটি শর্তাবলী কার্যকর করা হয় ==, তবে প্রথমে সমস্ত সম্পর্কিত উপাদানগুলির তুলনা করা দরকার (যখন তারা সকলেই সমান হন) তারা অ-সমকক্ষ নয় তা বলতে সক্ষম হবেন: পি তবে হিসাবে প্রয়োগ করা হলে উপরের উদাহরণ হিসাবে এটি প্রথম অ-সমতুল্য জুটিটি পাওয়া মাত্র এটি তুলনা করা বন্ধ করবে। সত্যিই দুর্দান্ত উদাহরণ।
বারবারাওয়ারকোয়ার্ক

@ বেঞ্জামিনলিন্ডলি সত্য, আমার উদাহরণটি সম্পূর্ণ বোকা ছিল। দুর্ভাগ্যক্রমে, আমি অন্য এটিএম নিয়ে আসতে পারি না, এখানে অনেক দেরি হয়ে গেছে।
ড্যানিয়েল জোর

1
@ বারবারকওয়ার্ক: !((a == b) && (c == d))এবং (a != b) || (c != d)শর্ট সার্কিট দক্ষতার দিক থেকে সমান।
অলিভার চার্লসওয়ার্থ

2

অপারেটরদের আচরণটি কাস্টমাইজ করে আপনি তাদের যা করতে চান তা করতে পারেন।

আপনি জিনিস কাস্টমাইজ করতে ইচ্ছুক হতে পারে। উদাহরণস্বরূপ, আপনি একটি ক্লাস কাস্টমাইজ করতে চাইতে পারেন। এই শ্রেণীর অবজেক্টগুলির সাথে কেবল একটি নির্দিষ্ট সম্পত্তি পরীক্ষা করে তুলনা করা যেতে পারে। এটি কেসটি জেনেও, আপনি কিছু নির্দিষ্ট কোড লিখতে পারেন যা পুরো বস্তুতে প্রতিটি একক সম্পত্তি প্রতিটি বিট পরীক্ষা না করে কেবল সর্বনিম্ন জিনিসগুলি পরীক্ষা করে।

এমন কোনও ক্ষেত্রে কল্পনা করুন যেখানে আপনি বুঝতে পারেন যে কোনও কিছু ঠিক তত দ্রুত, যদি দ্রুত না হয় তবে আপনি খুঁজে পেতে পারেন যে কোনও জিনিস একই রকম। মঞ্জুর, একবার আপনি কিছু একই বা আলাদা কিনা তা বুঝতে পেরে তারপরে আপনি কিছুটা উল্টিয়ে উল্টোটি জানতে পারবেন। তবে, এই বিট উল্টানো একটি অতিরিক্ত অপারেশন। কিছু ক্ষেত্রে, কোডটি যখন প্রচুর পুনরায় কার্যকর হয়, তখন একটি ক্রিয়াকলাপ সংরক্ষণ করে (বহুগুণ দ্বারা গুণিত) সামগ্রিক গতি বৃদ্ধি করতে পারে। (উদাহরণস্বরূপ, আপনি যদি একটি মেগাপিক্সেল স্ক্রিনের পিক্সেল প্রতি এক অপারেশন সংরক্ষণ করেন, তবে আপনি সবেমাত্র এক মিলিয়ন ক্রিয়াকলাপ সংরক্ষণ করেছেন 60 প্রতি সেকেন্ডে 60 স্ক্রিন দ্বারা গুণিত এবং আপনি আরও বেশি ক্রিয়াকলাপ সংরক্ষণ করেন save)

এইচভিডির উত্তরটি কিছু অতিরিক্ত উদাহরণ সরবরাহ করে।


2

হ্যাঁ, কারণ একটির অর্থ "সমতুল্য" এবং অন্যটির অর্থ "অ সমতুল্য" এবং এই পদগুলি পারস্পরিক একচেটিয়া। এই অপারেটরগুলির জন্য অন্য কোনও অর্থ বিভ্রান্তিকর এবং সব উপায়ে এড়ানো উচিত।


তারা সব ক্ষেত্রে পারস্পরিক একচেটিয়া নয় । উদাহরণস্বরূপ, দুটি অসম্পূর্ণতা উভয় একে অপরের সমান নয় এবং একে অপরের সমান নয়।
ভ্লাদন

@vladon এক ব্যবহার পরিবর্তে অন্য ব্যবহার করতে পারেন জেনেরিক ক্ষেত্রে ? না। এর অর্থ তারা ঠিক সমান নয়। বাকিগুলি অপারেটর == /! =
অলিওর

@ ভ্লাদন দয়া করে, জেনেরিক কেসের পরিবর্তে আমার উত্তরে সমস্ত কেস পড়ুন ।
অলিওরা

@ ভ্লাদন গণিতের ক্ষেত্রে যতটা সত্য, আপনি কি উদাহরণ দিতে পারেন যেখানে সিতে এই কারণে a != bসমান নয় !(a == b)?
nitro2k01

2

হয়তো একটি uncomparable নিয়ম, যেখানে a != bছিল মিথ্যা এবং a == bছিল মিথ্যা স্টেট-লেস বিট মত।

if( !(a == b || a != b) ){
    // Stateless
}

আপনি যদি লজিকাল প্রতীকগুলি পুনঃব্যবস্থা করতে চান তবে! ([এ] || [বি]) যৌক্তিকভাবে ([[এ!] এবং [! বি]) হয়ে যায়
থিজার

মনে রাখবেন যে রিটার্নের ধরণ operator==()এবং operator!=()অগত্যা নয় bool, তারা এমন একটি এনাম হতে পারে যা রাজ্যহীন অন্তর্ভুক্ত থাকে তবে আপনি যদি চান যে অপারেটরগুলি এখনও এমনভাবে সংজ্ঞায়িত হতে পারে (a != b) == !(a==b)..
লোরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.