C 语言复习与提高---III. 语句

来源:互联网 发布:mac暂存盘已满怎么办 编辑:程序博客网 时间:2024/04/30 15:22
III. 语句

语句是可执行程序的一部分,它说明一种行为。C 语言的语句分为以下几类:

选择(selection)、循环(loop)、跳转(jump)、标号(label)、表达式(expr)、块(block)。

一、选择语句:

1、if 语句:if (expr) /* 处理 */;

(1、)expr 应该只产生 scalar(int,char,或 float,以及 C99 中的 _Bool)结果。

(2、)尽量不要在 expr 中使用 float 表达式,因为 float 运算占用几条 CPU 指令,这将明显降低执行速度。 而 int 或 char 运算占用 CPU 指令数较少。

(3、)嵌套使用 if 语句时,C89 规定编译器至少应支持 15 层嵌套,C99 提升到 127 层。 实际上,绝大多数的编译器支持的嵌套数都远远大于 15 层。

(4、)用 ?:操作符代替 if 语句时,并不局限于赋值,表达式中还可以包含函数。如: vrai ? f1(vrai) + f2() : printf("Error!/n"); /* 允许编译器在优化目标码时重新安排求值顺序 */

2、switch 语句:switch(expr) { case … }。主要用于处理键盘输入(如接口菜单)等操作。

(1、)expr 必须对 int 求值(可以使用 int 或 char 型)。

(2、)C89 规定一个 switch 语句最多可以包含 257 个 case,C99 提升为 1023 个。 实际工作中,为了提高效率,不宜有太多的 case 语句。

(3、)switch 的特性: - 与 if 语句的区别:switch 只测试是否相等,而 if 可以测试关系和逻辑表达式。 - 每个 case 后面的条件必须不同(嵌套时内层和外层的 case 语句例外)。 - switch 语句中的 char 型常数全部被自动转换成 int 型。

二、循环语句:C 语言的 for 循环是所有面向过程的语言中的循环语句的基础。

1、for (init; condition; inc) { /* 处理 */ }

/** init 一般为赋值语句(初始化循环变量的作用)。 * condition 是一个关系表达式,指定循环退出的条件。 * inc 修改循环变量。 * * for 循环中,condition 测试总是在循环的顶部实施(循环体可能得不到执行)。 */

--> for 语句的变种:

(1、)逗号表达式的使用:for(init1, init2; condition; inc1, inc2) { … }

(2、)condition 不必一定包含对一些目标值测试循环变量,它可以是关系或逻辑语句(可以测试多种可能的终止条件)。 [例]登录密码 void user_login() { char passcode[8]; /* UNIX 系统一般为 8 位密码,尤其是使用了老版本的 NIS 的系统*/ int fois; /* 测试次数 */ for(fois=0; fois<3 && strcmp(passcode, "a1b2c3d4"); ++fois) { printf("请输入密码:--> "); gets(passcode); } if(fois==3) return; /* 如果三次输入密码错误,返回 */ else /* 如果输入正确,则使用户登录 */ }

(3、)for(expr1; expr2; expr3) { …} /* for 语句的三个部分都可以是表达式 */

[例]int i; for(func1(); i=func2(); func3()) { /* 处理 */} /** 这个 for 语句的三个部分均为函数调用 * 这是 for 语句的非常规方式,但是合法。 */

(4、)for 语句的三个部分都可以省略。init 部分通常都在循环体外定义,尤其是当 init 部分需要进行复杂计算时。

[例]在实际编程中,经常使用 for( ; ; ) 来实现一个死循环。 for( ; ; ) { user_input=getchar(); if(user_input=='Q') break; /* break 的作用是强制退出循环 */ }

(5、)空循环:主要用于改进某些算法,或构造延时循环(time delay loop)。

[例1]中国计算机爱好者论坛的风格:从用户输入中删除多余的空格。 for(; * str==' '; str++);

[例2]耗费时间,这个类似于 UNIX 中的 sleep 命令的作用。 for(temps=0; temps<TEMPS_FIXE; temps++); /* 注意有些编译器会优化掉时间延迟循环 */

