C语言控制语句-基本知识概念与编程技巧(5)

本章主要讲述C语言的控制语句

循环能重复执行行为,让程序更加强大,可以灵活便捷的控制程序,并且,重复计算是使用计算机的主要原因。

C语言提供了以下几种循环类型。

①while循环

在while循环中,当给定条件为真时,重复执行语句或语句组。它会在执行循环主体之前测试条件。while循环是一种不确定循环,即在测试表达式为假之前,预先不知道要执行多少次循环。

如下例结构。

double money = 123.45; //最初钱数123.45

while(money < 200) 
{
   money = money + 2.33; //当钱数低于200时,每次获得1.23
}

while后括号内为循环执行条件,当循环条件为真时,这时执行循环。条件为 false 时,退出循环,跳过循环主体(花括号内),程序流将继续执行紧接着 while 循环的下一条语句。

②for循环

for 循环允许您编写一个执行指定次数的循环控制结构。for循环属于计数循环,这类循环在执行循环之前就知道要重复执行多少次。

如下例结构。

for (int money = 123; money < 200; money++) //最初有钱123,当钱数小于200时每次加一
{
   printf("money:%d\n",money); //输出每次增加后的钱数
}

for循环后面的圆括号中有3个表达式,分别用两个分号隔开,被称为控制表达式。for 循环括号内第一个分号前的表达式相当于在循环前定义变量,若前面已经定义,可以只写一个分号,称为初始化。两个分号间的第二部分是判断语句(测试条件),如果为真,则执行循环主体,如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。第三部分的表达式可以用来更新循环使用的变量,同样也可只留一个分号。接着,条件再次被判断,如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件),在条件变为假时,for 循环终止。

③do...while循环

不像 for 和 while 循环,它们是在循环的每次迭代之前测试循环条件,满足条件才能进入循环体,所以有可能根本不执行循环体中的内容这种循环类型被称为入口条件循环。在 C 语言中,do...while 循环是在循环的每次迭代之后检查它的条件,这保证了至少执行了循环体中的内容一次,被称作出口条件循环。

int apple = 1;

do
{
   printf("Apple:%d",apple);
   apple++;

}while(apple < 10); //苹果数量小于10时,实现数量的自增

前三个为程序控制流,后面则介绍分支结构,即C语言的判断语句

④if语句

if语句即分支语句(选择语句),相当于一个交叉点,程序要在两条分支中选择一条执行,通用形式如下。如果括号内的关系表达式为真,则执行语句,否则跳过它。和循环的最大区别,if语句满足条件只执行一次,循环可多次执行。

if (money>food) 
{
    food++;
}

⑤if else语句

if else语句可以在两条语句之间做选择,如下所示

if (money != 0)
{
    printf("Poor"); //为真执行此句
}
else
{
    printf("Rich"); //为假执行它
}

 ⑥多重选择else if

else if用来扩展if else,相当于一种变式,用于在多个中选择,避免嵌套if else增加代码量,可以清晰看出各项选择,如下。

if (money < 20)
{
    level = 1;
}
else if (money < 50) //若还使用更多选择,可继续增加else if
{
    level = 2;
}
else (money < 100)
{
    level = 3;
}

⑦循环辅助continue和break

三种循环都可以使用continue语句,而switch语句不能使用。执行到该句时,会跳过本次迭代的剩余部分,并开始下一轮迭代,并且continue语句若存在多层循环中,只影响本层迭代。for循环中,continue语句跳过循环体余下部分后,下一步先执行括号内第三块变量更新,然后才执行测试表达式。do while循环直接跳到while后的条件测试。

for (i = 0;i < 10;i++)
{
    if (i == 4)
        continue; //i为4时跳过后续代码,重新迭代;若此句为break,循环结束
    printf("%d",i);
}

break语句用于终止循环或switch语句的一个case。当程序执行到 break语句时,会终止包含它的那层循环,程序流将继续执行紧接着循环的下一条语句。

⑧多重选择switch和break

