C语言系统化精讲(六):C语言选择结构和循环结构

文章目录

  • 一、C语言选择结构
    • 1.1 if语句
    • 1.2 if…else语句
    • 1.3 else if语句
    • 1.4 if语句的嵌套
    • 1.5 条件运算符
    • 1.6 switch语句的基本形式
    • 1.7 多路开关模式的switch语句
    • 1.8 if…else语句和switch语句的区别
  • 二、C语言循环结构
    • 2.1 C语言while循环和do while循环详解
      • 2.1.1 while循环
      • 2.1.2 do-while循环
    • 2.2 C语言for循环(for语句)详解
      • 2.2.1 基本使用
      • 2.2.2 for循环的变体
      • 2.2.3 for语句中的逗号应用
    • 2.3 C语言break和continue用法详解(跳出循环)
      • 2.3.1 break关键字
      • 2.3.2 continue语句
    • 2.4 C语言循环嵌套详解
    • 2.5 对C语言选择结构和循环结构的总结
      • 2.5.1 选择结构
      • 2.5.2 循环结构

C语言中有三大结构,分别是顺序结构、选择结构和循环结构:

  1. C语言顺序结构就是让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码
  2. C语言选择结构也称分支结构,就是让程序 拐弯 有选择性的执行代码;换句话说,可以跳过没用的代码,只执行有用的代码
  3. C语言循环结构就是让程序 杀个回马枪 不断地重复执行同一段代码。

顺序结构很好理解,无需多说,本文重点讲解选择结构和循环结构。

一、C语言选择结构

当我们是儿童时,父母就告诉我们记住这句 红灯停,绿灯行,黄灯等待,代表的含义是交通灯的状态,当交通灯是红色时,表示要停止,当为绿灯时,表示可以行走,当为黄灯时,需要等待。接下来用代码来模拟此时交通灯的状况,具体代码如下图所示:
在这里插入图片描述
从代码中可以看到,有紫色的 if 语句,蓝色的 else if 语句以及红色的 else 语句都是陌生的词汇,那么本文就为大家一一解释它们是什么意思。if 语句:即条件判断 if 语句。if 括号中的条件表达式结果为 ,就执行 if 下面大括号内语句。else if 语句:即条件判断 else if 语句。else if 括号中的条件表达式结果为 ,就执行 else if 下面大括号内的语句。else 语句:即条件判断 else 语句。当 ifelse if 语句的条件表达式结果都为 ,就执行 else 下面大括号的语句。以上只是简单的介绍了这三种条件判断语句的功能,接下来详细介绍条件控制语句。

1.1 if语句

if 语句通过对表达式进行判断,根据判断的结果决定是否进行相应的操作。例如下图所示,买彩票,如果中奖了,就买小汽车。
在这里插入图片描述
中奖的流程图如下图所示:
在这里插入图片描述
if 语句的一般形式为:

if(表达式)
语句;

if 语句的执行流程图如下图所示:
在这里插入图片描述
例如,下面的这行代码:

if(iNum)
//代码中判断变量iNum的值,如果变量iNum为真值,则执行后面的输入语句;如果变量的值为假,则不执行后面的输入语句
printf("这是真值");

在 if 语句的括号中,不仅可以判断一个变量的值是否为真,也可以判断表达式的结果是否为真,例如:

if(iSignal==1)
//判断变量iSignal==1的表达式,如果条件成立,那么判断的结果是真值,则执行后面的输出语句
//如果条件不成立,那么结果为假值,则不执行后面的输出语句
printf("当前信号灯的状态是:%d:",iSignal);

从上面这两行代码中可以看到 if 后面的执行部分只是调用了一条语句,如果是两条语句时怎么办呢?这时可以使用大括号将执行部分括住使之成为语句块,例如:

if (iSignal == 1) {
    printf("当前信号灯的状态是:%d:\n", iSignal);
    printf("车需要停止");
}

将执行的语句都放在大括号中,这样当 if 语句判断条件为真时,就可以全部执行。使用这种方式的好处是可以更规范、清楚地表达出 if 语句所包含语句的范围,所以建议大家使用 if 语句时都使用大括号将执行语句包括在内。

1.2 if…else语句

