第三章 控制流 >> 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,而是会陷入一个无限循环,所以该函数还是有待改进的。