دستور if-else برای بیان تصمیمگیریها به کار میرود. از نظر نحوی، شکل کلی آن اینطور است:
if (expression)
statement1
else
statement2
بخش else اختیاری است.
ابتدا عبارت (expression) ارزیابی میشود؛ اگر مقدارش غیر صفر (true) باشد، دستور اول اجرا میشود.
اگر مقدارش صفر (false) باشد و else وجود داشته باشد، دستور دوم اجرا میشود.
از آنجا که if مقدار عددی یک عبارت را بررسی میکند، میتوان میانبرهایی زد. مثلاً بهجای نوشتن:
if (expression != 0)
میتوان فقط نوشت:
if (expression)
در بعضی مواقع این روش طبیعی و واضح است، اما گاهی هم ممکن است رمزآلود به نظر برسد.
از آنجا که بخش else اختیاری است، وقتی ifها به صورت تو در تو (nested) نوشته شوند، ممکن است ابهام ایجاد شود.
C همیشه else را به نزدیکترین if بدون else موجود متصل میکند. مثلاً:
if (n > 0)
if (a > b)
z = a;
else
z = b;
در این مثال، else مربوط به if (a > b) است، همانطور که با تورفتگی (indentation) نشان داده شده.
اگر این چیزی نیست که میخواهید، باید از آکولاد استفاده کنید تا ارتباط مورد نظر را مشخص کنید:
if (n > 0) {
if (a > b)
z = a;
}
else
z = b;
این ابهام مخصوصاً در موقعیتهایی مثل مثال زیر دردسرساز میشود:
if (n > 0)
for (i = 0; i < n; i++)
if (s[i] > 0) {
printf("...");
return i;
}
else /* WRONG */
printf("error -- n is negative\n");
تورفتگی کد دقیقاً نشان میدهد که چه میخواهید، اما کامپایلر آن را متوجه نمیشود و else را به if داخلی متصل میکند.
این نوع باگها میتوانند سخت پیدا شوند، پس وقتی ifهای تو در تو دارید، استفاده از آکولاد را فراموش نکنید.
راستی، دقت کنید که بعد از z = a در این قطعه کد، سمیکالن وجود دارد:
if (a > b)
z = a;
else
z = b;
این به این دلیل است که از نظر دستوری، بعد از if باید یک دستور (statement) بیاید، و دستور انتسابی (مثل z = a;) همیشه باید با سمیکالن تمام شود.