除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码。这在C语言中是利用 else 语句来完成的,例如:买彩票,如果中奖了,那就买轿车,否则就买自行车,如下图所示:
在这里插入图片描述
所对应的流程图如下图所示:
在这里插入图片描述
if…else 语句的一般形式为:

if(表达式){
   语句块1;
}else{
   语句块2;
}

if…else 语句的执行流程图如下图所示:
在这里插入图片描述
在 if 后的括号中判断表达式的结果,如果判断的结果为真值,则执行紧跟 if 后的语句块中的内容;如果判断的结果为假值,则执行 else 语句后的语句块内容。例如:

if (value) {
	printf("这个值为真");
} else {
	printf("这个值为假");
}

在上面的代码中,如果 if 判断变量 value 的值为真,则执行 if 后面的语句块进行输出。如果 if 判断的结果为假值,则执行 else 下面的语句块。

注意: 一个 else 语句必须跟在一个 if 语句的后面。

1.3 else if语句

利用 if 和 else 关键字的组合可以实现 else if 语句,这是对一系列互斥的条件进行检验。比如,某4S店进行大转轮抽奖活动,根据中奖的金额来获得不同类型的车,中奖的金额段之间是互斥的,每次抽奖结果都只能出现一个金额段,如下图所示:
在这里插入图片描述
要实现这个抽奖过程,就可以使用 else if 语句来实现。对应的流程图如下图所示:
在这里插入图片描述
else if 语句的一般形式如下:

if(表达式1){
    语句1;
  }else if(表达式2){
    语句2;
  }else if(表达式3){
    语句3;
  }else if(表达式m){
    语句m;
  }else{
    语句n;
  }

else if 语句的执行流程图如下图所示:
在这里插入图片描述
根据流程图可知,首先对 if 语句中的表达式1进行判断,如果结果为真值,则执行后面跟着的语句1,然后跳过 else if 语句和 else 语句;如果结果为假,那么判断 else if 语句中的表达式2。如果表达式2为真值,那么执行语句2而不会执行后面 else if 的判断或者 else 语句。当所有的判断都不成立,也就是都为假值时,执行 else 后的语句块。例如:

if(iSelection==1)
    {}
else if(iSelection==2)
    {}
else if(iSelection==3)
    {}
else
    {}

上述代码的含义是:

  1. 使用 if 语句判断变量 iSelection 的值是否为1,如果为1则执行后面语句块中的内容,然后跳过后面的 else if 语句判断和 else 语句的执行。
  2. 如果 iSelection 的值不为1,那么 else if 语句判断 iSelection 的值是否为2,如果值为2,则条件为真,执行后面紧跟着的语句块,执行完后跳过后面 else if 语句和 else 语句的操作。
  3. 如果 iSelection 的值也不为2,那么接下来的 else if 语句判断 iSelection 是否等于数值3,如果等于3,则执行后面语句块中的内容,否则执行 else 语句块中的内容。也就是说,当前面所有的判断都不成立(为假值)时,执行 else 语句块中的内容。

1.4 if语句的嵌套

嵌套可以理解为镶嵌、套用,例如我们熟悉的俄罗斯套娃,一层套着一层,这种做法叫做嵌套。那么,if 嵌套就是在 if 语句中可以包含一个或多个 if 语句。一般形式如下:

if(表达式1){
   if(表达式2){
     语句块1;
   }else{
     语句块2;
   }
} else{
  if(表达式3){
    语句块3;
  }
}

使用 if 语句嵌套的功能是对判断的条件进行细化,然后进行相应的操作。举例: 人们在生活中,每天早上醒来的时候想一下今天是星期几,如果是周末就是休息日,如果不是周末就要上班;同时,休息日可能是星期六或者是星期日,星期六就和朋友去逛街,星期日就陪家人在家。具体代码如下:

#include

int main() {

  int iDay;    //定义变量表示输入的星期几
  //定义变量代表一周中的每一天
  int Monday = 1, Tuesday = 2, Wednesday = 3, Thursday = 4,
      Friday = 5, Saturday = 6, Sunday = 7;
  printf("请选择星期几:\n");               //提示信息
  scanf("%d", &iDay);                       //输入星期
  if (iDay > Friday)                        //休息日的情况
  {
    if (iDay == Saturday)                 //为周六时
    {
      printf("和朋友去逛街\n");
    } else                                    //为周日时
    {
      printf("在家陪家人\n");
    }
  } else                                       //工作日的情况
  {
    if (iDay == Monday)                //为周一时
    {
      printf("开会\n");
    } else                          //为其他星期时
    {
      printf("工作\n");
    }
  }
  return 0;                        //程序结束
}

