目录

1. while语句

2. do-while语句

3. for语句

4. 逗号运算符

5. break语句

6. continue语句

7. goto语句

8. 空语句


1. while语句

while (表达式) 语句

① while语句可能根本不执行循环体

② 正常终止循环时,表达式的值为假,在循环终止时检测表达式的值,可判断循环是正常终止还是提前被其他语句终止(极其常用)

③ 此处的语句为一条语句,可使用复合语句

④ 用while 语句构造无限循环形式如下,

while (1) ...

除非循环中含有跳出循环控制的语句(break、goto、continue)或者调用了导致程序终止的函数,否则上述形式的while 语句将永远执行下去

说明:举例说明一个问题

对用户输入的数列求和,数列以0结尾(仅列出程序主体)

scanf("%d", &n);
while (n != 0)
{sum += n;scanf("%d", &n);
}

程序中用到两个完全一样的scanf函数调用,在使用while循环时往往很难避免这种现象

原因分析:由于while语句是在执行循环体之前检查循环控制表达式(controlling expression)的值,所以需要为第一次判断提供依据

改进:对于至少会执行一次的循环,可以改为do-while结构

2. do-while语句

do 语句 while (表达式); //千万不要忘记这个分号

① 至少执行一次循环体(do语句使用场景的最大特征)

② 此处语句为一条语句,可使用复合语句

3. for语句

for (表达式1; 表达式2; 表达式3) 语句

① for语句极其适合应用在使用计数变量的循环中

② 除极少数情况,for 语句可以转化为while语句,上述for语句可以转化为,

表达式1;
while (表达式2)
{语句 // 当语句中含有continue时不能转化//因为continue不能越过for语句中的表达式3表达式3;
}

③ 可省略for语句中任意或全部表达式,其中,如果省略表达式2则默认为真。for语句形式的无限循环为,

for (;;) ...

④ for语句习惯用法(关键是防止少循环一次)

// 从0向上加到n - 1
for (i = 0; i < n; ++i)// 从1向上加到n
for (i = 1; i <= n; ++i)// 从n - 1向下减到0
for (i = n - 1; i >= 0; --i)// 从n向下减到1
for (i = n; i > 0; --i)

说明1:C99中,for语句的第一个表达式可以替换为一个声明

for (int i = 0; i < n; ++i)

① 变量i 仅可见于for 语句内,如果想在for循环退出之后还使用该变量(常见现象),则只能在for 语句之前声明

② 可以声明多个变量,只要他们类型相同,关键在于必须是一个表达式!!!

for (int i = 0, j = 0; j < n; ++i)

说明2:for循环中更新的变量不要定义成浮点数,因为float型和double型不能保证可以精确存储一个数

说明3:如何选择合适的循环结构

关键:根据应用场景选择

① 如果要用循环结构访问某个数据序列,例如数组,应该优先选择for语句。因为for语句定义了明确的索引值,可以方便地对数据序列进行访问

② 如果要根据某个条件循环往复地多次完成某件事情,应该选择while语句或do-while语句。而do-while语句又特别适用于至少执行一次的循环

4. 逗号运算符

表达式1, 表达式2

① 特征

逗号运算符是优先级最低的运算符

② 求值顺序

计算表达式1并扔掉计算出的值,再计算表达式2,把这个值作为整个表达式的值(同时注意混合类型)

③ 作用

在C语言要求只能有一个表达式的情况下可以使用两个或多个表达式,比如for语句中的表达式,

for (i = 0, j = 0; i + j < 3; ++i, ++j)

说明1:逗号运算符的应用场景类似于复合语句

① 复合语句:在只能使用一条语句时使用多条语句

② 逗号表达式:在只能使用一个表达式的地方使用多个表达式

说明2:一般而言,表达式1应该始终有副作用,不然表达式1就没有存在的意义了

再进一步,什么运算符有副作用呢? 赋值运算符 / 自增运算符 / 自减运算符有副作用

说明3:关于计算顺序的示例

i = 1,j = 2,k = i + j;

在这个表达式中,我们也在一处修改了i 的值,在另一处访问了i 的值,但逗号是一个顺序点,可以保证计算有序进行

关于顺序点的内容,可参考如下笔记,

http://note.youdao.com/noteshare?id=21d46445bbaa2f0ca28de06d1adad1a8&sub=8B7497E4B390423487599F0130EAC04D

5. break语句

① 作用

a. 跳出switch语句

b. 跳出循环语句

② 注意

break只能从最内层的switch、do、for或while 中跳出,即只能跳出一层循环

6. continue语句

while (i > 0)
{break;/continue;...// 剩余语句
① } ②

①:continue跳转处,continue跳转到循环体末尾之前

②:break跳转处,break跳转到循环体末尾之后

说明1:continue语句只能用于循环

说明2:break和continue语句的使用场景

① break语句通常应用在那些没有确切的循环终点(例如不知道到底需要统计多少个数据,循环终点是根据用户输入而定的)的循环场景中,他与条件结构结合,从而实现在某些特定的条件下结束整个循环

break语句也可以用于出错处理

② continue语句更多地表现为对数据序列中数据的筛选。continue语句与条件结构结合,可以对数据序列中的数据进行挑选,只访问符合条件的数据而略过不符合条件的数据

7. goto语句

goto 标识符;标识符: 语句 // 该语句必须和goto语句在同一函数中

① 标识符不能单独存在,后面必须有语句,可以是空语句