二选一可使用if else语句,而当涉及到在多个选项中选择,测试一个变量等于多个值时的情况,一般会使用switch语句解决,每个值称为一个case标签,且被测试的变量会对每个switch case进行检查。通过输入switch后括号内的表达式值,从上到下依次扫描,直到发现一个匹配的值为止,然后程序跳转至那一行,直到遇到break语句为止。若没有匹配的标签,可写default标签行跳转至该行,否则程序继续执行switch后面的语句。格式如下

switch(month)
    {
        case 1:
            printf("您所输入的是一月共31天\n");
            break;
        case 2:
            if(flag == 1) 
                printf("您所输入的是二月共29天\n");
            else
                printf("您所输入的是二月共28天\n"); 
            break;
        case 3:
            printf("您所输入的是三月共31天\n");
            break;
        case 4:
            printf("您所输入的是四月共30天\n");
            break;
        ...... //后面省略,同理
    }


//下面代码等价且更为简洁,并且包括default标签行
/*
多重标签用法如下,多个case连接,由于没有关联break语句,所以程序流直接执行下一条语句
所以,多个case连接,这些标签都指向同个语句,除非遇到break语句进行重定向
*/
switch(month)
{
	case 4: case 6: case 9: case 11: printf("%d月有%d天。", month, 30); 		
        break;
	case 2: printf("%d月有%d天。", month, 27+flag); 
        break;
	default: printf("%d月有%d天。", month, 31);
}
//flag写个判断闰年用于是否加一

遇到break语句,switch终止,控制流将跳转到switch语句后的下一行。虽然case不强制需要包含break,但如果 case 语句不包含break,控制流将会继续后续的 case,直至执行到switch语句末尾为止。所以最好每个case都加上一个break,在每一case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。

对switch语句来说default case是可选的,出现在switch的结尾。default case可用于在上面所有 case 都不为真时执行一个任务,此语句为可选。

⑨goto语句

C语言中的goto语句允许把控制无条件转移到同一函数内的被标记的语句,但此语句一般不建议使用,因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法,利用if else语句或者循环语句以及continue与break来替代,所以如无必要,尽量不使用此语句。

goto a; //后面为标签名,命名遵循变量命名规则

a: b = 2; //跳转至此标签冒号后的语句

1.循环测试条件括号后面不接分号,只有一条完整的表达式语句才需要接分号,否则此循环的循环体被判断为空语句。

2.循环中若只有单条语句可不用花括号括起,多条语句的复合语句(块)必须用花括号括起。

3.for循环的循环头括号内第一块和第三块可以写入多个表达式,其中用逗号分隔。逗号序列点隔开的表达式从左至右分步执行。整个逗号表达式的值是逗号右侧表达式的值。

4,for循环对比while循环的优势在于,可以将变量初始化和更新直接写在头括号内,减小代码量,第二是便于在循环中索引计数。

5.一般情况下,入口条件循环用的比较多,因为大多数情况测试条件需要在执行循环之前测试,使不满足测试条件时就直接跳过整个循环,且这样使程序的可读性更高。

6.在C 语言中允许在一个循环内使用另一个循环,被称作嵌套循环,也可以在任何类型的循环内嵌套其他任何类型的循环。内层循环在每次外层循环迭代时都执行完所有的循环,可以通过外层循环控制内层循环。

7.若程序中有多个if else,其else与离他最近的if匹配,若含花括号分隔代码块,则遵循正常的缩进匹配逻辑。为了防止逻辑混乱并提高代码的可读性,建议即使只有单条语句也最好使用花括号括起来。

8.switch后括号内一般为指定的一个整数类型常量(包括char型)、枚举类型或者整型常量表达式,与case标签的数据类型相同,且并不能使用变量。

9.由于switch的限制,在某些特定情况也只能选择if else语句。如果根据浮点类型的变量或表达式来选择,就无法使用switch。在涉及变量的范围决定程序流时,依然由于switch的麻烦性,并不适合使用它。

10.在C语言中,一般不使用goto语句,大部分时候goto最适合用于从一组嵌套循环中跳出,,因为break只能跳出当前循环。

11.在判断语句中,如果要测试两个条件,应使用逻辑运算符把两个完整的测试表达式组合起来。

12.for循环当条件表达式不存在时,它被假设为真,由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。C 程序员偏向于使用 for(;;) 结构来表示一个无限循环。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值