程序运行结果如下图所示:
在这里插入图片描述
整段代码表示了整个 if 语句嵌套的操作过程,首先判断为休息日的情况,然后根据判断的结果选择相应的具体判断或者操作。过程如下:

  1. if 语句判断表达式1就像判断今天是星期几,假设判断结果为真,则用 if 语句判断表达式2。
  2. 例如,判断出今天是休息日,然后去判断今天是不是周六;如果 if 语句判断 iDay==Saturday 为真,那么执行语句1。如果不为真,那么执行语句2。
  3. 例如,如果为星期六就陪朋友逛街,如果为星期日就陪家人在家。外面的 else 语句表示不为休息日时的相应操作。

1.5 条件运算符

自增、自减以及复合赋值运算符都是C语言提供的精简运算符,那条件选择也提供了一个精简的运算符――条件运算符(又称三目运算符)。条件运算符是将3个表达式连接在一起,组成的条件表达式。条件运算符的语法格式如下:

返回值=表达式1?表达式2:表达式3;

以上语句的含义是:先对表达式1的值进行检验,如果值为真,则返回值是表达式2的结果值,如果值为假,则返回值是表达式3的结果值。示例代码:

b=a>2?2:3;

这句语句运算过程如下图所示:
在这里插入图片描述
这句代码等价于:

if(a>2)
{
   b = 2;
}
else
{
   b = 3;
}

模拟条件运算符实现美团送餐情况,假设满足15元就免费配送,否则就要加上5元的配送费,实现代码如下:

#include

int main() {
  int food, fee;//定义变量存储餐费、总共费用
  printf("您的订单餐费是:\n");//提示信息
  scanf("%d", &food);//输入餐费
  fee = food >= 15 ? food : (food + 5);//利用三目运算符计算总共费用
  printf("您的订单共计%d元,请支付\n", fee);//输出总共费用
  return 0;//程序结束
}

程序运行结果如下图所示:
在这里插入图片描述

1.6 switch语句的基本形式

if 语句只有两个分支可供选择,而在实际问题中常需要用到多分支的选择。就像买衣服,可以有多种选择。当然,使用嵌套的 if 语句也可以采用多分支实现买衣服的选择,但是如果分支较多,就会使得嵌套的 if 语句层数较多,程序冗余并且可读性不好。在C语言中,可以使用 switch 语句直接处理像买衣服这种多分支选择的情况,提高程序代码的可读性。switch 语句是多分支选择语句,它的一般形式如下:

switch(表达式)
{
   case1:
       语句块1;
   case2:
       语句块2;case 值n:
       语句块n;
   default:
   		//default部分被省略后,当控制台输入的值与case语句后的值均不能匹配时,程序没有输出任何结果
       都不符合语句块;
}

switch 语句的程序流程如下图所示:
在这里插入图片描述
通过上图所示的流程图分析 switch 语句的一般形式。switch 语句后面括号中的表达式就是要进行判断的条件。在 switch 的语句块中,使用 case 关键字表示检验条件符合的各种情况,其后的语句是相应的操作,其中还有一个 default 关键字,作用是如果没有符合条件的情况,那么执行 default 后的默认情况语句。

说明:switch 语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而 case 语句检验的值必须是整型常量,也即可以是常量表达式或者常量运算。

通过如下代码来分析一下 switch 语句的使用方法:

#include

int main() {
  int selection = 1;
  switch (selection) {
    case 1:printf("选择矿泉水\n");
      break;
    case 2:printf("选择旺仔\n");
      break;
    case 3:printf("选择脉动\n");
      break;
    default:printf("输入错啦!\n");
      break;
  }
}

其中 switch 判断 selection 变量的值,利用 case 语句检验 selection 值的不同情况。假设 selection 的值为1,那么执行 case 为1时的情况,就会输出 选择矿泉水,执行后 break 跳出 switch 语句;假设 selection 的值为2,就会输出 选择旺仔,执行后 break 跳出 switch 语句;假设 selection 的值为3,就会输出 选择脉动,执行后 break 跳出 switch 语句;如果 selection 的值不是 case 中所检验列出的情况,那么执行 default 中的语句,就会输出 输入错啦!。在每一个 case 或 default 语句后都有一个 break 关键字。break 语句用于跳出 switch 结构,不再执行 switch 下面的代码。