比如要在复合语句的末尾放置标号,标号不能独立存在,后面必须有语句,此时就可以使用空语句

{...goto end_of_stmt;...end_of_stmt: ; // 空语句
}

② 使用场景

a. 跳出循环内嵌的switch语句

b. 跳出嵌套的循环

c. Linux驱动中错误处理(个人观点)

③ 使用限制:不能跳出函数

int func_a(void)
{int a = 1;++a;goto tag;return a;
}int func_b(void)
{int b = 1;
tag:++b;return b;
}int main(void)
{func_a();return 0;
}

上述代码在编译时就会报错,可见goto标识符只能限定在函数内部

C99新增限制:goto语句不能用于绕过变长数组的声明

说明:break、continue、return本质上都是受限的goto语句

8. 空语句

① 空语句一般单独放置一行,以防混淆

② 空语句造成的陷阱

if (d == 0) ;printf; // 该语句总是会被执行i = 10;
while (i > 0) ; // 构成无限循环
{}for (i = 10; i > 0; --i) ; // 导致只执行一次printfprintf;

C程序设计语言现代方法06:循环相关推荐

  1. C程序设计语言现代方法18:声明

    目录 1. 声明的语法 2. 变量的性质 2.1 变量性质的构成 2.2 变量默认性质 2.3 修改变量默认性质 2.3.1 修改局部变量默认性质 2.3.2 修改全局变量默认性质 2.4 exter ...

  2. C程序设计语言现代方法13:字符串

    目录 1. 字符串字面量 1.1 定义 1.2 字符串字面量包含转义序列 1.3 延续字符串字面量 1.3.1 使用续行符 1.3.2 仅用空白字符分割字符串字面量 1.4 存储字符串字面量 1.5 ...

  3. C程序设计语言现代方法12:指针和数组

    目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...

  4. C程序设计语言现代方法08:数组

    目录 1. C语言中的变量 2. 一维数组 2.1 数组的声明 2.2 数组初始化 2.3 对数组使用sizeof运算符 3. 多维数组 4. 常量数组 4. C语言数组类型 4.1 数组类型 4.2 ...

  5. C程序设计语言现代方法05:选择语句

    目录 1. C语言语句分类 2. 逻辑表达式 2.1 == 与 = 2.2 &&和||的短路特性 2.3 不要将==用于浮点数判断 3. if语句 4. 条件表达式 5. switch ...

  6. C程序设计语言现代方法17:指针的高级应用

    目录 1. 动态存储分配 1.1 malloc函数 1.2 calloc函数 1.3 realloc函数 1.4 free函数 2. 空指针NULL解析 2.1 NULL的定义形式 2.2 程序如何知 ...

  7. C程序设计语言现代方法15:编写大型程序

    目录 1. C语言程序一般构成 2. 源文件 2.1 源文件内容 2.2 将文件划分成多个源文件的优点 3. 头文件 3.1 包含头文件的3种方式 3.2 头文件共享内容 3.2.1 宏定义和类型定义 ...

  8. C程序设计语言现代方法14:预处理器

    目录 1. 预处理器工作原理 1.1 预处理器性质 1.2 预处理器主要功能 1.3 GCC编译过程及常用选项 1.3.1 GCC编译过程 1.3.2 编译选项实例 1.4 注意事项 2. 预处理指令 ...

  9. C程序设计语言现代方法09:函数

    目录 1. 函数的定义和调用 1.1 函数定义格式 1.2 函数调用 2. 函数声明 2.1 实际参数的类型转换 2.1.1 编译器在调用前遇到函数原型 2.1.2 编译器在调用前没有遇到函数原型 2 ...

最新文章

  1. 成功从小公司跳槽!35岁的程序员被裁
  2. BOOST_SCOPE_EXIT宏相关的测试程序
  3. mysql数据库自动重新连接_mysql数据库自动重新连接
  4. SQL Server中的计算列概述
  5. “Internet Explorer无法打开站点,已终止操作”解决
  6. jquery事件绑定与事件委托
  7. docker tag 镜像id_手摸手带你 Docker 从入门到实践
  8. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):常用技术概览
  9. Django——09.spaceless, autescape, verbatim标签
  10. python作业-12
  11. 子平真诠释疑笔记(四)
  12. Math:泰勒(Taylor)公式
  13. 【十八掌●武功篇】第七掌:MapReduce之倒排索引
  14. SQL server不能用IP登录
  15. vue+elemenUI项目,仿照京东商城,完成电商网站的订单中心
  16. 3D Game Programming Design:UI系统--Quest Log 公告牌
  17. python逐行写入文件_Python文件逐行写入
  18. 移动安全-adb使用和提取apk文件
  19. CC2014中国互联网版权保护行动计划启动
  20. vc复制指定文件夹以及文件夹内的内容

热门文章

  1. android 启动多个进程,Android开启多进程
  2. matlab斜杠报错,java调用matlab 时出现java.lang.NullPointerException错误
  3. Maven 本地仓库访问私服
  4. php mysql帮助类,基于PHP的MYSQL操作类
  5. 实例手册_平法钢筋算不清?钢筋工程量清单编制与应用手册,海量实例看就懂...
  6. electron 打开调试_构建基于 iOS 模拟器的前端调试方案
  7. java内部类的作用_java 内部类的好处和缺点(上)
  8. 韩语在线翻译图片识别_一键截图识别屏幕文字,支持实时翻译还能朗读
  9. eclipse添加maven配置
  10. eclipse修改git账号信息