Lesson পড়তে ৭ মিনিট লাগবে

কন্ডিশনাল বা শর্তসমূহ (Conditionals)

সি-এর (C) মতো একই ট্রাফিক লাইটসমূহ (traffic lights), তবে সি++ (C++) জীবনযাত্রার মান উন্নয়নের জন্য এতে বেশ কিছু নতুন আপগ্রেড (quality-of-life upgrades) যোগ করেছে

আপনার আগে থেকেই চেনা সেই সমস্ত ট্রাফিক লাইটগুলো (Traffic Lights)

সি++ (C++)-এ কন্ডিশনালগুলো (Conditionals) ঠিক ট্রাফিক লাইটগুলোরই (traffic lights) মতো কাজ করে — এগুলো মূলত কোডটি কীভাবে রান (execution) হবে, তা নিয়ন্ত্রণ করে। সবুজের (Green) অর্থ হলো যাও (go), লালের (red) অর্থ হলো থামো (stop), হলুদের (yellow) অর্থ হলো... এটি আসলে পরিস্থিতির ওপর নির্ভর করে (depends)। যদি আপনি সি-এর (C) কন্ডিশনালগুলোর কথা আগে থেকেই জেনে থাকেন, তবে ধরে নিন আপনি এখানকার কোডগুলোরও ৯০% (90%) ইতোমধ্যেই জানেন। সি++ মূলত এর if, else, switch, এবং টার্নারি অপারেটরটিকে (ternary operator) একেবারে হুবহু সি-এর মতোই (exactly as they are) রেখেছে।

তবে সি++ (C++) শুধু এই উত্তরাধিকারসূত্রে পাওয়া (inheriting) বৈশিষ্ট্যগুলোতেই সীমাবদ্ধ থাকেনি। এটি এর সাথে সি++১৭-এর (C++17) ইফ-উইথ-ইনিশিয়ালাইজার (if-with-initializer)-টিকেও যুক্ত করেছে — যা ছোট হলেও অনেক শক্তিশালী একটি আপগ্রেড (upgrade), যা আপনার কোডকে আরও বেশি ক্লিনার বা পরিপাটি (cleaner) রাখতে সাহায্য করে। চলুন, এই সবকিছু নিয়ে বিস্তারিতভাবে জেনে নেওয়া যাক।

ক্লাসিক if / else — হুবহু সি-এর (C) মতোই

#include <iostream>
using namespace std;
int main() {
int temperature = 35;
if (temperature >= 30) {
cout << "It's hot! Stay hydrated." << endl;
} else if (temperature >= 20) {
cout << "Nice weather for a walk." << endl;
} else if (temperature >= 10) {
cout << "Grab a jacket." << endl;
} else {
cout << "Bundle up, it's freezing!" << endl;
}
// সি++ বোনাস (C++ bonus): এখানকার বুলিয়ান (bool) তুলনাগুলো (comparisons) অনেক বেশি পরিপাটি বা ক্লিনার (cleaner) হয়
bool isRaining = true;
if (isRaining) { // এখানে কোনো == true-এর দরকার নেই (no need)
cout << "Bring an umbrella!" << endl;
}
return 0;
}
Output
It's hot! Stay hydrated.
Bring an umbrella!

সুইচ স্টেটমেন্টটি (The switch Statement)

সুইচ (Switch) হলো অনেকটাই ভেন্ডিং মেশিনের (vending machine) মতো — যেখানে আপনি কোনো মান বা ভ্যালু দিলেন (insert), আর এটি সরাসরি তার সাথে ম্যাচ করা (matching) নির্দিষ্ট কেসটিতে (case) চলে গেল। যখন আপনি একটি একক ভ্যারিয়েবলের (single variable) সাথে আলাদা আলাদা অনেকগুলো মানের (discrete values) তুলনা (comparing) করেন, তখন এটি মূলত লম্বা অনেকগুলো ইফ-এলসের চেইনের (if-else chain) তুলনায় অনেক দ্রুত (faster) এবং পরিপাটি বা ক্লিনার (cleaner) উপায় হিসেবে কাজ করে।

