دستور for: این دستوز نیز یک حلقه تکرار است، ولی از تمام دستورهای تکرار کاملتر و انعطاف پذیرتر است، (البته این موضوع به این معنا نیست که پس از یادگیری این دستور فقط از این دستور استفاده کنید!) میتوان در این دستور شمارنده و شرط خروج از حلقه را در یک خط خلاصه کرد و به همین دلیل برنامه بهینهتر میشود، دستور for به این شکل است:
for(مقداردهی شمارنده ;شرط ادامه حلقه ;تغییر شمارنده )
{
}
خب میدونم که چیزی از این دستور متوجه نشدین! (البته خودم هم در ابتدای یادگیری این دستور همین طور بودم! اصلا علت اینکه این دستور رو در یک قسمت کاملا جداگانه توضیح میدم همینه!) خب برای فهم این دستور مثل همیشه در یک برنامه این دستور را توضیح میدهم، این برنامه اعداد 0 تا 10 را در خروجی چاپ میکند:(البته با استفاده از یک حلقه تکرار)
خطهای 8 و 9 شامل دستور for هستند، البته درباره اینکه چرا در این برنامه دستور for شامل کروشه {} نیست، در نکات تکمیلی توضیح میدم (نترسین در نمیرم! حتما توضیح میدم! البته میدونم الان پیش خودتون میگین این چقدر بامزه شده تو این قسمت؛ گفتم خودمو تغییر بدم!) خب بیاییم سراغ برنامه؛ اگر نگاهی به شکل کلی دستور for بیندازید وبا این برنامه مقایسه کنید، تا حدودی مفهوم این دستور را متوجه میشوید، با شکل کلی از سمت چپ پیش میرویم:
مقداردهی شمارنده: هر حلقه تکرار نیاز به یک شمارنده دارد تا با استفاده از آن حلقه تکرار شود، در این دستور ما در بخش اول، شمارنده را معرفی میکنیم، (به همان صورتی که قبلا یک متغیر را معرفی میکردیم، چون شمارنده هم یک متغیر است) که در اینجا نام شمارنده counter و مقدار اولیه آن صفر است. (البته شما میتوانید هر مقداری با توجه به نیاز خودتان به شمارنده بدهید)
شرط ادامه حلقه: همان طور که در دستور تکرار while دیدیم، هر حلقه باید به اتمام برسد، که این کار توسط یک شرط انجام میشد، شرط دستور for نیز همان کار را انجام میدهد، فقط نوع نوشتن آن تفاوت دارد، که در اینجا باید بعد از یک سمیکالن (;) بیاید، که در این برنامه این شرط کوچکتر یا مساوی بودن شمارنده با عدد 10 است، زیرا ما میخواستیم اعداد صفر تا 10 در خروجی چاپ شود.
تغییر شمارنده: این بخش را میتوان مهمترین بخش دستور for دانست، زیرا نوع پیشرفت حلقه و به عبارت دیگر انعطاف پذیری این دستور در گرو این بخش است، در این برنامه بعد از هر بار اجرای دستور به مقدار شمارنده یک واحد اضافه میشود، شما میتوانید هر نوع تغییر دیگری را بر روی شمارنده انجام دهید، مثلا دوتا دوتا مقدار شمارنده را افزایش دهید و یا مقدار اولیه شمارنده را عدد 10 قرار دهید و مقدار آن را یک واحد یک واحد کاهش دهید، پس هر نوع تغییری در این قسمت مجاز است.
حال به توضیح روند اجرای برنامه میپردازم: در ابتدا کامپایلر وارد دستور for میشود (البته با رعایت احتیاط!) سپس شمارنده counter را با مقدار اولیه صفر معرفی میکند، سپس به شرط حلقه میرسد، کنترل میشود که آیا شرط ادامه حلقه درست است یا خیر، که در این برنامه درست است، سپس (بیشترین مشکل اکثر کدنویسان در درک این قسمت است، لطفا توجه کنید!) برنامه وارد حلقه میشود، (نه اینکه برنامه به قسمت تغییر شمارنده برسد، بلکه این قسمت بعد از اولین اجرای حلقه به بعد، اجرا میشود) سپس عدد صفر در خروجی چاپ میشود، سپس کامپایلر دوباره به اجرای بخشهای حلقه میپردازد، (البته دامی دیگر! در این اجرا وجود دارد، لطفا به این قسمت از اجرا هم توجه کنید!) این بار کامپایلر بخش اول حلقه را اجرا نمیکند، یعنی دوباره مقدار شمارنده صفر نمیشود، بلکه بعد از اولین اجرای برنامه به بعد دیگر بخش اول اجرا نمیشود، پس حال که مقدار شمارنده 0 است، دوباره کنترل میشود که آیا شرط ادامه حلقه برای آن برقرار است یا خیر، که برقرار است، سپس کامپایلر وارد بخش سوم میشود و یک واحد به شمارنده اضافه میکند، حال مقدار شمارنده 1 است، و مقدار آن در خروجی چاپ میشود و این روند تا هنگامی که شرط حلقه برقرار باشد ادامه پیدا میکند.
این هم کد یک برنامه بسیار زیبا! که یک جدول ضرب 5 در 5 را در خروجی چاپ میکند:
خب سعی کنید خودتان به تحلیل این برنامه بپردازید و روند اجرای برنامه را دریابید، (البته یک راهنمایی: همیشه داخلی ترین حلقه، کامل اجرا میشود، سپس کامپایلر وارد حلقه بیرونی شده و به اجرای آن میپردازد، سپس دوباره با یک بار اجرا شدن حلقه بیرونی، دوباره کامپایلر وارد حلقه درونی میشود و کاملا آن را اجرا میکند و این روند تکرار میشود. عجب راهنمایی کاملی! خودم تا حالا همچنین راهنمایی کاملی ندیده بودم! اه بازم شروع کردم به تعریف از خودم!)
نکات تکمیلی
- در هر بخش از دستور for میتوانید، برای جدا کردن چند عبارت منطقی، از کاما (,) استفاده کنید، که به آن عملگرهای کاما میگویند که تضمین میکند عبارتهای منطقی از چپ به راست اجرا شوند.
- خطای یک بار کمتر/ بیشتر اجرا: اگر در شرط ادامه حلقه از عملگر مقایسهای نادرست استفاده شود، ممکن است باعث بروز این خطا شود، به عنوان مثال اگر در برنامه اول، شرط حلقه به این صورت نوشته شود: counter<10 باعث میشود، خود عدد 10 در خروجی چاپ نشود (خطای یک بار کمتر اجرا) که برای رفع این خطا، میتوان این دستور را به صورت قبل و یا به این صورت نوشت: counter<11
- هنگامی که یک متغیر را در قسمت شمارنده معرفی و مقداردهی میکنید، فقط این متغیر در بدنه دستور for شناختهشده است، یعنی اگر از این متغیر در خارج بدنه استفاده کنید، باعث به وجود آمدن خطای دستوری میشود.
- توضیح در این باره که چرا در برنامه اول دستور for دارای بدنه نبود (دید گفتم در نمیرم!): در این دستور نیز همانند دستور if (اگر یادتان باشد!) اگر دستور مربوط به حلقه، یک خط باشد، میتوان (نه اینکه باید!) از نوشتن بدنه خوداری کرد.
- تمام دو سمیکالن موجود در دستور for اجباری است و ننوشتن آنها باعث به وجود آمدن خطا دستوری میشود.
- سه بخش دستور for اختیاری هستند، (اما وجود دو سمیکالن جداساز در آن اجباری است.) اگر قسمت شرط ادامه حلقه حذف شود، کامپایلر فرض میکند، این شرط درست است که باعث به وجود آمدن حلقه بی پایان میشود. (برای فهم این نکته، هر بار یکی از بخشها را حذف کنید و بعد برنامه را اجرا کنید، تا نتیجه آن را ببینید)
- قرار دادن سمیکالن بعد از پرانتز دستور for باعث میشود که این دستور نادیده (دستور پوچ تا تهی) گرفته شود و کامپایلر به اجرای کدهای بعد از این دستور میپردازد.