while(expression)
{
//loop body
}
while লুপের স্ট্রাকচার উপরের মত। এখানে while লুপের পরে ব্রেকেটের মাঝে সাধারণত আমরা রিলেশনাল অপারেটর (<, >, ==, !=, <=, >=) সহ বিভিন্ন expression দেখে অভ্যস্ত যেমন,
i = 1;
while(i < 10)
{
printf("%d " i);
i++;
}
উপরের কোডটি ১ - ৯ প্রিন্ট করবে। কারণ শুরুতে i = 1 এবং while এর কন্ডিশন টেস্ট (expression) i < 10 সত্যি। তাই লুপ বডি কাজ করবে। লুপ বডিতে i এর মান প্রিন্ট করে এর মান এক বাড়িয়ে দিবে। যখন i এর মান ১০ তখন expression i < 10 মিথ্যা হয়ে যাওয়ায় লুপ বডি আর কাজ করবে না।
কিন্তু while এর মধ্যে আমরা যেন কোন expression দিতে পারি। যেমন while(a = b), while(scanf("%d", &n) == ), while(a + b) ইত্যাদি। এখানে যদি expression এর ভ্যালু যদি non zero হয় তাহলে এটাকে কম্পাইলার এটাকে সত্যি হিসাবে বিবেচনা করবে আর যদি zero হয় তাহলে সেটা মিথ্যা হিসাবে বিবেচিত হবে। while(10) যদি থাকে তাহলে এটা সব সময় কাজ করবে। কারণ ১০ নন জিরো। আবার while(0) কখনই কাজ করবে না।
আপনার প্রোগ্রামে প্রথমে scanf("%d", &n); লাইনের মাধ্যমে n এর মান টার্মিনাল থেকে নেওয়া হয়েছে। ধরি n এর মান ৩। এখন আপনার while statement দেখা যাক।
while(n--) এখানে n এর মান ৩ হলে আমরা পাচ্ছি while(3--) যার মান non zero তাই লুপ বডি কাজ করবে।
এবার দেখা যাক n-- এবং n = n-1 ব্যবহারের মাঝে সমস্যা কোথায়।
n-- এর মানে হচ্ছে n = n-1 অর্থাৎ n এর সাথে ১ বিয়োগ দিয়ে বিয়োগফল n এ রাখা। অর্থাৎ n এর মান ৩ হলে n-- এর পর n এর মান হবে ২। সে হিসাবে while এর মাঝে n-- এবং n = n-1 এর মাঝে সমস্যা থাকার কথা না। কিন্তু হচ্ছে।
কারণ n-- এর ভ্যালু কোথাও এসাইন করা হলে প্রথমে n এর পুরাতন মান এসাইন করা হয় এবং তারপর n এর মান ১ কমানো হয়। নীচের উদাহরণ দেখুন
int a, b =10;
a = b--;
এখানে a = 10 এবং b = 9 হবে। অর্থাৎ b এর মান (১০) এটা প্রথমে a কে দিয়েছে ফলে a এর মান ১০ এবং তারপর b-- কাজ করেছে ফলে b এর মান কমে ৯ হয়েছে।
এখন আপনার while লুপ n এর মান ৩ হলে অবস্থা দাঁড়াচ্ছে-
while(n--) => while(3--) এখানে প্রথমে while(n) এটা সত্য কিনা (নন জিরো হলেই সত্য) তা টেস্ট করবে তারাপর n-- এর কাজ হবে অর্থাৎ n এর মান এক কমিয়ে দিবে।
আপনার while লুপ এ n এর মান ৩ দিলে লুপ ৩ বার চলবে।
n = 3; while(3--) => while(3) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 2 হবে।
n = 2; while(2--) => while(2) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 1 হবে।
n = 1; while(1--) => while(1) টেস্ট করবে, তারপর n-- এর কাজ হবে অর্থাৎ n = 0 হবে।
n = 0; while(0--) => while(0) টেস্ট করবে এবং 0 হওয়ায় লুপ বডি কাজ করবে না।
এখন যদি while(n = n-1) ব্যবহার করেন তাহলে কি হবে দেখা যাক।
n = 3; while(n = n-1) => while(n = 3-1) => while(n=2) => while(2) এবং n = 2 হবে।
n = 2; while(n = n-1) => while(n = 2-1) => while(n=1) => while(1) এবং n = 1 হবে।
n = 1; while(n = n-1) => while(n = 1-1) => while(n=0) => while(0) এবং n = 0 হবে। লুপ থেকে বের হয়ে আসবে।
তাহলে দেখা যাচ্ছে এখানে লুপ চলবে দুইবার।
আশা করছি কিছুটা বুঝাতে পরেছি। না হলে প্রশ্ন করেন; ফোরামে অনেক এক্সপার্ট আছেন তারা আরও ভাল ভাবে সাহায্য করতে পারবেন।
"সংকোচেরও বিহ্বলতা নিজেরই অপমান। সংকটেরও কল্পনাতে হয়ও না ম্রিয়মাণ।
মুক্ত কর ভয়। আপন মাঝে শক্তি ধর, নিজেরে কর জয়॥"