注意: 在使用 switch 语句时,如果没有一个 case 语句后面的值能匹配 switch 语句的条件,就执行 default 语句后面的代码。其中任意两个 case 语句都不能使用相同的常量值;并且每一个 switch 结构只能有一个 default 语句,而且 default 可以省略。

在使用 switch 语句时,每一个 case 情况中都要使用 break 语句,break 语句使得执行完 case 语句后跳出 switch 语句。如果没有 break 语句,程序会将后面的内容都执行。例如下面代码,case 语句结束后不加 break,代码如下:

#include

int main() {
  int money = 0;
  printf("请查看口袋剩多少元钱?\n");
  scanf("%d", &money);
  switch (money) {
    case 7:printf("还剩%d元,吃米饭套餐\n", money);
      //没有break语句
    case 12:printf("还剩%d元,吃米线\n", money);
      //没有break语句
    case 40:printf("还剩%d元,吃披萨\n", money);
      //没有break语句
    default:printf("没钱了,你可别吃了!!!\n");
  }
}

程序运行结果如下图所示:
在这里插入图片描述
从上图可以看出,去掉 break 语句后,将 case 检验相符情况后的所有语句进行输出。因此,如果想要输出选择一种情况,break 语句在 case 语句中是不能缺少的。

1.7 多路开关模式的switch语句

在上一小节中,将 break 语句去掉之后,会将符合检验条件后的所有语句都输出。利用这个特点,可以设计多路开关模式的 switch 语句,它的形式如下:

switch(表达式)
{
  case 1:
    语句1;
    break;
  case 2:
  case 3:
    语句2;
    break;default:
    默认语句;
    break;
}

从形式中可以看到如果在 case 2 后不使用 break 语句,那么符合检验时与符合 case 3 检验时的效果是一样的。也就是说,使用多路开关模式,可以使多种检验条件用一个语句块输出。例如:在平年一年12个月,1、3、5、7、8、10、12月是31天,4、6、9、11月是30天,2月是28天,如果在控制台上任意输入月份,就可以知道这个月有多少天。具体代码如下:

#include
int main() {
  int month;
  printf("请输入月份:\n");
  scanf("%d", &month);
  switch (month) {
    //多路开关模式
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:printf("%d月有31天\n", month);
      break;
      //多路开关模式
    case 4:
    case 6:
    case 9:
    case 11:printf("%d月有30天\n", month);
      break;
    case 2:printf("%d月有28天\n", month);
      break;
    default:printf("输入错啦,没有这个月份\n");
  }
  return 0;//程序结束
}

程序运行结果如下图所示:
在这里插入图片描述

1.8 if…else语句和switch语句的区别

if…else 语句和 switch 语句都用于根据不同的情况检验条件作出相应的判断。两者的流程图分别如下图所示:
在这里插入图片描述
在这里插入图片描述
下面从两者的语法和效率的比较进行讲解两者区别:

  1. 语法的比较。 if 语句是配合 else 关键字进行使用的,而 switch 语句是配合 case 语句使用的;if 语句先对条件进行判断,而 switch 语句后进行判断,也就是判断符合 case 语句的情况。
  2. 效率的比较。 if…else 结构对开始少量的检验判断速度比较快,但是随着检验的增长会逐渐变慢,其中的默认情况是最慢的。使用 if else 结构可以判断表达式,但是不容易进行后续的添加扩充。switch 结构中,对其中每一项 case 检验的速度都是相同的,default 默认情况比其他情况都快。当判定的情况占少数时,if…else 结构比 switch 结构检验速度快。也就是说,如果分支在3个或者4个以下,用 if…else 结构比较好,否则选择 switch 结构。

二、C语言循环结构

