从头学C(26)else-if语句

0

第三章 控制流 >> 3.3 else-if语句

除了上一节看到的if-else语句,我们还可能会经常用到类似如下结构的语句:

if (表达式)
    语句
else if (表达式)
    语句
else if (表达式)
    语句
else if (表达式)
    语句
else
    语句

这种if语句序列是多路判定的常见用法。其中的表达式从上到下依次被求值,一旦某个表达式的结果为真(非0),则执行与之相关的语句,然后跳出整个序列的执行。和if-else语句一样,上面的“语句”既可以是单条语句,也可以是一个符合语句(程序块)。

最后那个else部分是用于处理“以上表达式均为假”的情况,当然有时候可能并不需要这么一个默认的处理分支,那么else及其对应的“语句”可以省略掉。

利用下面这个折半查找函数来看下三路判定程序的用法。

#include <stdio.h>
/* 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 */
}

void main()
{
        int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int ret;

        ret = binsearch(12, a, 10);
        if (ret == -1)
                printf("12 is not in a[]\n");
        else
                printf("12 is equal to a[%d]\n",ret);

        ret = binsearch(3, a, 10);
        if (ret == -1)
                printf("3 is not in a[]\n");
        else
                printf("3 is equal to a[%d]\n",ret);

        return;
}

该函数用于判定在一个升序排列的数组v[]中是否存在某个特定的值x。如果v[]中包含x,则函数返回x在v中的位置(0 ~ n-1之间);否则函数返回-1。

打印结果是:

12 is not in a[]
3 is equal to a[2]

实际测试,你会发现这个函数并不严谨。比如当a[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11},x=1时,该函数并不会返回-1,而是会陷入一个无限循环,所以该函数还是有待改进的。

Leave A Reply