এই প্রশ্নটি বোবা লাগতে পারে তবে বেশিরভাগ প্রোগ্রামিং ভাষাতেই কেন 0
মূল্যায়ন false
এবং অন্য কোনও [পূর্ণসংখ্যা] মান হয় true
?
স্ট্রিং তুলনা
যেহেতু প্রশ্নটি কিছুটা খুব সহজ বলে মনে হচ্ছে, আমি নিজেকে আরও কিছুটা ব্যাখ্যা করব: প্রথমত, এটি কোনও প্রোগ্রামারের কাছে স্পষ্ট মনে হতে পারে তবে কোনও প্রোগ্রামিং ভাষা কেন থাকবে না - সেখানে আসলে থাকতে পারে, তবে কোনওটি নয় আমি ব্যবহৃত - যেখানে 0
মূল্যায়ণ true
এবং সব অন্যান্য [পূর্ণসংখ্যা] এর এমন মানগুলি false
? এই মন্তব্যটি এলোমেলো মনে হতে পারে তবে আমার কয়েকটি উদাহরণ রয়েছে যেখানে এটি ভাল ধারণা হতে পারে। প্রথমত, আসুন স্ট্রিংগুলির ত্রি-দিকী তুলনার উদাহরণটি ধরুন, আমি সি এর strcmp
উদাহরণ হিসাবে গ্রহণ করব : যে কোনও প্রোগ্রামার সি এর প্রথম ভাষা হিসাবে চেষ্টা করছেন নিম্নলিখিত কোডটি লেখার জন্য প্ররোচিত হতে পারে:
if (strcmp(str1, str2)) { // Do something... }
যেহেতু strcmp
রিটার্নগুলি 0
যা false
স্ট্রিংগুলি সমান হয় তার জন্য মূল্যায়ন করে , প্রারম্ভিক প্রোগ্রামার যা চেষ্টা করেছিল তা খারাপভাবে ব্যর্থ হয় এবং কেন প্রথমে সে সাধারণত বুঝতে পারে না। ছিল 0
থেকে মূল্যায়ন true
পরিবর্তে, এই ফাংশন তার সবচেয়ে সহজ অভিব্যক্তি ব্যবহার করা হয়ে থাকতে পারে - উপরে এক - যখন সমতার জন্য তুলনা এবং সঠিক চেক -1
এবং 1
হবে শুধুমাত্র সম্পন্ন হয়েছে যখন প্রয়োজন ছিল। আমরা বেশিরভাগ সময় রিটার্নের ধরণটিকে bool
(আমাদের মনে মনে) বিবেচনা করব।
তাছাড়া, এর একটি নতুন ধরনের পরিচয় করিয়ে যাক, sign
, যে শুধু মান লাগে -1
, 0
এবং 1
। এটি বেশ সহজ হতে পারে। ভাবুন যে সি ++ তে কোনও স্পেসশিপ অপারেটর রয়েছে এবং আমরা এটির জন্য চাই std::string
(ভাল, ইতিমধ্যে compare
ফাংশনটি রয়েছে, তবে স্পেসশিপ অপারেটর আরও মজাদার)। ঘোষণাটি বর্তমানে নিম্নলিখিতটি হবে:
sign operator<=>(const std::string& lhs, const std::string& rhs);
যদি এটির 0
মূল্যায়ন করা হত true
, স্পেসশিপ অপারেটরটিও উপস্থিত না থাকত এবং আমরা operator==
সেভাবে ঘোষণা করতে পারতাম :
sign operator==(const std::string& lhs, const std::string& rhs);
এটি operator==
একবারে ত্রি-উপায়ে তুলনা পরিচালনা করতে পারে এবং প্রয়োজনের সময় কোন স্ট্রিংটি অভিধানের চেয়ে অন্যের চেয়ে উচ্চতর কিনা তা পরীক্ষা করতে সক্ষম হয়েও নিম্নলিখিত চেকটি সম্পাদন করতে ব্যবহৃত হতে পারে:
if (str1 == str2) { // Do something... }
পুরানো ত্রুটিগুলি পরিচালনা করা
আমাদের এখন ব্যতিক্রম রয়েছে, সুতরাং এই অংশটি কেবলমাত্র সেই পুরানো ভাষাগুলিতেই প্রযোজ্য যেখানে এই জাতীয় কোনও অস্তিত্ব নেই (উদাহরণস্বরূপ সি)। যদি আমরা সি এর স্ট্যান্ডার্ড লাইব্রেরিটি (এবং একটি পসিক্সও দেখেছি) দেখি তবে আমরা নিশ্চিতভাবে দেখতে পারি যে মায়ানায় ফাংশনগুলি 0
সফল এবং অন্য কোনও পূর্ণসংখ্যার পরে ফিরে আসে। আমি দুঃখের সাথে কিছু লোককে এই জাতীয় কাজ করতে দেখেছি:
#define TRUE 0
// ...
if (some_function() == TRUE)
{
// Here, TRUE would mean success...
// Do something
}
প্রোগ্রামিংয়ে আমরা কীভাবে চিন্তা করি সে সম্পর্কে যদি আমরা চিন্তা করি তবে আমাদের প্রায়শই নিম্নলিখিত যুক্তিযুক্ত ধরণ থাকে:
Do something
Did it work?
Yes ->
That's ok, one case to handle
No ->
Why? Many cases to handle
যদি আমরা এটা সম্পর্কে আবার মনে হয়, এটি শুধুমাত্র নিরপেক্ষ মান, লাগাতে ইন্দ্রিয় দিতেন 0
, এর yes
(এবং যে কিভাবে সি এর ফাংশন কাজ আছে), যখন সব অন্যান্য মান থাকতে পারে অনেক ক্ষেত্রে সমাধান করতে no
। তবে, আমি জানি সমস্ত প্রোগ্রামিং ভাষায় (সম্ভবত কিছু পরীক্ষামূলক এ্যাসোথেরিক ভাষাগুলি বাদে) কোনও অবস্থাতেই yes
মূল্যায়ন করে , যখন সমস্ত ক্ষেত্রে মূল্যায়ন হয় । অনেকগুলি পরিস্থিতি যখন "এটি কাজ করে" একটি ক্ষেত্রে উপস্থাপন করে যখন "এটি কাজ করে না" অনেকগুলি সম্ভাব্য কারণকে উপস্থাপন করে। আমরা যদি সেভাবে এটির বিষয়ে চিন্তা করি তবে মূল্যায়ন করা এবং বাকিগুলি আরও অনেক বেশি অর্থবোধ করে।false
if
no
true
0
true
false
উপসংহার
কেন আমরা ভাষায় ডিজাইন কোথায়: আমার উপসংহার মূলত আমার মূল প্রশ্ন হল 0
হল false
এবং অন্যান্য মান true
, আমার কয়েকটি উদাহরণ উপরে এবং হয়ত আরো কিছু আমি মনে করি না অ্যাকাউন্ট নিচ্ছে?
ফলোআপ: অনেক ধারণা সহ অনেক উত্তর রয়েছে এবং এটির মতো হওয়ার সম্ভাব্য অনেকগুলি কারণ রয়েছে তা দেখে ভাল লাগছে। আপনি এটি সম্পর্কে মনে হয় কতটা উত্সাহী আমি ভালবাসি। আমি উদাসীনতার কারণে এই প্রশ্নটি জিজ্ঞাসা করেছি, তবে আপনি যেহেতু অনুরাগী বলে মনে হচ্ছে, তাই আমি সিদ্ধান্ত নিয়েছিলাম আরও কিছুটা এগিয়ে গিয়ে ম্যাথ.এসইতে 0 এবং 1 এর জন্য বুলিয়ান পছন্দের পিছনে যুক্তি জিজ্ঞাসা করার :)
if true ; then ... ; fi
, যেখানে true
একটি কমান্ড যে শূন্য ফেরৎ এবং এই বলে if
চালানোর জন্য ...
।
bool
টাইপ কিন্তু তুলনা / কোন ফেরত মান অবস্থার ইত্যাদি থাকতে পারে পারেন।
strcmp()
সত্য বা মিথ্যা জন্য এটি কোনও ভাল উদাহরণ নয়, কারণ এটি 3 টি বিভিন্ন মান দেয়। এবং আপনি যখন শেল ব্যবহার শুরু করেন, তখন আপনি অবাক হবেন, যেখানে 0 এর অর্থ সত্য এবং অন্য কোনও কিছুর অর্থ মিথ্যা।