公积金是国家机关、国有企业、城镇集体企业、外商投资企业、城镇私营企业及其他城镇企业、事业单位、民办非企业单位、社会团体(以下统称单位)及其在职职工缴存的长期住房储金。使用公积金买房贷款的利息点比商业贷款低很多,能够为买房者剩下很大一比钱,所以如果职员有公积金,都会选择使用公积金贷款买房。本示例就来模拟用公积金买房子,计算每个月需要月供的钱数,具体代码如下所示:
在这里插入图片描述
从代码中可以看到,有很多熟悉的单词,例如 double,scanf,printf 以及有很多运算符计算等,除此之外,还有就是红色框中的 for,接下来我们简单的了解一下。

  1. 三个 i 即循环语句的条件。第一个 i 是循环的初始值;第二个 i 是循环的长度;第三个 i 是改变 i 的值,让改变之后的值与第二个 i 进行比较。
  2. 大括号 {} 即循环语句块的 分割标志 循环的部分就是大括号 {} 里的语句块,也就是代码的 sum*=1.049 这句代码。

以上就是简单的介绍了 for 语句的使用情况,具体的 for 语句用法我们会在下面的小节详细讲解,当然除了 for 循环控制语句之外,还有其他的循环语句,接下来就来详解介绍每种循环语句的使用方法及对应的流程图。

2.1 C语言while循环和do while循环详解

2.1.1 while循环

while 循环的一般形式为:

while(表达式){
    语句块
}

意思是,先计算 表达式 的值,当值为 真(非0) 时, 执行 语句块; 执行完 语句块,再次计算表达式的值,如果为真,继续执行 语句块 …… 这个过程会一直重复,直到表达式的值为 假(0), 就退出循环,执行 while 后面的代码。while 语句执行的流程如下图所示:
在这里插入图片描述
我们通常将 表达式 称为循环条件,把 语句块 称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。

用 while 循环计算1加到100的值:

/*================================================================
*   Copyright (C) 2023 AmoXiang All rights reserved.
*   
*   文件名称:06-while.c
*   创 建 者:AmoXiang
*   创建日期:2023年10月16日 16:26:05
*   描    述:
*
================================================================*/


#include 
int main(){
    int sum = 0, i = 1;
    while(i<=100){
        sum += i;
        i++;
    }
    printf("1-100的和为:%d\n", sum);
}

程序运行结果如下图所示:
在这里插入图片描述
代码分析:

  1. 程序运行到 while 时,因为 i=1,i<=100 成立,所以会执行循环体;执行结束后 i 的值变为 2,sum 的值变为 1。
  2. 接下来会继续判断 i<=100 是否成立,因为此时 i=2,i<=100 成立,所以继续执行循环体;执行结束后 i 的值变为 3,sum 的值变为 3。
  3. 重复执行步骤 2。
  4. 当循环进行到第100次,i 的值变为 101,sum 的值变为5050;因为此时 i<=100 不再成立,所以就退出循环,不再执行循环体,转而执行 while 循环后面的代码。

while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。

如果循环条件中不包含变量,会发生什么情况呢?

循环条件成立时的话,while 循环会一直执行下去,永不结束,成为 死循环 例如:

/*================================================================
*   Copyright (C) 2023 AmoXiang All rights reserved.
*   
*   文件名称:07-while.c
*   创 建 者:AmoXiang
*   创建日期:2023年10月16日 16:33:07
*   描    述:
*
================================================================*/

#include 
int main(){
    while(1){
    	//运行程序,会不停地输出1,直到用户强制关闭。
        printf("1\n");   
    }
    return 0;
}

循环条件不成立的话,while 循环就一次也不会执行。例如:

#include 
int main(){
    while(0){
     	//运行程序,什么也不会输出
        printf("1\n");
    }
    return 0;
}

2.1.2 do-while循环

除了 while 循环,在C语言中还有一种 do-while 循环。do-while 循环的一般形式为:

do{
    语句块
}while(表达式);

do-while 循环与 while 循环的不同在于:它会先执行 语句块 然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次 语句块

示例:用 do-while 计算1加到100的值。

/*================================================================
*   Copyright (C) 2023 AmoXiang All rights reserved.
*   
*   文件名称:09-do-while.c
*   创 建 者:AmoXiang
*   创建日期:2023年10月16日 16:45:27
*   描    述:
*
================================================================*/


#include 
int main(){
    int i = 1, sum = 0;
    do{
        sum += i;
        i++;
    }while(i <= 100);
    printf("1-100的和为:%d\n", sum);
    return 0;    
}

