在对参数进行校验时,经常需要校验函数的几个参数,是对每个参数都使用一个单独的if语句进行一次校验,还是多个语句都放在一个if语句里用逻辑或运算来进行校验呢?还是用实例来说明吧。
例1-1 参数校验举例。
TABLE *CreateTable1( int nRow,int nCol )
{
if ( nRow > MAX_ROWS )
{
return NULL;
}
if ( nCol >= MAX_COLS )
{
return NULL;
}
……
}
TABLE *CreateTable2( int nRow,int nCol )
{
if ( nRow > MAX_ROWS || nCol >= MAX_COLS )
{
return NULL;
}
……
}
在CreateTable1()和CreateTable2()两个函数中,到底哪个写法更好呢?答案是第二种写法更优。为什么呢?因为第二种写法中,少了一个return语句,编译后,执行代码会比第一种写法小,执行时耗用的内存自然少了,其他方面的性能都是一样的。有兴趣的读者可以将上面两段代码反汇编出来分析一下。
goto语句在结构化编程技术出来后,被当作破坏结构化程序的典型代表,可以说,在结构化程序设计年代,goto语句就像洪水猛兽一样,程序员都唯恐避之不及;可后来在微软的一些例子程序中经常把goto语句用来处理出错,当出错时,goto到函数要退出的一个label那里进行资源释放等操作。那么,goto语句是不是只可以用于出错处理,其他地方都不可以用了呢?下列关于使用goto语句的原则可以供读者参考。
1) 使用goto语句只能goto到同一函数内,而不能从一个函数里goto到另外一个函数里。
2) 使用goto语句在同一函数内进行goto时,goto的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。
3) 不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。
许多有关C语言的书中都说过,switch … case 的效率比if … else if 的效率高。其实这个结论并不完全正确,关键看实际代码,少数情况下,if…else if写法如果得当的话,它的效率是高于switch…case的。
例1-2 if…else if语句测试举例。
void TestIfElse()
{
unsigned int x ;
srand( 1 ); /* 初始化随机数发生器 */
x = rand() % 100;
if ( x == 0 )
{
……
}
else if ( x == 1 )
{
……
}
else
{
……
}
}
x为0~100范围内的随机数,当x不为0和1时执行else分支,因此上面函数有98%的概率是执行else分支的,而执行if分支和else if分支的概率各为1%。在执行else分支时,要先执行if判断语句,再执行else if判断语句后才会执行else分支里的内容。因此执行else分支需要进行两次判断。如果我们按下列方式将else分支的执行改成放到if里面去执行,则效率将大大提高。
void TestIfElse( )
{
unsigned int x ;
srand( 1 ); /* 初始化随机数发生器 */
x = rand() % 100;
if ( x > 1 )
{
……
}
else if ( x == 0 )
{
……
}
else
{
……
}
}
如果上面的代码用switch...case来实现,则效率不如上面的函数,读者可以试验一下。