爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      第四节(基本程序控制)

      首页 知识中心 软件开发 文章详情页

      第四节(基本程序控制)

      2023-07-17 07:45:29 阅读次数:426

      C,循环,语句

      本次将介绍控制程序流的3种新方法。

      ●如何使用简单的数组

      ●如何使用for、while和do... while循环多次执行语句

      ●如何嵌套程序控制语句

      一.数组:基本概念:

      在开始学习for语句之前,应该先了解一下数组的基本概念。

      在C语言中,for语句和数组密切相关。为了帮助读者理解稍后for语句要用到的数组,这里先简要地介绍什么是数组。

      数组是一组带索引的数据存储位置,各位置的名称相同,以不同的下标或索引来区分。

      下标(也叫作索引)指的是数组变量名后面方括号中的数字。

      与其他C语言的变量类似,在使用数组之前必须先声明它。

      数组声明要包含数据类型和数组的大小(即,数组中元素的数量)。

      例如,下面这条语句声明了一个名为data的数组,其中可容纳1000个int类型的元素:

      int data[1000];

      通过下标区分每个元素,如data[0] 至data[999] 。

      注意,第1个元素是data[0],不是data[1] 。

      注意,可将索引视为偏移量。

      对于数组的第1个元素,偏移为0。

      对于第2个元素,需要偏移1个元素,因此索引是1。

      如上例所示,数组的每个元素都相当于一个普通的int类型变量,可以像使用int类型变量一样使用它们。

      数组的下标也可以是C变量,如下所示:

      intdata[1000];

      int index;

      index = 100;

      datalindex] = 12; /*与data[100] = 12等价*/

      至此,已经简要介绍完数组。了解这些基本知识后,应该能明白本次后面程序示例中是如何使用数组的。

      如果还不太清楚,别担心,后面还会将详细讲解数组的相关知识。

      注意:声明数组时,下标不要超过实际需要的元素数量,这样浪费内存。不要忘记,在C语言中,数组的第1个元素下标是0,不是1。

      二.控制程序的执行:

      C程序默认的执行顺序是自上而下。

      从main()函数的起始位置开始,逐条执行语句,直至main() 函数的末尾。

      然而,在实际的C程序中,很少严格按这样的顺序执行。

      C语言提供了各种程序控制语句,方便程序员控制程序的执行顺序。

      前面介绍了一种程序控制语句-if语句,接下来介绍另外3种有用的控制语句: .

      ●for语句;

      ●while语句;

      ●do...while语句。

      2.1 for语句:

      for语句是由一条或多条语句组成的块。

      for 语句有时也被称为for循环,因为程序会循环执行for语句多次。

      在前面的程序示例中使用过for语句。下面介绍for 语句是如何工作的。

      for语句的结构如下:

      for (初值部分;循环条件;更新部分)
      语句

      初值部分、循环条件和更新部分都是C语言的表达式。语句可以是C语言的任意语句。

      程序执行到for语句时,将按以下步骤进行。

      ​1.对初值部分求值。通常,初值部分是给变量设置特定值的赋值表达式。​​

      ​​2.对循环条件求值。通常,循环条件是关系表达式。​​

      ​​3.如果循环条件的求值结果为假(即,该表达式等于0 ),则for语句结束,并接着执行语句后面(即,跳过语句)的第1条语句。​​

      ​​4.如果循环条件的求值结果为真(即,该表达式等于非0 ),则执行for语句中的语句。​​

      ​​5.对更新部分求值。接着返回第2步继续执行。​

      下例图清楚地演示了执行for语句的过程。

      注意,如果第1次对循环条件求值为假,则直接结束for语句,完全不执行其中的语句。

      第四节(基本程序控制)

      下面程序中是一个简单的示例,用for语句打印数字1~20。

      你会发现,使用for语句的代码比使用20个printf()语句打印20个值的代码要紧凑得多。

      输入:

      //简单的for语句例子。

      #include<stdio.h>
      #define MAXCOUNT 20
      int count;

      int main(void)
      {
      //打印数字1-20

      for (count = 1; count <= MAXCOUNT; count++)
      printf("%d\n", count);

      return 0;
      }

      输出:

      第四节(基本程序控制)

      解析:

      如上所示程序演示了图片上面的流程从而跑起来程序;

      第3行是标准输入/输出头文件。
      第5行声明了一个int类型的变量count,将用于for循环。
      第11行和第12行是for循环。
      程序执行到for语句时,首先对初值部分求值。
      在本例中,初值部分是count = 1。
      必须先初始化count或为其赋值,才能在for 语句中使用它。
      接着对for语句中的循环条件(count <= 20 )求值。
      因为count被赋值为1 (count小于20 ),所以执行for语句中的printf()函数。
      执行完printf()函数后,对更新部分(count++ )求值,把count递增1,其值为2。
      现在,程序回到循环条件,并再次检查循环条件。
      如果循环条件为真,则再次执行printf(),然后把count递增1 (此时count 的值为3)。
      接着再次检查循环条件。这一过程将一直循环下去,直至循环条件的求值结果为假。
      当循环条件的求值结果为假时,程序将退出循环,并继续执行第14行。
      该行在结束程序之前返回0。

      for语句频繁用于“向上计数”,将计数器变量的值递增1成为另一个值,

      如上例所示。也可以用for语句来“向下计数”,将计数器变量递减1,如下所示:

      for (count = 100; count > 0; count--)

      递增量或递减量不一定是1,如下所示,每次循环把count递增5:

      for (count = 0; count < 1000; count += 5)

      for语句非常灵活。例如,如果程序前面已经初始化了待测试的变量或者已给待测试变量赋值,便可省略初值部分,

      如下所示。但是,不能省略初值部分后面的分号分隔符。

      count = 1;

      for ( ; count < 1000; count++)

      初值部分可以是任意有效的C表达式,只会在程序运行至for语句时被执行一次。

      如下代码所示,Now sorting the array...只会被打印一次:

      count = 1;

      for (printf ("Now sorting the array. . .") ; count < 1000; count++)

      /*排序语句已省略*/

      如果把更新的步骤放在for语句体中,更新部分也可以省略。

      例如,要打印数字0至99,可以这样写:

      for (count = 0; count < 100;)
      printf("&d",count++);

      用于判断是否终止循环的循环条件也可以是任意C表达式。

      只要它的求值结果为真(非零),for语句会一直执行下去。

      用C语言的逻辑运算符可以构建复杂的循环条件。

      例如,下面的for语句打印数组array[]中的元素,在打印完所有元素后或元素的值为0时,将停止打印:

      for (count = 0; count < 1000 && array[count] != 0; count++)
      printf("&d", array[count]);

      可以进一步简化该for循环,如下所示:

      for (count = 0; count < 1000 && array [count];)
      printf("&d", array [count++]) ;

      在for语句中可以使用空语句。记住,空语句指的是分号独占一行。

      如果要把数组中的1000个元素都赋值为50,可以这样写:

      for (count = 0; count < 1000; array[count++] = 50)
      ;

      该for语句把给数组中每个元素赋值50的操作放在更新部分。如果像下面这样写更好:

      for (count = 0; count < 1000; array[count++] = 50)
      {
      ;
      {

      将分号放在块中(即,花括号中),突出for语句体中不执行任何工作的意图。

      逗号运算符常用于for语句中。

      可以创建一个表达式,用逗号运算符分隔两个子表达式。

      按照从左至右的顺序,依次对两个子表达式被求值,整个表达式的值是右边子表达式的值。

      使用逗号运算符,可以让for语句的每个部分都完成多个任务。

      假设有两个各包含1000个元素的数组a[]和b[]。

      如果想把a[]中的内容倒序拷贝给b[] (即完成拷贝操作后,b[0] = a[999]、b[1] = a[998] ,以此类推),可以使用下面的for语句:

      for(i=0,j=999;i<1000;1++,j--)
      b[j] = a[i];

      逗号运算符分隔了两个子赋值表达式,分别将0和999赋值给变量i和j,然后在每次循环时分别递增两个变量。


      语法:for语句

      for (初值部分;循环条件;更新部分)
      语句;

      初值部分是任意有效的C表达式。通常是将变量设置为特定值的赋值表达式。

      循环条件是任意有效的C表达式。通常是关系表达式。

      循环条件的值为假(0)时,结束for语句,并执行语句后面的第1条语句;循环条件的值为真(非0 )时,执行语句中的C语句。

      更新部分是任意有效的C表达式。通常是递增或递减变量(已初始化的变量)的表达式。

      语句是任意的C语句,只要循环条件为真,就执行该部分的语句。

      for语句是一个循环语句。语句头包括初值部分、循环条件和更新部分。

      for语句首先执行初值部分,然后检查循环条件。

      如果循环条件为真,则执行语句。执行完语句后,对更新部分求值。

      然后,for语句再次检查循环条件,确认是否继续循环。

      示例1:

      // 打印0至9的值

      int x;

      for (x =0; x < 10; x++)
      printf("\nThe value of x is %d", x);

      示例2:

      //获取用户输入的数字,除非用户输入99

      int nbr = 0;

      for ( ; nbr != 99; )

      scanf( "%d", &nbr);

      示例3:

      //提示用户输入10个整型值

      //将用户输入的值储存在value数组中

      //如果用户输入的数是99,则停止循环

      int value[10];

      int ctr, nbr = 0;

      for (ctr = 0; ctr < 10 && nbr != 99; ctr++)

      {

      puts("Enter a number, 99 to quit ");

      scanf("%d", &nbr);

      value[ctr] = nbr;

      }

      2.2嵌套for语句:

      在一个for语句中执行另一个for语句,称为嵌套.

      利用嵌套的for语句,可以完成一些复杂的程序设计。下列程序中不是一个复杂的程序,但是它演示了如何嵌套for语句。

      输入:

      //嵌套for循环的程序示例

      #include <stdio.h>
      void print_ttable(int outer, int inner);

      int main()
      {
      int inner = 10;
      int outer = 10;

      printf("The times table:\n");
      print_ttable(outer, inner);
      return(0);
      }

      void print_ttable(int outer, int inner)
      {
      int a, b;
      for (a = 1; a <= outer; a++)
      {
      for (b = 1; b <= inner; b++)
      {
      printf("%d\t", a*b);
      }
      printf("\n");
      }
      return;
      }

      输出:

      第四节(基本程序控制)

      解析:

      此程序演示的是乘法表使用C语言和嵌套循环,可以轻松地将它们打印出来。
      最初先设置10X10的表,可以通过更改这些数字让乘法表更小或更大(循环的代码不会因此减少或增多)。
      因此,可以创建10X5或12X9的表,但是,如果数字太大,一行容纳的数字过多会影响布局的美观。
      现在先来分析程序的细节。

      在程序中
      第4行声明了print_ttable() 的函数原型。
      该函数需要两个int类型的变量outer和inner,储存乘法表显示的尺寸。
      第12行,在main()调用print_ttable()并传递outer变量和inner变量。
      对于print_ttable() 函数,有两点你可能不太明白。
      第一为什么要声明局部变量a和b?
      第二,为什么要在第25行再次使用printf()函数?
      仔细分析循环就会明白。

      第19行开始外层(第1个) for循环。
      循环开始时,将变量a赋值为1,因为a小于outer (outer 的值是10 ),所以程序继续执行到第21行。
      查看循环条件发现,在a大于outer 之前,将一直执行这个for循环。

      第21行是内层(第2个)for语句。
      这里要用到第2个局部变量b,同样为其赋值为1,并与传递给print_ttable() 函数的第2个变量inner作比较。
      因为b小于inner (inner 的值是10 ),所以程序执行到第23行,打印a*b的值和一个制表符(\t,告诉C编译器向后移一个制表单位)。
      在计算结果后面添加制表符,这样打印出的表格式比较美观(表格中的数字之间有一定的空白),如程序示例的输出所示。
      然后递增b,继续执行内层的for循环。
      当b的值递增为11时,内层循环结束。
      控制转到第25行,在屏幕上另起一行开始打印(printf() 函数的相关内容将在后面详细介绍)。
      然后,程序执行到外层for循环的末端,因此回到第19行对更新部分求值,此时a的值为2 (递增了1 )。
      然后对该行的循环条件求值,因为a仍小于outer,循环条件为真,所以转到执行第21行。
      注意,此时b的值被重新赋值为1。
      如果b还保留原来的值(11),b的值大于10,则该行的循环条件为假,就只会打印乘法表的第1行。

      其次;

      如果要使用带空语句的for语句,记得在for 语句后写上分号,或者让分号独占一行这样代码更加清晰。

      不要在for语句中处理太多任务。虽然可以使用逗号分隔符, 但是将一些功能放在函数体中,代码的可读性更高。

      2.3 while语句:

      while语句(也称为while循环)不断执行一个语句块,直至指定的循环条件为假。

      while 语句的格式如下:

      while (循环条件)
      语句

      循环条件是任意的C表达式,语句是任意有效的C语句。程序执行到while语句时,将进行以下过程。

      ​1.对循环条件求值。​​

      ​​2.如果循环条件为假(0 ),则结束while语句,程序将转至执行语句后面的第1条语句。​​

      ​​3.如果循环条件为真(非0 ),则执行语句中的C语句。​​

      ​​4.执行将返回第1步。​

      while语句的运行过程如图所示。

      第四节(基本程序控制)

      程序中使用了一个while语句打印1~20 ( 与使用for语句完成的任务相同)

      输入:

      //while 语句的简单示例

      #include <stdio.h>
      #define MAXCOUNT 20
      int count;

      int main(void)
      {
      //打印数字1-20

      count = 1;

      while (count <= MAXCOUNT)
      {
      printf("%d\n", count);
      count++;
      }
      return 0;
      }

      输出:

      第四节(基本程序控制)

      解析:

      该程序与for程序1完成的任务相同。
      第11行,把1赋值给count。
      因为while语句没有初始化变量或给变量赋值的部分,所以必须在while循环之前完成初始化或赋值工作。
      第13行是while语句,其中包含的循环条件(count <= 20 )与程序中for语句的循环条件相同。
      在while 循环中,第16行将count 递增1。
      如果遗漏了第16行会发生什么情况?
      此时,由于count始终为1(小于20 ),程序将一直循环下去不会停止。

      注意,while语句实际上是没有初值部分和循环条件的for语句,因此:

      for( ; 循环条件 ; )

      相当于

      while (循环条件)

      因此,在for 语句中完成的任何工作都能在while语句中完成。

      使用while语句时,必须在while语句前面完成必要的初始化或赋值工作,而且必须将更新变量值的部分放进while循环体中。

      注意:记得在while循环内部的代码块中改变循环条件的值,否则该循环将成为一个无限循环。

      如果需要初始化和更新变量,大部分经验丰富的C语言程序员都更倾向于使用for语句而不是while语句。

      这是基于源代码的可读性做出的选择。

      使用for语句时,初值部分、循环条件和更新部分都放在一起,便于阅读和修改;而使用while 语句,初始化部分和更新变量部分位于不同的地方,不方便查找。

      语法:while语句

      while (循环条件)
      语句

      循环条件是任意有效的C表达式,通常是一个关系表达式。

      循环条件的值为假(0 )时,结束while语句,并执行语句后面的第1条语句;

      循环条件的值为真(非0 )时,执行语句中的C语句。

      语句是任意的C语句,只要循环条件为真,就执行该部分的语句。

      while语句是一个循环语句。

      只要循环条件为真(非0),就重复执行语句块中的语句。

      如果循环条件为假,则完全不执行(一次也不执行)语句。

      示例1:

      int x = 0;

      while (x < 10)

      {

      printf("\nThe value of x is %d", x);

      x++;
      }

      示例2:

      //获取数字,直接输入的数字是99

      int nbr = 0;

      while (nbr <= 99)

      scanf("%d", &nbr);

      示例3:

      //提示用户输入10个整型值

      //将用户输入的值储存在value数组中

      //如果用户输入的数是99,则停止循环

      int value[10];

      int ctr = 0;

      int nbr;

      while (ctr < 10 && nbr != 99)

      {

      puts("Enter a number, 99 to quit ");

      scanf("%d", &nbr);

      value[ctr] = nbr;

      ctr++;

      }

      2.4嵌套while语句:

      与for语句和if语句类似,while语句也可以嵌套使用。

      下面程序是一个使用嵌套while语句的示例。虽然这不是使用while语句的最好示例,但是该例提供了一些新的思路。

      输入:

      //嵌套while语句示例

      #include <stdio.h>

      int array[5];

      int main(void)
      {
      int ctr = 0,
      nbr = 0;

      printf("This program prompts you to enter 5 numbers\n");
      printf("Each number should be form 1 to 10\n");

      while (ctr < 5)
      {
      nbr = 0;
      while (nbr < 1 || nbr > 10)
      {
      printf("\nEnter number %d of 5: ", ctr + 1);
      scanf("%d", &nbr);
      }

      array[ctr] = nbr;
      ctr++;
      }

      for (ctr = 0; ctr < 5; ctr++)
      printf("Value %d is %d\n", ctr + 1, array[ctr]);

      return 0;
      }

      输出:

      第四节(基本程序控制)

      解析:

      与前面的程序相同,
      第1行的注释描述了该程序的用途。
      第3行是#include指令,用于包含标准输入/输出头文件。
      第5行声明.个可储存5个整型值的数组array。main()函数中声明了两个局部变量ctr和nbr(第9行和第10行)。
      注意,这两个变量在声明的同时已初始化为0。另外,第9行将逗号运算符用作分隔符,这样便不用重复使用int关键字将nbr声明为int类型。
      许多C语言的程序员都习惯用这种方式来声明。第12行和第13行打印该程序的信息和提示用户输入数字。
      第15~ 26行是第1个(外层) while语句。
      第18 ~22行是嵌套的while语句,它也是外层while语句的一部分。
      如果ctr小于5 (第15行),就一直执行外层while循环。
      只要ctr小于5,第17行都将nbr设置为0,
      第18 ~22行(嵌套的while语句)提示用户输入一个数字,以获取nbr变量中的值。
      第24行将获取的数字放入array数组中,第25行把ctr 递增1。然后再次循环,回到第15行。
      因此,外层循环获取5个数字并放入array数组中,该数组以ctr作为索引。
      内层循环(第18 ~22行)很好地利用了while语句的特点,保证了用户输入的数字有效(该例中,只有数字1~10是有效的)才会继续执行程序中的语句。
      内层while语句的意思是,如果nbr小于1或大于10,就打印一条消息提示用户输入一个有效的数字,然后获取该数字。
      第28行和第29行打印储存在array数组中的值。
      注意,因为while语句中使用ctr变量来完成循环,所以for语句也可以复用该变量。
      ctr从0开始,每次循环递增1,for语句一共循环5次。打印ctr加1的值(因为count从0开始),并打印array数组中相应的值(索引为ctr )。
      另外,你可以改动程序中的两处,作为额外的练习。
      一处是程序接收的值,将1^ 10改成1 ~100;
      另一处是改变程序接收值的数量,该例只能接收5个数字,你可以尝试改成接收10个数字。

      2.5 do... while循环

      C语言提供的第3个循环是do...while循环,只要循环条件为真,便不断执行一个语句块。

      do. . .while循环在循环底部测试循环条件,而for循环和while循环则在循环的顶部进行测试。

      do.. .while循环的结构如下:

      do 
      语句
      while (循环条件);

      循环条件是任意的C表达式,语句是任意的C语句。

      当程序执行到do...while语句时,将进行以下步骤。

      ​1.执行语句中的语句。​​

      ​​2.对循环条件求值。如果结果为真,执行将回到第1步。如果结果为假,则结束循环。​

      do.. .while循环的执行过程如图所示。

      第四节(基本程序控制)

      do. . .while循环中的语句至少会被执行一次。

      这是因为do.. .while在底部测试循环条件,而非顶部。

      而for 循环和while循环都是在循环的顶部对循环条件求值,所以对于这两个循环,如果循环条件的结果为假,则完全不会执行循环体中的语句。

      do.. .while循环没有while循环和for循环使用频繁。

      只有在循环体中的语句要至少被执行一次,才会使用do...while循环。

      当然,如果能确保在第1次执行到while循环时,其循环条件为真,也可以在while循环中完成相同的任务。

      但是,使用do.. . while循环更加简单明了。

      下面程序中是do... while循环的示例。

      输入:

      // 简单的do ...while语句示例

      #include <stdio.h>

      int get_menu_choice(void);

      int main(void)
      {
      int choice;

      choice = get_menu_choice();

      printf("You chose Menu Option %d\n", choice);

      return 0;
      }

      int get_menu_choice(void)
      {
      int selection = 0;

      do
      {
      printf("\n");
      printf("\n1 - ADD a Record");
      printf("\n2 - Change a record");
      printf("\n3 - Delete a record");
      printf("\n4 - Quit");
      printf("\n");
      printf("\nEnter a selection: ");

      scanf("%d", &selection);

      } while (selection < 1 || selection > 4);

      return selection;
      }

      输出:

      第四节(基本程序控制)

      解析:

      该程序提供了一个带有4个选项的菜单,用户可以选择其中一个。
      然后,程序将打印用户选择的数字。
      现在,你应该能理解该程序清单中的大部分内容,
      在后面将会扩展这个程序。
      main()函数(第7~16行)中的内容在前面都介绍过。
      main()函数体中的代码(第9~ 13行)可写成一行,如下所示:

      printf( "You chose Menu option %d", get_menu_option() );

      如果你打算扩展该程序,并根据用户选择的选项执行相应的操作,就会用到get_menu_choice() 的返回值,
      因此将其赋给一个变量 (如本例中的chioce )是明智之举。

      第18^37行是get_menu_choice() 函数,该函数在屏幕上显示一个菜单(第24 30行),然后获取用户输入的选项。
      因为至少要在屏幕上显示一次菜单,用户才能据此输入选择的数字,所以在这种情况下使用do...while循环很合适。
      该程序会一直显示菜单,直至用户输入有效的选项。
      第34行 是do. . .while语句中的while部分,用于确保用户输入数字的有效性,因此将其使用的变量命名为selection很合适。
      如果用户输入的值不在1~4之间,将重复显示菜单,并提示用户输入新的值。
      当用户输入了有效的选项,程序将继续执行至第36行,返回selection变量的值。

      语法:do. .. while语句

      do 
      { 语句

      } while (循环条件);

      循环条件是任意有效的C表达式,通常是一个关系表达式。

      循环条件的值为假(0 )时,结束while语句,并执行while语句后面的第1条语句;

      循环条件的值为真(非0 )时,程序回到do部分,执行语句部分的C语句。

      语句是任意的C语句。

      程序首次执行到do... while循环.时,将执行语句,然后只要循环条件为真,就会再次执行该部do...while语句是一个循环语句。

      只要循环条件为真(非0 ),便会重复执行其中的语句或语句块。

      与while语句不同,do...while 语句至少要执行语句一次。

      示例1:

      //即使循环条件为假,也会打印一次!

      int x = 10;

      do

      {

      printf("\nThe value of x is %d, x);

      }while (x != 10);

      示例2:

      //获取用户键入的数字,除非用户输入的值大于99

      int nbr;

      do

      {

      scanf"%", &nbr );

      }while (nbr <= 99);

      示例3:

      //提示用户输入10个整型值

      //将用户输入的值储存在value数组中

      //如果用户输入的数是99,则停止循环

      int value[10];

      int ctr = 0;

      int nbr;

      do

      {

      puts("Enter a number, 99 to quit ");

      scanf("%d",&nbr);

      value[ctr] = nbr;

      ctr++;

      }while (ctr < 10 && nbr != 99);

      三.嵌套循环:

      嵌套循环指的是在一个循环中包含另一个循环。

      前面绍过一些嵌套语句。

      只要外层循环中包含完整的内部循环,C语言不允许重叠循环,除此之外对其没有其他限制。

      因此,下面的写法是不允许的:

      for ( count = 1; count < 100; count++)
      {
      do
      {
      //do...while循环
      } //循环结束
      }while (x != 0);

      如果将do. ..while循环完整地放入一个for循环中,就没问题:

      for ( count = 1; count < 100; count++)
      {
      do
      {
      //do...while循环
      }while (x != 0);
      } //循环结束

      在使用嵌套循环时要记住,改变内层循环可能会影响外层循环。

      尽管如此,还应注意到,内层循环也可能因为未使用外层循环中的变量而独立于外层循环。

      在上面的示例中,如果内层循环改动了count的值,就会影响外层for循环的执行。

      良好的代码缩进风格可提高嵌套循环的可读性。

      每一级循环应该相对于上一级循环进行缩进,让每一级循环的代码更加一目了然。

      四.本次总结:

      C语言提供3种循环语句控制程序的执行。

      它们分别是​​for语句、while语句和do.. .while语句。​​

      这3种循环都能据循环条件中某个变量的情况,执行一个语句块零次、一次或多次。

      许多程序设计任务都需要重复执行这些循环中的语句。

      虽然3种循环语句都能完成相同的工作,但是它们也各有不同。

      ​​for语句将初值部分、循环条件和更新部分都放在一行。​​

      ​​while语句在循环条件为真时,执行循环体中的语句。​​

      ​​do...while语句至少执行循环体中的语句一次,只要循环条件的求值结果为真,就不断执行循环体中的语句。​​

      嵌套循环是把一个循环放在另一个循环中。

      C语言不允许重叠嵌套,对嵌套循环没有其他限制。

      问答题

      1.如何选择程序控制语句?是选择for语句、while 语句还是do . . .while语句?

      如果你细心看完上诉的语法部分,会发现这3种循环都能解决循环问题,而且它们各有不同。

      如果需要在循环中初始化和更新变量时,用for语句最好。

      如果只知道要满足的循环条件,但是不知道需要循环多少次,while是最佳之选。

      如果希望一组语句至少被执行一次,那么最好使用do. ..while 语句。

      基本上这3种语句能处理绝大多数问题

      可以嵌套任意层。如果你的程序需要嵌套两层以上的循环,就应该考虑使用函数来代替。

      否则,你会发现花括号太多会影响阅读和理解,而函数能让代码简洁易读。

      2.是否可以嵌套不同的循环?

      可以嵌套if 、for 、 while 、do . ..while,或其他语句。你所写的许多程序都需要用到多个嵌套循环。

      3.数组中的第1个元素的索引值是多少?

      在C语言中第一个索引是0。

      4.for语句和while 语句有何不同?

      for语句包含初值部分和更新部分。

      5.while语句和do. . .while语句有何不同?

      do...while语句至少执行一次,其末尾是while语句。

      6. while语句能完成for语句完成的相同工作,这句话是否正确?

      正确,while语句可以完成for语句的工作。在执行while循环之前必须初始化变量,并在while循环中递增变量。

      7.嵌套语句的数量是否有限制?

      嵌套语句的数量没有限制。

      8.while语句是否可以嵌套在do . . . while语句中?

      可以的。

      9. for语句的4个部分是什么?

      初始化部分

      条件部分

      递增部分

      语句部分

      10.while语句的两个部分是什么?

      条件和语句。

      11.do​​. . .while 语句的两个部分是什么?

      也是条件和语句。

      实操题

      1.声明一个能容纳50个long类型值的数组。

      long array[50];

      2.写一条语句,将123.456赋值给练习题1数组的第50个元素。

      array[49] = 123.456;

      注意上面的答案,第50个元素的下标是49。注意数组的索引从0开始即可。

      3.下面的语句执行完毕后,x的值是多少?

      for (x=0; x<100,x++);

      x的值是100

      4.下面的语句执行完毕后,x的值是多少?

      for (ctr = 2; ctr<10; ctr += 3);

      语句执行完毕之后,ctr的值是11(ctr从2开始,每次递增3,直至大于或等于10为止)

      5.根据以下代码,将打印多少个x ?

      for(x = 0; x< . 10; x++)

      for (y= 5; y>0; y--)

      puts ("X");

      内层循环打印5个x,外层循环执行内层循环10次。因此总共打印50个x。

      6.编写一个for语句,从1~100,每次递增3。

      编写如下:

      int x;
      for( x = 1; x <= 100; x += 3);

      7.编写一个while语句,从1~100,每次递增3。

      编写如下:

      int x = 1;
      whlie( x <= 100 )
      x += 3;

      8.编写一个do. . .while语句,从1~100,每次递增3。

      编写如下:

      int ctr = 1;
      do
      {
      ctr += 3;
      } whlie( ctr < 100 );

      9.排错:以下代码段有哪些错误?

      record = 0;

      while (record< 100)
      {
      printf( "\nRecord %d ", record );
      printf( "\nGetting next number...");
      }

      该程序不会结束。

      record被初始化为0,然后while循环检查record是否小于100。因为0小于100,所以执行循环,打印出两条语句。

      然后循环再次检查条件,条件仍然成立(0小于100)因此再次循环。这一过程将不断重复。

      应该在循环体内递增record的值,即在第二次调用printf()函数后面加上下面的代码

      record++;

      10.排错:以下代码段有哪些错误?(MAXVALUES 不是错误!)

      for (counter = l; counter < MAXVALUES; counter++ );

      printf("\nCounter = %d", counter );

      在循环中,经常使用已定义的符号常量。改代码的问题是,for语句头的末尾不应该有分号。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/lyx888/5587748,作者:冷影玺,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:第一节(C语言基础)

      下一篇:Java执行Python脚本

      相关文章

      2025-05-14 10:03:13

      【Mybatis】-防止SQL注入

      【Mybatis】-防止SQL注入

      2025-05-14 10:03:13
      SQL , 执行 , 日志 , 注入 , 缓存 , 编译 , 语句
      2025-05-14 10:02:58

      30天拿下Rust之语法大全

      Rust作为一种系统编程语言,近年来在开发者社区中逐渐崭露头角。其独特的所有权系统和内存安全特性,使得Rust在高性能、并发编程领域具有显著优势。

      2025-05-14 10:02:58
      Rust , 代码 , 关键字 , 声明 , 循环 , 注释 , 类型
      2025-05-14 10:02:58

      30天拿下Rust之函数详解

      在Rust中,函数是程序的基本构建块,是代码复用的基本单位,用于封装一系列执行特定操作和计算的语句。函数是可重用的代码片段,可以接受输入参数并产生输出。通过合理使用函数,可以提高代码的可读性、可维护性和可重用性。

      2025-05-14 10:02:58
      Rust , 函数 , 参数 , 表达式 , 语句 , 返回 , 返回值
      2025-05-14 09:51:15

      python 判断for循环最后一次

      在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态(比如当前是第几次迭代)。但是,我们可以使用一些技巧来间接地实现这个需求。

      2025-05-14 09:51:15
      len , 对象 , 循环 , 迭代
      2025-05-14 09:51:15

      java循环创建对象内存溢出怎么解决

      在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError)。

      2025-05-14 09:51:15
      内存 , 占用 , 对象 , 引用 , 循环 , 次数 , 溢出
      2025-05-13 09:53:23

      一个python 程序执行顺序

      一个python 程序执行顺序

      2025-05-13 09:53:23
      Python , 代码 , 函数 , 循环 , 执行 , 语句
      2025-05-13 09:53:13

      mysql 存储函数及调用

      在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。

      2025-05-13 09:53:13
      MySQL , 函数 , 存储 , 示例 , 触发器 , 语句 , 调用
      2025-05-13 09:53:13

      计算机小白的成长历程——函数递归与迭代

      计算机小白的成长历程——函数递归与迭代

      2025-05-13 09:53:13
      函数 , 循环 , 编写 , 迭代 , 递归
      2025-05-13 09:50:59

      DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009

      DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009

      2025-05-13 09:50:59
      RMAN , 客户端 , 语句
      2025-05-13 09:50:48

      查找正在执行的select以及dml语句的相关信息

      查找正在执行的select以及dml语句的相关信息

      2025-05-13 09:50:48
      select , session , sql , SQL , 语句
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5248993

      查看更多

      最新文章

      30天拿下Rust之语法大全

      2025-05-14 10:02:58

      一个python 程序执行顺序

      2025-05-13 09:53:23

      DS初阶:循环队列的实现

      2025-05-08 09:04:49

      C语言-------冒泡排序,步步分解

      2025-05-08 09:03:07

      基础—SQL—DCL(数据控制语言)小结

      2025-05-07 09:09:52

      springboot系列教程(六):Jdbc与多数据源(含源码)

      2025-05-07 09:08:42

      查看更多

      热门文章

      C/C++ 动态解密释放ShellCode

      2023-06-19 06:57:29

      C Primer Plus 第6版 第4章 编程练习

      2023-05-11 06:05:48

      C#编程-29:循环访问目录树

      2023-03-16 08:39:34

      循环三要素 编程 230211

      2023-04-07 06:43:28

      蓝桥杯练习

      2023-05-16 09:42:24

      JavaScript-while 和 do while 如何选择

      2023-05-16 09:43:58

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      C语言三大结构和函数

      Python 分支语句详解:if-elif-else 与条件判断

      #yyds干货盘点# 为什么 Cpython 是 C 写的,而不是 Python

      【python基础(六)】循环结构:for遍历、while循环

      【Java核心基础】Java中foreach方法核心总结

      操作Ubuntu系统编写C程序的【写、读、删】操作

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号