程序控制
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第852页(5325字)
C语言丰富的操作符使得程序设计非常灵活,必须进行快速二进制或逻辑运算程序不必利用特定函数完成相应的位运算。C语言还有一套完整的程序控制方式。以根据表达式的结果作重复或条件运行。
1.条件语句:if-else
if语句根据表达式的结果决定是否执行,或执行哪些语句,其一般形式为:
if(value)
statement1;
else
statement2;
其中value可以是任意的结果为整数(或转换为整数)的表达式。如果value不等于零(表示结果为true),则statement1,否则执行statement2,注意这里并不要求value为逻辑表达式。只要表达式结果等于0,就执行statement2。上述形式else statement2部分是可选的。当没有这一部分时,如果value的值为0,则跳过statement1不执行。
如果某一值为true时要执行多个语句,则须采用复合语句。复合语句由左括号{,若干简单语句(均以分号结尾),和右括号}组成。注意程序2.1中main和其它函数的体都是复合语句,实际上,在本章所描述的控制结构中,任一简单语句都可以嵌套。如下列将浮点数(result)转换为两位2的补码和数(out);
2.switch语句
当程序必须在多个候选者中选择时,if-else语句就显得不够方便,有时效率还低。当候选者多于四个时,switch语句非常有用,switch语句的一般形式为:
switch(integer expression){
case constantl:
statements:(optional)
break;(optional)
case constamt2:
statements;(optional)
break;(optional)
······more optional case statements
default:(optional)
statements;(optional)
}
在执行switch语句时,如果整数表达式的值等于某个case标号中的常量,(整数或字符),则程序控制转入该case标号后的语句,如果表达式的值不等于任何case标号中的常量,则控制转入default标号后的语句,如果没有default标号部分且表达式的值不等于任何case标号中的常量,则控制前进到switch语句之后的下一个语句,当找到与表达式值相等常量后,就执行相应case标号后的语句。直到switch语句的结尾或遇到break语句为止。break将控制转向switch语句之后的下一语句。switch语句的一个简单例子:
switch(i){
case 0:
printf(In Error:“I is zero”);
break;
case 1:
j=k*k;
break;
default;
j=k*k/i;
}
前两个case语句的break语句是必不可少的,其作用是阻止下一个case语句的执行。但是default语句中不必有break语句。因此,上述代码段在i为0时,输出错误信息,其它情况下使j等于k*k/i。注意,由于除法操作比case语句的转移费时,所以单独处理i=1的情况可以节省时间(当然须当i确等于1时)。
3.单行条件表达式
C语言提供一种方法可在一个程序行中表达一个if-else语句,这称为条件表达式,因为它使用条件操作符?:。?:是C中唯一的三元操作符。条件表达式的一般形式为:
expression1?expression2:expression3
其语义是:如果expression1为true(非0整数),则整个条件表达式的值等于expression2失真值;如果expression1为false(即为0)。则整个表达式的值等于expression3的值。一个简单例子是求两上表达式的最大值:
maxif=(a0>a2)?a0-a1:a2-a1
条件表达式并非必不可少,因为if-else语句能提供同样的功能。用条件表达式写出的程序更紧凑,有时还能得到更有效的机器代码,但另一方面,条件表达式比通常的if-else结构更难阅读。
4.循环:while,do-while,for
C语言有三种控制结构允许一个或一组语句重复执行固定数或某一变量
表示的次数。while循环重复执行循环体直到被测试的表达式为false或0,是否执行循环体是循环开始之前决定的。因此,循环有可能一次也不执行,while循环的一般形式为
while(expression)
statement;
其中statement既可以是简单语句,也可以是复合语句。下面的例子通过while循环计算字符串(即字符数组)中空格的个数:
注意如果串的长度为o,则string[i]的第一个字符为结束符null(其值为0或false),从而,while循环体将不被执行。一般情况,while循环将连续计数串中的空格直至遇到结束符null.
当要重复一组语句且须在循环体末尾测试出口条件时,可使用do-while循环。是否再次执行循环体是在本次循环之后决定的,因此do-while循环在任何情况下都至少被执行一次。do-while循环的格式与while循环类似。只是它以关键字do开始,以while(expressionf)结尾。关键字do和while之间可以是简单语句,也可以是复合语句。该循环用途之一是测试输变量是否越界。如下例所示:
do{
printf(“In Enter FFT length(less than 1025):”);
scanf(“%d”.&fft-length);
}while(fft-length〉1024);
在上述代码段中,如果用户输入的整数fft-length大于1024,则需求重新输入,直到输入的fft-length小于或等于1024。
for循环将一个初始化语句,一个结束条件语句和一个动作语句(在循环末尾执行)结合成一个非常有力的控制结构,其标准形式为
for(initialize;test condition;endupdate)
statement;
括号中的三个表达式都是可选的(for(;;);为一无限循环),statement可以是简单语句,复合语句或仅仅一个分号(空语句)。for循环用得最频繁的是对数组进行索引,例如:循环
for(i=0;i<length;i++)a[i]=0;
将数组a的所有元素(从a[o]到a[length-1]设置为0。该for循环设置i为0。检查i是否小于length。如果是则执行语句a[i]=0。并给之增1,循环一直重复到i等于length。每次执行到循环末尾都更新i的值(增1),并执行条件测试语句。只有当测试结果为true时,循环体中的语句才被执行。for循环的每个语句都可以是多个表达式,因此这样的循环可能很复杂。例如:
for(i=0,i3=1;i<25;i++,i3=3*13)
printf(“1n%d%d”,i,i3);
这个语句在for循环中使用两个整数(i,i3)以输出3的0次方到24次方。注意结束条件是单个表达式(i<25),而初始化和末尾表达式都是由逗号分开的两个赋值表达式。
5.程序转移:break,continue,go
前面讨论的循环语句(while,do-while,for)和条件语句(if,if-else,switch)是C语言中最重要的控制结构,它们在C程序中得到广泛使用。最后三个控制语句(break,continue,goto)允许程序无条件转移,如果使用太多,会使程序不易理解,调试和修改。
break语句已与switch语句一起出现过,其作用是使程序流跳出包含break语句的switch,for,while或do-while语句,直接转去执行这些控制结构后面的下一语句。当一个循环有多个出口时,也可用break语句跳出循环。但一般情况,将循环结束条件结合成一个单一的逻辑表达式要清晰得多。例外的情形是,循环中含有大量执行语句,其中有些语句会导致循环提前结束(例如文件结束或其它错条件)。
continue语句几乎正好与break相反,其作用是跳过当前这次循环,直接转入下一次循环的开始。continue语句可以与for,while,do-while三个循环语句一起使用,但不能与switch语句一起使用。对于包含switch语句的循环,其控制流受到影响,但循环并不结束。虽然continue语句会使程序难读,但在循环结构中有嵌套的if-else语句时,continue语句可以使代码更简短。
在C语言程序设计中,goto语句并非必不可少,不过C仍提供了这一语句。大多数使用过FORTRAN或BASIC(二者都要求用goto语句控制程序流程)的程序员都养成了依赖goto语句的不良习惯。C语言中的goto语句使用标号,这比用数值要好一些。