এর সাধারণ নিয়মগুলো (rules) মূলত সি-এর (C) মতোই: কখনোই এর break-কে ভুলে যাবেন না (don't forget), এবং এর সাথে সর্বদা একটি default কেস (case) যুক্ত করুন।

সুইচ স্টেটমেন্ট বা switch Statement

#include <iostream>
using namespace std;
int main() {
int day = 3;
switch (day) {
case 1:
cout << "Monday" << endl;
break;
case 2:
cout << "Tuesday" << endl;
break;
case 3:
cout << "Wednesday" << endl;
break;
case 4:
cout << "Thursday" << endl;
break;
case 5:
cout << "Friday!" << endl;
break;
default:
cout << "Weekend!" << endl;
break;
}
// char-এর সাথে এখানকার এই switch-টিও একইভাবে কাজ (works) করে
char grade = 'B';
switch (grade) {
case 'A': cout << "Excellent!" << endl; break;
case 'B': cout << "Good job!" << endl; break;
case 'C': cout << "Passing." << endl; break;
default: cout << "Keep trying." << endl; break;
}
return 0;
}
Output
Wednesday
Good job!
Note: সি++ switch মূলত এখনো শুধুমাত্র ইনটিগ্রাল টাইপগুলোর (integral types) — যেমন int, char, enum এবং এই সমজাতীয় জিনিসগুলোর সাথেই কাজ করে। আপনি কখনোই স্ট্রিংয়ের (strings) ক্ষেত্রে সুইচ (switch) ব্যবহার করতে পারবেন না! স্ট্রিং ম্যাচিংয়ের (string matching) জন্য হয় ইফ-এলস চেইন (if-else chains) ব্যবহার করুন অথবা একটি std::map ব্যবহার করুন যা বিভিন্ন স্ট্রিংকে তার নির্দিষ্ট কাজের (actions) সাথে ম্যাপ (maps) করে দেয়।

ম্যাপের সাহায্যে স্ট্রিং ম্যাচিং (String Matching with map) — সুইচের বিকল্প (The switch Alternative)

যেহেতু সুইচ (switch) কখনোই স্ট্রিংয়ের (strings) সাথে কাজ করে না, তাই এক্ষেত্রে এর বাজে ও লম্বা ইফ-এলস চেইনগুলোকে (if-else chains) এড়িয়ে যাওয়ার জন্য std::map-এর সাহায্যে নিচে একটি খুব সুন্দর ও ক্লিন প্যাটার্ন (clean pattern) তৈরি করে দেওয়া হলো:

ম্যাপ (Map) ব্যবহার করে একটি স্ট্রিং "সুইচ (switch)"

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> commandMap = {
{"start", 1},
{"stop", 2},
{"pause", 3}
};
string input = "stop";
auto it = commandMap.find(input);
if (it != commandMap.end()) {
switch (it->second) {
case 1: cout << "Starting..." << endl; break;
case 2: cout << "Stopping..." << endl; break;
case 3: cout << "Pausing..." << endl; break;
}
} else {
cout << "Unknown command: " << input << endl;
}
return 0;
}
Output
Stopping...

টার্নারি অপারেটর (The Ternary Operator) — এক-লাইনের সিদ্ধান্ত (One-Line Decisions)

টার্নারি অপারেটর (ternary operator) condition ? a : b হলো খুব সাধারণ বা সিম্পল কিছু পছন্দের (simple choices) জন্য তৈরি করা একটি সংক্ষিপ্ত বা কম্প্যাক্ট (compact) ইফ-এলস (if-else)। এটি মূলত সরাসরি মান অ্যাসাইন (assignments) করার জন্য কিংবা খুব ছোট ইনলাইন এক্সপ্রেশনের (inline expressions) জন্য অত্যন্ত দুর্দান্ত (perfect) — কিন্তু এদেরকে কখনোই একসাথে নেস্ট (nest) বা যুক্ত করতে যাবেন না, অন্যথায় আপনার কোডটি এমন এক ধরনের পাজল বা ধাঁধায় (puzzle) পরিণত হতে পারে, যা আর কখনোই পড়া যাবে না (unreadable)।

টার্নারি অপারেটর বা Ternary Operator