程序运行结果如下图所示:
在这里插入图片描述
注意: 在使用 do…while 语句时,循环条件要放在 while 关键字后面的括号中,最后必须加上一个分号,这是许多初学者容易忘记的。
在这里插入图片描述
while 循环和 do-while 各有特点,大家可以适当选择,实际编程中使用 while 循环较多。

2.2 C语言for循环(for语句)详解

2.2.1 基本使用

除了 while 循环,C语言中还有 for 循环,它的使用更加灵活,完全可以取代 while 循环。

#include 
int main(){
    int i, sum=0;
    i = 1;  //语句①
    while(i<=100 /*语句②*/ ){
        sum+=i;
        i++;  //语句③
    }
    printf("%d\n",sum);
    return 0;
}

可以看到,语句①②③被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替,如下所示:

#include 
int main(){
    int i, sum=0;
    for(i=1/*语句①*/; i<=100/*语句②*/; i++/*语句③*/){
        sum+=i;
    }
    printf("%d\n",sum);
    return 0;
}

在 for 循环中,语句①②③被集中到了一起,代码结构一目了然。for 循环的一般形式为:

for(表达式1; 表达式2; 表达式3){
    语句块
}
//执行过程为:
//(1)先执行 表达式1
//(2)再执行 表达式2,如果它的值为真(非0),则执行循环体,否则结束循环
//(3) 执行完循环体后再执行 表达式3
//(4)重复执行步骤 (2) 和 (3),直到 表达式2 的值为假,就结束循环。

//上面的步骤中,(2) 和 (3) 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 (2) 和 (3)。

表达式1 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。表达式2 一般是一个关系表达式,决定了是否还要继续下次循环,称为 循环条件 表达式3 很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得 不成立 for 循环的执行过程可用下图表示:
在这里插入图片描述
我们再来分析一下 计算从1加到100的和 的代码:

#include 
int main(){
    int i, sum=0;
    for(i=1; i<=100; i++){
        sum+=i;
    }
    printf("%d\n",sum);
    return 0;
}

代码分析:

  1. 执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;因为此时 i=1,i<=100 成立,所以执行循环体。循环体执行结束后(sum 的值为1),再计算 i++。
  2. 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum 的值为3),再计算 i++。
  3. 重复执行步骤 2,直到第101次循环,此时 i 的值为101,i<=100 不成立,所以结束循环。

由此我们可以总结出 for 循环的一般形式:

for(初始化语句; 循环条件; 自增或自减){
    语句块
}

2.2.2 for循环的变体

通过 2.1 小节的学习可知 for 语句的一般形式中有3个表达式。在实际程序的编写过程中,对这3个表达式可以根据情况进行省略,接下来对不同情况进行讲解。

(1) for 语句中省略表达式1

for 语句中第一个表达式的作用是对循环变量设置初值。如果省略 for 语句中的表达式1,就需要在 for 语句之前给循环变量赋值。for 语句中省略表达式1的示例代码如下:
在这里插入图片描述
(2) for 语句中省略表达式2

如果表达式2省略,即不判断循环条件,则循环将无终止地进行下去,也即默认表达式2始终为真。例如:
在这里插入图片描述
(3) for 语句中省略表达式3

表达式3也可以省略。例如:

int number;
for(number=1; number<=20;) // 省略表达式3
{
	sum=sum+ number;
}

这段代码没有改变 number 变量值的代码,循环将会无终止的进行。如果想要程序循环能正常结束,就将代码改为如下形式:

int number;
for(number=1; number<=20;) // 省略表达式3
{
	sum=sum+ number;
    number++;
} //经过修改之后,循环就能正常运行

2.2.3 for语句中的逗号应用

在 for 语句中的表达式1和表达式3处,除了可以使用简单的表达式外,还可以使用逗号表达式。即包含一个以上的简单表达式,中间用逗号间隔。例如在表达式1处为变量 iCount 和 iSum 设置初始值,代码如下:

for(iSum=0,iCount=1; iCount<100; iCount++)
{
	iSum = iSum + iCount;
}

或者执行循环变量自加操作两次,代码如下:

for(iCount=1;iCount<100;iCount++,iCount++)
{
	iSum=iSum+iCount;
}

表达式1和表达式3都是逗号表达式,在逗号表达式内按照自左至右顺序求解,整个逗号表达式的值为其中最右边的表达式的值。例如:

for(iCount=1;iCount<100;iCount++,iCount++)
//就相当于:
for(iCount=1;iCount<100;iCount+=2)

2.3 C语言break和continue用法详解(跳出循环)

使用 while 或 for 循环时,如果想提前结束循环(在不满足结束条件的情况下结束循环),可以使用 break 或 continue 关键字。

2.3.1 break关键字

当 break 关键字用于 while、for 循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。使用 while 循环计算1加到100的值:

#include 
int main(){
    int i=1, sum=0;
    while(1){  //循环条件为死循环
        sum+=i;
        i++;
        if(i>100) break;
   }
    printf("%d\n", sum);
    return 0;
}

while 循环条件为 1,是一个死循环。当执行到第 100 次循环的时候,计算完 i++; 后 i 的值为 101,此时 if 语句的条件 i> 100 成立,执行 break; 语句,结束循环。在多层循环中,一个 break 语句只向外跳一层。例如,输出一个 4*4 的整数矩阵:

/*================================================================
*   Copyright (C) 2023 AmoXiang All rights reserved.
*   
*   文件名称:10-break.c
*   创 建 者:AmoXiang
*   创建日期:2023年10月16日 17:37:06
*   描    述:
*
================================================================*/

#include 
int main(){
    int i=1, j;
    while(1){  // 外层循环
        j=1;
        while(1){  // 内层循环
            printf("%-4d", i*j);
            j++;
            if(j>4) break;  //跳出内层循环
        }
        printf("\n");
        i++;
        if(i>4) break;  // 跳出外层循环
    }
    return 0;
}

程序运行结果如下图所示:
在这里插入图片描述
当 j>4 成立时,执行 break;,跳出内层循环;外层循环依然执行,直到 i>4 成立,跳出外层循环。内层循环共执行了4次,外层循环共执行了1次。

2.3.2 continue语句

continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue 语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。来看一个例子:

/*================================================================
*   Copyright (C) 2023 AmoXiang All rights reserved.
*   
*   文件名称:11-continue.c
*   创 建 者:AmoXiang
*   创建日期:2023年10月16日 17:41:13
*   描    述:
*
================================================================*/


#include 
int main(){
    char c = 0;
    while(c!='\n'){  //回车键结束循环
        c=getchar();
        if(c=='4' || c=='5'){  //按下的是数字键4或5
            continue;  //跳过当次循环,进入下次循环
        }
        putchar(c);
    }
    return 0;
}

程序运行结果如下图所示:
在这里插入图片描述
程序遇到 while 时,变量 c 的值为 '\0' 循环条件 c!='\n' 成立,开始第一次循环。getchar() 使程序暂停执行,等待用户输入,直到用户按下回车键才开始读取字符。

本例我们输入的是 0123456789,当读取到4或5时,if 的条件 c=='4'||c=='5' 成立,就执行 continue 语句,结束当前循环,直接进入下一次循环,也就是说 putchar(c); 不会被执行到。而读取到其他数字时,if 的条件不成立,continue 语句不会被执行到,putchar(c); 就会输出读取到的字符。break 与 continue 的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

2.4 C语言循环嵌套详解

在C语言中,if-else,while,do-while,for 都可以相互嵌套。所谓 嵌套(Nest), 就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,while 里面有 if-else,这都是允许的。

示例1:for 嵌套执行的流程。

#include 
int main()
{
    int i, j;
    for(i=1; i<=4; i++){  //外层for循环
        for(j=1; j<=4; j++){  //内层for循环
            printf("i=%d, j=%d\n", i, j);
        }
        printf("\n");
    }
    return 0;
}

本例是一个简单的 for 循环嵌套,外层循环和内层循环交叉执行,外层 for 每执行一次,内层 for 就要执行四次。在C语言中,代码是顺序、同步执行的,当前代码必须执行完毕后才能执行后面的代码。这就意味着,外层 for 每次循环时,都必须等待内层 for 循环完毕(也就是循环4次)才能进行下次循环。虽然 i 是变量,但是对于内层 for 来说,每次循环时它的值都是固定的。

示例2:输出一个4×4的整数矩阵。

#include 
int main()
{
    int i, j;
    for(i=1; i<=4; i++){  //外层for循环
        for(j=1; j<=4; j++){  //内层for循环
            printf("%-4d", i*j);
        }
        printf("\n");
    }
    return 0;
}

