در اين قسمت به معرفي ساختار
if
در
C++
ميپردازيم كه بر مبناي برقرار بودن يا نبودن برخي از شرطها اقدام به تصميمگيري ميكند. عبارت موجود در يك ساختار
if
، شرط ناميده ميشود. اگر شرط مورد قبول واقع شود (شرط
true
باشد) عباراتي كه در داخل بدنه ساختار
if
قرار گرفتهاند اجرا ميشوند و اگر شرط مورد قبول واقع نشود عبار
ا
ت داخل بدنه اجرا نخواهند شد.
براي آشنائي شما با چنين ساختاري به بررسي يك مثال خواهيم پرداخت.
شرطهاي كه در ساختار
if
بكار ميروند ميتوانند از عملگرهاي مقايسهاي و رابطهاي كه در جدول شكل
12-2
آورده شدهاند، استفاده كنند.
تمام عملگرهاي رابطهاي داراي اولويت يكسان بوده و از سمت چپ به راست ارزيابي ميشوند. عملگرهاي مقايسهاي به نسبت عملگرهاي رابطهاي از اولويت پايينتري برخوردار هستند و آنها هم از سمت چپ به راست ارزيابي ميشوند.
شكل 11-2 | ترتيب اجراي عملگرهاي محاسباتي در يك چند جملهاي درجه دوم.
شكل 12-2 | عملگرهاي مقايسهاي و رابطهاي.
خطاي برنامهنويسي
در صورتيكه مابين هر كداميك از عملگرهاي
==
،
!=
،
>=
و
<=
فاصله قرار دهيد با خطاي نحوي مواجه خواهيد شد.
خطاي برنامهنويسي
معكوس نوشتن عملگرهاي
!=
،
>=
و
<=
بصورت
=!
،
=>
و
<
=
خطاي نحوي بدنبال خواهد داشت
. در برخي از موارد نوشتن عملگر
!=
بصورت
=!
خطاي نحوي تلقي نميشود اما بصورت يك خطاي منطقي و در زمان اجراي برنامه تاثير خود را نشان ميدهد.
خطاي برنامهنويسي
اشتباه گرفتن رفتار عملگر رابطهاي
==
با عملگر تخصيص
=
ميتواند خطاي منطقي بدنبال داشته باشد.
برنامه زير از
شش عبارت
if
براي مقايسه بين دو عدد ورودي از سوي كاربر استفاده ميكند. اگر شرط موجود در هر كداميك از عبارات
if
برقرار
باشد
(
true
)، خروجي مرتبط با آن عبارت به اجرا درخواهد آمد.
برنامه شكل 13-2 نشاندهنده برنامه و كادرهاي ورودي و خروجي از اجراي نمونه برنامه است
.
شكل 13-2 | عملگرهاي رابطهاي و مقايسهاي.
در خطوط
6-8
از عبارات
using
استفاده شده است كه نياز به تكرار پيشوند
std::
را برطرف ميكند. پس از بكارگيري عبارات
using
، ميتوانيم
cout
را بجاي
std::cout
،
cin
را بجاي
std::cin
و
endl
را بجاي
std::endl
در مابقي برنامه بنويسيم.
]
توجه: از اين نقطه به بعد در كتاب، در هر مثال از يك يا چند عبارت
using
استفاده شده است.
[
برنامهنويسي ايدهال
ترجيحاٌ بلافاصله پس از
#include
از عبارت
using
استفاده كنيد.
در خطوط
13-14
متغيرهاي مورد نياز برنامه اعلان شدهاند. بخاطر داريد كه متغيرها ميتوانند در يك خط يا چند خط اعلان شوند.
برنامه در خط
17
از روش آبشاري براي دريافت داده به منظور دريافت دو عدد صحيح استفاده كرده است. بخاطر داريد كه امكان نوشتن
cin
را به توجه به خط
7
فراهم آوردهايم (بجاي
std::cin
). اولين مقدار قرائت شده و در متغير
number1
قرار داده ميشود و سپس مقدار دوم قرائت شده و در متغير
number2
ذخيره ميگردد.
ساختار
if
در خطوط
19-20
مبادرت به مقايسه متغيرهاي
number1
و
number2
براي تست برابر بودن ميكند. اگر مقادير برابر باشند، عبارت موجود در خط
20
جمله مبني بر اينكه اعداد با هم برابر هستند به نمايش در ميآورد. اگر شرطي در يك يا چند ساختار
if
كه در خطوط
23, 26, 29,32
و
36
قرار دارند برقرار شود، عبارت متناظر توسط
cout
در خروجي به نمايش در ميآيد.
دقت كنيد كه هر ساختار
if
در برنامه شكل 13-2 داراي يك عبارت در بدنه خود بوده و بدنه تمام ساختارها بفرم دندانهدار نوشته شدهاند. با دندانهدار نوشتن ساختار هر
if
وضوح و خوانائي برنامه را افزايش دادهايم. در فصل چهارم نشان خواهيم داد كه چگونه ميتوان در ساختارهاي
if
از چند عبارت استفاده كرد ( به كمك جفت كاراكتر
{ }
).
برنامهنويسي ايدهال
دندانهدار نوشتن عبارت يا عبارات موجود در درون ساختار
if
سبب ميشود تا بدنه ساختار بخوبي آشكار شده و بدنبال آن خوانائي برنامه افزايش يابد.
برنامهنويسي ايدهال
نبايستي بيش از يك عبارت در هر خط برنامه قرار دهيد.
خطاي برنامهنويسي
قرار دادن سيمكولن بلافاصله پس از شرط يك عبارت (پس از پرانتزها) ساختار
if
، خطاي منطقي بدنبال خواهد داشت (اگرچه خطاي نحوي به حساب نميآيد). سيمكولن سبب ميشود، تا بدنه ساختار
if
خالي بنظر برسد، از اينرو ساختار
if
هيچ عملي انجام نميدهد، صرفنظر از اينكه شرط برقرار باشد يا نباشد. علاوه بر اين، بدنه اصلي ساختار
if
بصورت يك عبارت مجزا از
if
عمل ميكند و هميشه اجرا شده و در اكثر مواقع نتايج اشتباه توليد مينمايد.
به نحوه استفاده از فاصلهها در برنامه شكل 13-2 دقت كنيد. در عبارات
C++
، كاراكترهاي
white-space
همانند تبها، خطوط جديد توسط كامپايلر در نظر گرفته نميشوند. (اگر در درون رشته بكار گرفته شوند در نظر گرفته خواهند شد.) از اينرو، امكان دارد عبارات بر روي چند خط تقسيم شده و برطبق نظر برنامهنويس از هم فاصله پيدا كنند. جدا كردن هويتها يا مشخصهها، رشتهها (همانند
“hello”
) و ثابتها (همانند عدد
1000
) بر روي چند خط خطاي نحوي خواهد بود.
خطاي برنامهنويسي
جدا كردن يك مشخصه از هم بوسيله كاراكترهاي
white-space
خطاي نحوي بدنبال خواهد داشت ( براي مثال نوشتن
main
بصورت
ma in
).
برنامهنويسي ايدهال
ميتوانيد يك عبارت طولاني را بر روي چند خط قرار دهيد. اگر ميبايست يك عبارت به چند خط تقسيم شود، نقطه تقسيم را از مكاني همانند ويرگول در ليست ويرگولها، يا پس از يك عملگر در عبارات طولاني قرار دهيد.
در جدول شكل 14-2 تقدم عملگرهاي معرفي شده در اين فصل بطور يكجا آورده شدهاند. اولويت عملگرها از بالا به پايين كاهش مييابد. دقت كنيد كه تمام اين عملگرها بجر از عملگر تخصيص
=
، از سمت چپ به راست ارزيابي ميشوند.
شكل 14-2 تقدم عملگرهاي معرفي شده تا بدين مرحله.
برنامهنويسي ايدهال
اگر عبارتي مينويسيد كه از عملگرهاي متعددي تشكيل شده، بهتر است به جدول تقدم عملگرها مراجعه كنيد. اگر از ترتيب عملگرها در عبارتي پيچيده مطمئن نيستيد، از پرانتزها استفاده كرده و ترتيب اجرا را در دست گيريد.