সংক্ষিপ্ত উত্তর
সকল অপারেটরদের +=
, -=
, *=
, /=
, &=
, |=
... গাণিতিক এবং একই প্রত্যাশা প্রদান:
x &= foo() // We expect foo() be called whatever the value of x
যাইহোক, অপারেটরগুলি &&=
এবং ||=
যৌক্তিক হবে এবং এই অপারেটরগুলি ত্রুটি-প্রবণ হতে পারে কারণ অনেক বিকাশকারী foo()
সর্বদা ডাকা হবে বলে আশা করবে x &&= foo()
।
bool x;
// ...
x &&= foo(); // Many developers might be confused
x = x && foo(); // Still confusing but correct
x = x ? foo() : x; // Understandable
x = x ? foo() : false; // Understandable
if (x) x = foo(); // Obvious
শর্টকাট পাওয়ার জন্য আমাদের কি সত্যই সি / সি ++ আরও জটিল করা দরকার x = x && foo()
?
আমরা কি সত্যিই আরও ক্রিপ্টিক স্টেটমেন্টটিকে অস্পষ্ট করতে চাই x = x && foo()
?
বা আমরা কি অর্থপূর্ণ কোডটি লিখতে চাই if (x) x = foo();
?
দীর্ঘ উত্তর
উদাহরণস্বরূপ &&=
যদি &&=
অপারেটর উপলব্ধ ছিল, তবে এই কোড:
bool ok = true; //becomes false when at least a function returns false
ok &&= f1();
ok &&= f2(); //we may expect f2() is called whatever the f1() returned value
সমান:
bool ok = true;
if (ok) ok = f1();
if (ok) ok = f2(); //f2() is called only when f1() returns true
এই প্রথম কোডটি ত্রুটি-প্রবণ কারণ অনেক বিকাশকারীরা মনে করবেন যে f2()
সবসময় প্রত্যাশিত f1()
মানটি বলা হয়। এটি এমন লেখার মতো bool ok = f1() && f2();
যেখানে f2()
কেবল যখন f1()
ফিরে আসে তখন ডাকা হয় true
।
- বিকাশকারী যদি আসলেই ফিরে আসে
f2()
তখন কল করতে চায় , সুতরাং উপরের দ্বিতীয় কোডটি ত্রুটি-প্রবণ কম।f1()
true
- অন্যথায় (বিকাশকারী
f2()
সর্বদা ডাকতে চায় ), &=
যথেষ্ট:
উদাহরণস্বরূপ &=
bool ok = true;
ok &= f1();
ok &= f2(); //f2() always called whatever the f1() returned value
তদুপরি, সংকলকের পক্ষে এই নীচের কোডটির তুলনায় এই উপরের কোডটি অনুকূল করা সহজ:
bool ok = true;
if (!f1()) ok = false;
if (!f2()) ok = false; //f2() always called
তুলনা &&
এবং&
আমরা ভাবতে পারি যে অপারেটররা &&
এবং মূল্যগুলিতে &
প্রয়োগ করার সময় একই ফলাফল দেয় bool
?
আসুন নিম্নলিখিত সি ++ কোড ব্যবহার করে চেক করুন:
#include <iostream>
void test (int testnumber, bool a, bool b)
{
std::cout << testnumber <<") a="<< a <<" and b="<< b <<"\n"
"a && b = "<< (a && b) <<"\n"
"a & b = "<< (a & b) <<"\n"
"======================" "\n";
}
int main ()
{
test (1, true, true);
test (2, true, false);
test (3, false, false);
test (4, false, true);
}
আউটপুট:
1) a=1 and b=1
a && b = 1
a & b = 1
======================
2) a=1 and b=0
a && b = 0
a & b = 0
======================
3) a=0 and b=0
a && b = 0
a & b = 0
======================
4) a=0 and b=1
a && b = 0
a & b = 0
======================
উপসংহার
অতএব হ্যাঁ আমরা প্রতিস্থাপন করতে পারেন &&
দ্বারা &
জন্য bool
মান ;-)
তাই ভাল ব্যবহার &=
পরিবর্তে &&=
।
আমরা &&=
বুলিয়ানদের জন্য অকেজো হিসাবে বিবেচনা করতে পারি ।
একই জন্য ||=
অপারেটরও এর চেয়ে |=
কম ত্রুটি-প্রবণ||=
যদি কোনও বিকাশকারী f2()
কেবল f1()
তার false
পরিবর্তে ফিরে আসে তখন কল করা উচিত :
bool ok = false;
ok ||= f1();
ok ||= f2(); //f2() is called only when f1() returns false
ok ||= f3(); //f3() is called only when f1() or f2() return false
ok ||= f4(); //f4() is called only when ...
আমি নিম্নলিখিত আরও বোধগম্য বিকল্প পরামর্শ:
bool ok = false;
if (!ok) ok = f1();
if (!ok) ok = f2();
if (!ok) ok = f3();
if (!ok) ok = f4();
// no comment required here (code is enough understandable)
অথবা আপনি যদি সমস্ত এক লাইনের শৈলীতে পছন্দ করেন:
// this comment is required to explain to developers that
// f2() is called only when f1() returns false, and so on...
bool ok = f1() || f2() || f3() || f4();