外层 for 第一次循环时,i为1,内层 for 要输出四次 1*j 的值,也就是第一行数据;内层 for 循环结束后执行 printf("\n") 输出换行符;接着执行外层 for 的 i++ 语句。此时外层 for 的第一次循环才算结束。外层 for 第二次循环时,i为2,内层 for 要输出四次 2*j 的值,也就是第二行的数据;接下来执行 printf("\n") 和 i++,外层 for 的第二次循环才算结束。外层 for 第三次、第四次循环以此类推。可以看到,内层 for 每循环一次输出一个数据,而外层 for 每循环一次输出一行数据。

示例3:输出九九乘法表。

#include 
int main(){
    int i, j;
    for(i=1; i<=9; i++){  //外层for循环
        for(j=1; j<=i; j++){  //内层for循环
            printf("%d*%d=%-2d  ", i, j, i*j);
        }
        printf("\n");
    }
    return 0;
}

和示例2一样,内层 for 每循环一次输出一条数据,外层 for 每循环一次输出一行数据。需要注意的是,内层 for 的结束条件是 j<=i。外层 for 每循环一次,i 的值就会变化,所以每次开始内层 for 循环时,结束条件是不一样的。具体如下:

当 i=1 时,内层 for 的结束条件为 j<=1,只能循环一次,输出第一行。
当 i=2 时,内层 for 的结束条件是 j<=2,循环两次,输出第二行。
当 i=3 时,内层 for 的结束条件是 j<=3,循环三次,输出第三行。
当 i=456... 时,以此类推。

2.5 对C语言选择结构和循环结构的总结

C语言中常用的编程结构有三种(其它编程语言也是如此),它们分别是:

  1. 顺序结构:代码从前往后依次执行,没有任何 拐弯抹角 不跳过任何一条语句,所有的语句都会被执行到。
  2. 选择结构:也叫分支结构。代码会被分成多个部分,程序会根据特定条件(某个表达式的运算结果)来判断到底执行哪一部分。
  3. 循环结构:程序会重新执行同一段代码,直到条件不再满足,或者遇到强行跳出语句(break 关键字)。

2.5.1 选择结构

选择结构(分支结构)涉及到的关键字包括 if,else,switch,case,break 还有一个条件运算符 ? : (这是C语言中唯一的一个三目运算符)。其中,if…else 是最基本的结构,switch…case 和 ? : 都是由 if…else 演化而来,它们都是为了让程序员书写更加方便。你可以只使用 if,也可以 if…else 配对使用。另外要善于使用 switch…case 和 ? :,有时候它们看起来更加清爽。if…else 可以嵌套使用,原则上嵌套的层次(深度)没有限制,但是过多的嵌套层次会让代码结构混乱。

2.5.2 循环结构

C语言中常用的循环结构有 while 循环和 for 循环,它们都可以用来处理同一个问题,一般可以互相代替。除了 while 和 for,C语言中还有一个 goto 语句,它也能构成循环结构。不过由于 goto 语句很容易造成代码混乱,维护和阅读困难,饱受诟病,不被推荐,而且 goto 循环完全可以被其他循环取代,所以后来的很多编程语言都取消了 goto 语句,这里笔者也不再进行讲解。

国内很多大学仍然讲解 goto 语句,但也仅仅是完成教材所设定的课程,goto 语句在实际开发中很难见到。对于 while 和 do-while 循环,循环体中应包括使循环趋于结束的语句。对于 while 和 do-while 循环,循环变量的初始化操作应该在 while 和 do-while 语句之前完成,而 for 循环可以在内部实现循环变量的初始化。for 循环是最常用的循环,它的功能强大,一般都可以代替其他循环。最后还要注意 break 和 continue 关键字用于循环结构时的区别:

break 用来跳出所有循环,循环语句不再有执行的机会;
continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。

此外,break 关键字还可以用于跳出 switch…case 语句。所谓 跳出 是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

至此今天的学习就到此结束了,笔者在这里声明,笔者写文章只是为了学习交流,以及让更多学习C语言的读者少走一些弯路,节省时间,并不用做其他用途,如有侵权,联系博主删除即可。感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

你可能感兴趣的:(C语言系统化精讲,c语言,开发语言)