#include <iostream>
#include <string>
using namespace std;
int main() {
int score = 85;
// সাধারণ টার্নারি (Simple ternary) — যেকোনো এক-লাইনের অ্যাসাইনমেন্টের (one-line assignments) জন্য দুর্দান্ত বা গ্রেট (great)
string result = (score >= 60) ? "Pass" : "Fail";
cout << "Result: " << result << endl;
// আউটপুটের (output) ক্ষেত্রে ইনলাইন বা Inline
int items = 1;
cout << "You have " << items << " item" << (items == 1 ? "" : "s") << endl;
items = 5;
cout << "You have " << items << " item" << (items == 1 ? "" : "s") << endl;
// যেকোনো দুটি নাম্বারের (two numbers) মধ্যে ম্যাক্স বা সর্বোচ্চটিকে (max) খুঁজে বের করা
int a = 42, b = 17;
int maxVal = (a > b) ? a : b;
cout << "Max: " << maxVal << endl;
return 0;
}
Output
Result: Pass
You have 1 item
You have 5 items
Max: 42

সি++১৭ (C++17): ইনিশিয়ালাইজারের সাহায্যে if (if with Initializer)

এটি মূলত জীবনযাত্রার মান উন্নয়নের জন্য (quality-of-life upgrade) সি++ (C++) ডেভেলপারদের (devs) মুখে হাসি ফোটানোর জন্য তৈরি করা হয়েছে। সি++১৭-এর (C++17) আগে, আপনার যদি কোনো ফাংশন (function) থেকে কোনো ভ্যালু চেক বা যাচাই (check) করার প্রয়োজন পড়ত, তবে আপনাকে এর জন্য এমন একটি ভ্যারিয়েবল (variable) তৈরি করতে হতো যা কিনা এর চারপাশের স্কোপগুলোতেও (scope) ছড়িয়ে (leaks) পড়ত। কিন্তু এখন আপনি চাইলেই একটি মাত্র স্টেটমেন্টেই সেটিকে ডিক্লেয়ার বা ঘোষণা করতে এবং টেস্ট (declare and test) করে নিতে পারেন, এবং এখানকার ওই ভ্যারিয়েবলটি শুধুমাত্র ওই ইফ ব্লকের (if block) ভেতরেই সীমাবদ্ধ বা সীমিত (confined) থাকে।

এটিকে আপনি মূলত হাতের এক জোড়া গ্লাভস (gloves) পরা, সেটি দিয়ে কাজ করা (doing a job), এবং কাজ শেষে স্বয়ংক্রিয়ভাবে গ্লাভসটিকে খুলে (automatically taking them off) নেওয়ার মতো একটি জিনিস হিসেবে ভাবতে পারেন — যেখানে কোনো প্রকার জঞ্জাল বা নোংরা (no mess) অবশিষ্ট পড়ে থাকে সাসপেন্স।

সি++১৭ (C++17) ইনিশিয়ালাইজারের (Initializer) সাথে if

#include <iostream>
#include <string>
#include <map>
using namespace std;
int getValue() { return 42; }
int main() {
// C++17 এর আগে — ভ্যারিয়েবলটি (variable) বাইরের স্কোপেও লিক হয়ে যায় (leaks into outer scope)
{
int val = getValue();
if (val > 0) {
cout << "Old style: val = " << val << endl;
}
// val এখনও এখানে বেঁচে আছে... এবং স্কোপটিকে বা scope-টিকে দূষিত (polluting) করছে
}
// C++17 — ভ্যারিয়েবলটি শুধুমাত্র if ব্লকের (if block) মধ্যেই স্কোপ বা scoped করা থাকে
if (auto val = getValue(); val > 0) {
cout << "C++17 style: val = " << val << endl;
}
// val-এর আর এখানে কোনো অস্তিত্ব (exist) নেই — এটি এখন সম্পূর্ণ ক্লিন (clean)!
// বাস্তব জগতের বা রিয়েল-ওয়ার্ল্ড (Real-world) উদাহরণ: ম্যাপ লুকআপ (map lookup)
map<string, int> scores = {{"Alice", 95}, {"Bob", 87}};
if (auto it = scores.find("Alice"); it != scores.end()) {
cout << it->first << " scored " << it->second << endl;
} else {
cout << "Not found" << endl;
}
// 'it' এখান থেকে চলে (gone) গেছে — আর কোনো লিকিং ইটারেটরগুলো (leaking iterators) নেই
return 0;
}
Output
Old style: val = 42
C++17 style: val = 42
Alice scored 95
চ্যালেঞ্জ

ছোট কুইজ

আপনি কি সি++ (C++)-এর কোনো switch স্টেটমেন্টে (statement) একটি std::string ব্যবহার করতে পারবেন?
Input & OutputLoops