跳转语句
return语句
return语句用来从函数中返回.之所以把return也定义为跳转语句是因为它迫使函数的执行中止并跳转到调用函数的点继续执行程序.return可以带一个返回值,也可以不带.如果有关联的返回值,则这个值将是函数的值.在C89标准中一个非返回值为空的函数中,return也可以不带任何返回值,这样以来函数的返回值将是一个垃圾数值(无效的).而在C++中,定义为带返回值的函数的return语句则必须关联一个返回值.(即使在C89中,如果一个函数定义为有返回值的函数,我们也最好还是给它return一个自然数值.)通用格式如下:
return expression;
expression只在函数被定义为带返回值时出现.这种情况下,expression的值将称为函数的值.可以在函数中定义任意数量的return语句,但是函数将会在遇到第一个return的时候就退出运行.花括号}也会导致函数的退出,它的作用和一个不带返回值的return语句时等价的.如果这种情况在函数被定义为带返回值时发生,则函数的返回值就时没有定义的.
定义为无返回值的函数不允许含有带返回值的return语句.因为函数是无返回值的,所以不能有任何返回一个值的return语句出现.想更多了解return请参见第六章.
goto语句
因为C/C++中支持很多中控制语句并且可以在语句中结合使用break和continue语句,因此goto语句实际上可以不使用.大部分程序员认为goto语句会使得程序的可读性大大降低.然而,尽管goto语句已经多年不被人使用,但是在某些特殊情形中,它也有它的用处.没有任何程序中会必须使用goto语句.但是在有些密集的程序代码中,如果goto语句用的巧妙,将会带来好处.例如从一个多层嵌套的循环中跳出.
goto语句需要一个标号做为操作数.标号是一个后面跟着冒号的标识符.不过,这个标号必须和goto语句在同一个函数中,也就是说不允许用goto在不同的函数中跳转.通用格式如下:
goto label;
.
.
.
label:
标号可以在goto前或者后,这都是允许的.看下面的例子:
x = 1;
loop1:
x++;
if( x<100 ) goto loop1;
break语句
break语句有两种用途.一是用来结束一个case分支.另一个是立即中止一个循环,绕过循环条件检测.
当循环中遇到break语句的时候,循环会立即中止.程序将开始执行循环体后的下一个语句.
#include <stdio.h>
int main( void )
{
int t;
for( t=0; t<100; t++ ){
printf( "%d", t );
if( t==10) break;
}
return 0;
}
该代码在屏幕上显示0到10.循环在break语句的作用下立即中止,绕开了t<100整个条件.程序员常在循环中应用break语句,往往在循环需要在某种特定的条件下中止的时候.例如下面的lookup()函数会在有按键的时候中止:
void look_up( char *name )
{
do{
/* look up names ... */
if( kbhit() ) break;
}while( !found );
/* process match */
}
kbhit()函数将在有键盘输入的时候返回非零值,无键盘输入的时候返回0.因为各种硬件环境有很大的差异,所以在标准C和C++中都没有定义这个函数.但是通常的编译器都支持该函数.(有事可能有不同的名字)
break仅仅会使得程序跳出最内部的一层循环.例如:
for( t=0; t<100; t++ ){
count = 1;
for( ; ; ){
printf( "%d", count )
count++;
if( count==10 ) break;
}
}
这个程序将在屏幕上显示100次1到10.任何时候遇到break,控制权将会被交到循环外部.另外,如果break出现在switch语句的分支中,它将只对switch语句发生作用,无论switch语句是否在一个循环中,该break对循环没有影响.
exit()函数
尽管exit()函数并不是控制语句,但是我们还是暂时离题一会来讨论一下整个函数.和你可以用跳转语句跳出一个循环一样,我们可以使用exit()函数来退出一个程序.该函数会导致程序立即退出.通用格式如下:
void exit( int return_code );
return_code的数值将会返回给调用该程序的进程,通常是操作系统进程.返回零通常代表程序正常退出,返回其它数值则通常意味着程序出错.可以使用宏EXIT_SUCCESS和EXIT_FAILURE做为程序的返回值.调用exit函数需要声明头文件stdlib.h.在C++中则使用C风格头文件<cstdlib.h>
常常在某个程序运行所必须的强制条件不具备的时候用该函数来结束程序.例如,假如一个虚拟现实的程序需要一个特定规格的显示适配器才能运行,那么该程序的main()函数可以这样写:
#include <stdlib.h>
int main( void )
{
if( !virtual_graphics() ) exit();
paly();
/* ... */
}
/* ... */
其中,virtual_graphics是一个用户自定义的函数,当虚拟显卡存在的时候函数返回true,否则返回false,这个时候程序就是被中止.另一个例子就是把之前的菜单程序进一步改进:
void menu( void )
{
char ch;
printf( "1. Check Spelling/n" );
printf( "2. Correct Spelling Errors/n" );
printf( "3. Display Spelling Errors/n" );
printf( " Enter your choice: " );
do{
ch = getchar(); /* read the selection from the keyboard */
switch(ch){
case '1':
check_spelling();
break;
case '2':
correct_errors();
break;
case '3':
display_errors();
break;
case '4':
exit(0); /* return to OS */
}
}while( ch!=1 && ch!='2' && ch!='3' );
}
continue语句的工作原理与break有部分相似,不同的是它不是用来强制结束,而是用来直接开始下一个循环.跳过中间的代码.例如,在for循环中,continue语句会导致程序直接跳转到下一个条件测试和增量语句,在while和do-while语句中,continue会导致程序直接跳转到下一次条件测试.
下面的这个例子程序用来检测用户输入的字符串中的空格数量.
/* Count spaces */
#include <stdio.h>
int main( void )
{
char s[80], *str;
int space;
printf( "Enter a string:" );
gets( s );
str = s;
for( space=0; *str; str++ ){
if( *str != ' ' ) continue;
space++
}
printf( "%d spaces/n", space );
return 0;
}
每一个字符将检测是否等于空格,如果不是,则执行continue语句跳到下一次检测循环,如果是,则把变量space的值加一,然后再进入下一个循环.下面的例子程序,演示了如何利用continue语句导致循环的结束.
void code( void )
{
char done, ch;
done = 0;
while( !done ){
ch = getchar();
if( ch=='$' ){
done = 1;
continue;
}
putchar( ch+1 ); /* 把字母高移一位 */
}
}
这个函数可以把你写的信息中的每个字母都转换成高一位的字母.例如,A被转换成B.当用户输入$符号的时候函数将会退出.(具体原理很简单,这里省略)