ساختار زیر:
if (expression)
statement
else if (expression)
statement
else if (expression)
statement
else if (expression)
statement
else
statement
آنقدر پرکاربرد است که ارزش دارد جداگانه دربارهاش صحبت کنیم.
این دنباله از ifها کلیترین روش برای نوشتن تصمیمهای چندحالته (multi-way decision) است.
عبارتها به ترتیب ارزیابی میشوند؛ اگر یکی از آنها درست باشد، دستور مربوط به همان عبارت اجرا شده و کل زنجیره در همانجا تمام میشود.
مثل همیشه، هر بخش از statement میتواند یک دستور تکی باشد یا گروهی از دستورات درون آکولاد.
بخش آخر else برای حالت "هیچکدام از موارد بالا" یا همان حالت پیشفرض استفاده میشود — وقتی هیچکدام از شرطها برقرار نیست.
گاهی در حالت پیشفرض کار خاصی انجام نمیشود، پس آن قسمت را میتوان حذف کرد یا برای بررسی خطا و شناسایی شرایطی که "نباید اتفاق بیفتد" از آن استفاده کرد.
برای نمونه، در ادامه یک تابع جستوجوی دودویی (binary search) آورده شده که بررسی میکند آیا مقدار خاصی از x در آرایهی مرتبشدهی v وجود دارد یا نه.
عناصر آرایه باید به ترتیب صعودی باشند. اگر x در v وجود داشته باشد، تابع موقعیت آن (عددی بین ۰ تا n-1) را برمیگرداند و اگر نباشد، -1 را.
جستوجوی دودویی ابتدا مقدار ورودی x را با عنصر میانی آرایه v مقایسه میکند. اگر x از مقدار میانی کمتر باشد، جستوجو در نیمهی پایین ادامه پیدا میکند، در غیر این صورت در نیمهی بالا.
در هر مرحله همین فرایند تکرار میشود تا یا مقدار پیدا شود یا بازه خالی شود.
/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v[], int n)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high) {
mid = (low + high) / 2;
if (x < v[mid])
high = mid - 1;
else if (x > v[mid])
low = mid + 1;
else /* found match */
return mid;
}
return -1; /* no match */
}
تصمیم اصلی در هر گام این است که آیا x کوچکتر از، بزرگتر از، یا برابر با عنصر میانی v[mid] است — که این مورد دقیقاً برای استفاده از else-if مناسب است.
تمرین 1-3:
تابع جستوجوی دودویی ما درون حلقه دو بار شرط را بررسی میکند، در حالی که با کمی تغییر میتوان کاری کرد که فقط یک بررسی درون حلقه انجام شود (در عوض چند بررسی بیرون حلقه لازم خواهد بود).
یک نسخه از تابع بنویسید که فقط یک تست درون حلقه دارد و تفاوت زمان اجرای آن را اندازهگیری کنید.