控制语句
控制语句用于控制程序的流程, 以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。可分成以下几类:
4.7.1 if语句
if语句是最常见的一种条件判断语句。当对应的条件成立,则执行对应的代码。if语句的格式如下:
if(条件1)
{
语句;
}
或者:
if(条件1)
{
语句1;
}
else
{
语句2;
}
或者:
if(条件1)
{
语句1;
}
else if (条件2)
{
语句2;
}
else
{
语句3;
}
4.7.2 switch语句
switch语句的格式为:
switch(变量)
{
case 变量值1:
语句;
Break;
case 变量值2:
语句;
Break;
…
default:
语句;
}
switch语句的每个case分支,都应该有break语句,这样就不会执行break下面的其它语句了,否则,程序在执行完一个case的所有语句后,会紧接着执行下一个case语句。switch中间哪些类型的变量可以?char,short,int,long可以,但指针和浮点数不可以。Switch语句中当变量的值为下面case中某个值的时候,就会执行该case下的语句,直到遇到break语句。如果所有case的值都不相等,就执行default下面的语句。
下面是一个具体的switch语句的例子:
char c;
scanf_s(“%c”,&c,1);//从键盘输入一个字符作为变量c的值。
switch(c)
{
case ‘A’://输入A
语句;
break;
case ‘B’://输入B
语句;
break;
case ‘C’://输入C
语句;
break;
default:
;
}
4.7.3 for循环语句
for语句的书写格式如下:
for(表达式1;表达式2;表达式3)
{
语句;
}
第一次执行的时候,先执行表达式1,然后判断表达式2的值,如果为真,则执行{}里的语句,接下来,执行完{}语句之后,只要没有退出循环(如执行了break或者return语句),就会执行并计算表达式3的值。从第二次开始之后,表达式1将不会再执行,而直接计算表达式2的值,如果为真继续执行{}里的语句,否则,就退出循环。
比如:
for(int i=0;i<10;i++)
{
printf(“%d\n”,i);
}
for语句的三个表达式都可以缺省,如下:
for(;;)
{
}
这个时候,for循环是一个死循环,需要在循环里使用break语句或者return语句来退出循环。
下面是一些常见的for循环写法的例子:
当i==5时,忽略continue之后的所有语句的执行,继续进入循环下一次迭代;当i==9时,循环退出
循环嵌套,二重循环
4.7.4 while循环语句
while语句的书写格式如下:
while(条件)
{
语句;
}
计算顺序:先计算while()里的条件表达式的值,如果为真,再执行{}里的语句。
while(1)
{
}
while(1)循环因为条件为1,恒为真,所以是一个死循环,需要在循环内部使用break或者return语句跳出循环。
下面是一个while循环的例子,只要i>0,那么循环就会继续执行,而当i<=0的时候,循环就会退出。
4.7.5 do-while循环语句
do-while语句的书写格式如下:
do
{
语句;
}while(条件);//注意此处需要有分号,否则编译会报错
do-while()循环是先执行语句,再进行条件判断,所以无论条件是否成立,语句都会执行至少一次。
上面的例子中,只要i>0,那么循环就会继续执行里面的语句,打印出i的值。而当i<=0之后,循环条件并不满足,所以循环会退出。注意,因为do-while循环是先执行,再判断,所以:
i=0;
do
{
printf("%d\n",i);
}while(i>0);
或者:
do
{
printf("hello world\n");
}while(0);
尽管循环的条件都为假,但因为是先执行,再判断,所以循环都会执行一次,再退出。
各种结构的循环常见写法:
前几节中,几乎每个算法都用到了循环语句。以循环语句为核心,循环语句把其他语句联系起来。
下面把常用的循环语句列出,方便大家在编程的时候使用:
1.数组
for (int i = 0; i < n; i++)
{
printf(“%d\n”, a[i]);
}
2.字符串
while (*str !=’\
{
str++;
}
3.链表
while (p)
{
p = p->next;
}
4.栈空/栈满/队空/队满
while(栈非空)
{
出栈;
操作出栈元素
}
5.指针大小比较
while (pStart < pEnd)
{
pStart++;
}
6.数为正
while (size--)
{
}
do
{
}while(size--)
7.反复循环直到条件成熟
while(1)
{
if (something is true)
break;
}
熟练各种循环语句的写法,为实现各种复杂的算法奠定了基础。因此,要在各种循环语句上下功夫,达到熟练书写,灵活运用的程度。
4.7.6 转向语句:continue/break/goto/return
1.break语句
break语句的格式为:
break;
break语句一般用在循环语句来退出循环,或者用在switch语句中,用来退出switch语句的执行。
2.goto语句
C语言中的goto语句是用来控制程序执行从一个地方跳转到另外一个地方执行的。其应用格式为:
LabelA:
语句3;
……
语句1;
goto LabelA;
语句2;
在上面的伪代码中,程序在执行完语句1之后,继续执行goto语句,程序就会跳转到标签 LabelaA下面继续执行语句3。
一般会看到C语言代码里出现了goto语句,让人觉得很奇怪。因为几乎所有的人都会告诉你,在程序里尽量少用goto语句。Goto语句为什么人见人恨呢?先看看goto语句的一些典型的缺点:goto语句可以实现无条件跳转,如果不加限制,它的确会破坏结构化程序设计风格。其次,goto语句经常带来错误和隐患。它可能跳过某些对象的构造,变量的初始化,重要的计算等语句。
那么goto语句是不是就一无是处了呢?也不是这样的。比如goto语句还可以用在下面2种情况下:
l 跳出循环
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
for(int k=0;k<10;k++)
{
if(k==5)
{
goto out;
}
}
}
}
out:
l 出错处理
char *p1=(char *)malloc(128);
if(p1==NULL)
goto exit;
char *p2=(char *)malloc(16);
if(p2==NULL)
goto exit;
exit:
if(p1)
free(p1);
if(p2)
free(p2);
3.continue语句
语句continue用于在循环语句中,结束本次循环,即跳过循环体中continue下面尚未执行的语句,紧接着进行下一次是否再进行循环的判断,也就是说当语句执行到continue时,立即结束本次循环,重新去判断循环条件是否为真,如果为真,那么就会继续执行下一次循环;如果为假,循环就退出。。
以while循环为例子,语句continue在循环中的使用格式为:
while(条件1)
{
if(条件2)
{
continue;//当条件2位真,那么循环后面的”其它语句”就不会再执行
//而重新判断条件1是否为真
}
其它语句;
}
int i=10;
while(i>0)
{
i--;
if(i==7)
{
//当i等于7的时候,下面的printf函数语句会被忽略
//所以不会打印出7这个数字
continue;
}
printf(“%d\n”,i);
}
4.return语句
return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定,return返回的值类型由函数声明中的返回类型确定。比如:
(1)在返回类型是char的函数中,return后应该是char类型的值;
(2)在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int 类型就行了;
(3)在返回类型是结构类型的函数中,return后应该是结构的一个实例对象;
(4)return后面也可以跟表达式,比如函数调用等;
(4)如果函数无返回类型,而是void,则无需要返回任何类型的值。
return语句的使用格式:
类型 func(参数列表)
{
类型 value;
……
……
return value;
}
int func(参数列表)
{
int result = 0;
……
return result;
}
在汇编语言里,返回值一般都是放在ax寄存器中。