(6、)C99 和 C++ 允许在 for 语句的 init 部分声明变量,使循环变量的作用域限制在语句控制的块内。 如:for(int i=0; i<100; i++) a+=i; /* 在循环体外,i 是未知变量 */

2、while 循环:while(condition) /* 处理 */ /* condition 可以是任何非零值的表达式 */

(1、)while 也是在循环顶部测试条件(循环体可能得不到执行)。若几个条件中的任何一个都能终止循环,则一般由一个循环控制变量来构成 condition,在循环中的不同点为其赋值。

[例]#define TRUE 1 #define FALSE 0

void test_while() { int traitement=TRUE; while(traitement) { traitement = proc1(); if(traitement) traitement=proc2(); if(traitement) traitement=proc3(); } }

(2、)空循环: [例]在利用循环,将一个数组中的元素复制到另一个数组中时: char *from, *to; while(*from++=*to++);

3、do-while 循环:在底部进行条件测试(循环体至少执行一次)。 do { /* 处理 */ } while(condition);

[例]do-while 循环常用于创建菜单子程序:

void install(); /* for installing the system */ void ReadMe(); /* for reading the ReadMe.txt */

char selection() { char choice;

do { switch(choice=getchar()) { case '1' : choice='1'; break; case '2' : choice='2'; break; case '3' : choice='3'; break; } } while(choice!='1' && choice!='2' && choice!='3');

return choice; }

void menu() { char resultat;

printf("1. Install the system./n"); printf("2. Read the ReadMe file./n"); printf("3. Quit./n");

resultat=selection();

switch(resultat) { case '1' : install(); break; case '2' : ReadMe(); break; case '3' : exit(0); /* return to OS */ } }

三、跳转语句:return,break,continue,goto 是 C 的无条件跳转语句,其中 return 和 goto 可以用于程序的任何地方,break 和 continue 可以和任何循环语句一起使用。

1、return 语句:返回到函数的被调用点。无值的 return 常用于从 void 型函数中返回。

(1、)函数中使用 return 的次数不限,但第一次使用时立即停止执行,返回到调用点。

(2、)void 型函数不能使用带值的 return。

(3、)在 C89 中,非 void 型函数执行不含值的 return 时返回无用值。这点非常糟糕! 在 C99 和 C++ 中,非 void 型函数中的 return 必须返回一个值。 (然而,如果执行到非 void 型函数的结尾时,则返回无用值。这不是语法错误,应尽量设法避免。)

2、break 与 continue 语句:

(1、)break 语句的两种用途: --> 在 switch 语句中结束一个 case。 --> 越过常规循环条件的测试,立即强制终止循环。(需要根据某些特殊条件立即终止循环时常用) [例]for (int i=0; i<100; i++) if (i==25) break;

(2、)continue 语句:强制开始下一轮循环。 --> 对于 for 语句:continue 使循环从条件判断处重新开始。 --> 对于 while 和 do-while 语句:continue 把控制转到条件测试。

3、goto 语句:是一种方便措施,常用于跳出多重循环。 [例]for( ; ; ) { for ( ; ; ) { for ( ; ; ) { for ( ; ; ) { /* 处理 */ if ( /* 条件 */ ) goto _end; /* 直接跳出所有循环 */ /* 处理 */ } } } }

_end: /* 标号(label)*/ return;

/** 注意与 UNIX 中 Shell 编程的区别。 * Shell 脚本可以直接使用 UNIX 命令 break 4 来跳出上面所有的循环。 */

4、#include <stdlib.h> void exit(int return_code);

/** 标准库函数,立即终止程序,并返回 OS。 * 按照 UNIX 系统的标准: * 返回 0 代表正常终止, * 返回非 0 代表异常终止。 * return_code 自带宏:EXIT_SUCCESS 和 EXIT_FAILURE * * 注意与 UNIX 系统中 exit 命令的格式的区别。 */

 
原创粉丝点击