【C primer plus】C控制语句:循环

6.1 再探while循环

 1 //summing.c --根据用户键入的整数求和
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include <stdio.h>    
 4 int main(void)
 5 {
 6     long num;
 7     long sum = 0L;        //把sum初始化为0
 8     int status;
 9 
10     printf("Please enter an integer to be summed");
11     printf("(q to quit):");
12     status = scanf("%ld", &num);
13     while (status == 1) {
14         sum = sum + num;
15         printf("Please enter next integer (q to quit):");
16         status = scanf("%ld", &num);
17     }
18     printf("Those integers sum to %ld.\n", sum);
19 
20     return 0;
21 }
 
0

  6.1.1 程序注释

  ==运算符是C的相等运算符。
  如果scanf()转换值之前出了问题(例如,检测到文件结尾或遇到硬件问题),会返回一个特殊值EOF(其值通常被定义为-1),这个值也会引起循环停止。
  程序的结构如下:
把sum初始化为0
提示用户输入数据
读取用户输入的数据
当输入的数据为整数时,
输入添加给sum,
提示用户进行输入
然后读取下一个输入
输入完成后,打印sum的值
  这叫做伪代码,是一种用简单的句子表示程序思路的方法。
  while循环的标准格式(伪代码)
获得第一个用于测试的值
当测试为真时
处理值
获取下一个值

  6.1.2 C风格读取循环

  C的语法特性让你可以用下面的精简版本替换标准版本
当获取值和判断值都成功
处理该值
  6.2 while语句
while循环的通用形式如下:
while(expression)
    statement;
  statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
  每次循环都被称为一次迭代。
0

  6.2.1 终止while循环

  while循环有一点非常重要:在构建while循环时,必须让测试表达式的值有变化,表达式最终要为假。否则循环就不会终止。

  6.2.2 何时终止循环

  只有在对测试条件求值时,才决定是终止还是继续循环

  6.2.3 while:入口条件循环

  while循环是使用入口条件的有条件循环。所谓“有条件”指的是语句部分的执行取决于测试表达式的描述条件。测试表达式是一个入口条件,因为必须满足条件才能进入循环体。

  6.2.4语法要点

  只有在测试条件后面的单独语句(简单语句或复合语句)才是循环部分。
  即使while语句本身使用复合语句,在语句结构上,它也是一条单独的语句。该语句从while开始执行,到第一个分号结束。在使用了复合语句的情况下,到右花括号结束。
  单独的分号表示空语句,有时程序员会故意使用带空语句的while语句,因为所有任务都在测试条件中完成了。不需要在循环体中做什么。

6.3 用关系运算符和表达式比较大小

  while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式,出现在关系表达式中间的运算符叫做关系运算符。
 
0
  关系运算符常用于构造while语句和其他C语句中用到的关系表达式。这些语句都会检查关系表达式为真还是为假。
  虽然关系运算符也可用来比较浮点数,但是要注意:比较浮点数时候,尽量只使用<和>。因为浮点数的误差会导致在逻辑上应该相等的两数却不相等。使用fabs()函数可以方便的比较浮点数。该函数返回一个浮点值的绝对值(即,没有代数符号的值)

  6.3.1 什么是真

  表达式为真的值是1,表达式为假的值是0

  6.3.2 其他真值

  一般而言,所有的非零值都视为真,只有0被视为假。
  也可以说,只要测试条件的值为非零,就会执行while循环,这是从数值方面而不是从真/假方面来看测试条件。

  6.3.4 新的_Bool类型

  在编程中,表示真或假的变量被称为布尔变量,所以_Bool是C语言中布尔变量的类型名。_Bool类型的变量只能储存1或0,如果把其他非零数值赋给_Bool类型的变量,该变量会被设置为1,这反映了C把所有的非零值都视为真。
  C99提供了stdbool.h头文件,让bool称为_Bool的别名,而且还把true和false分别定义为1和0的符号常量,包含该头文件后,写出的代码可以与C++兼容。

  6.3.5 优先级和关系运算符

  关系运算符的优先级比算术运算符低,比赋值运算符高。
  关系运算符之间有两种不同的优先级:
  高优先级组:< <= > >=
  低优先级组:== !=
  与其他大多数运算符一样,关系运算符的结合律也是从左往右。

  6.4 不确定循环和计数循环

  不确定循环是指在测试表达式为假之前,预先不知道要执行多少次循环。还有一类是计数循环,这类循环在执行循环之前就知道要重复执行多少次。
  在创建一个重复执行固定次数的循环中涉及了三个行为:
  1.必须初始化计数器
  2.计数器与有限的值作比较
  3.每次循环时递增计数器

6.5 for循环

  for循环把上述3个行为(初始化、测试和更新)组合在一处。
  关键字for后面的圆括号中有3个表达式,分别用两个分号隔开。第一个表达式是初始化,只会在for循环开始时执行一次。第二个表达式是测试条件,在执行循环之前对表达式求值。如果表达式为假,循环结束。第三个表达式执行更新,在每次循环结束时求值。
  完整的for语句还包括后面的简单语句或复合语句。for圆括号中的表达式也叫做控制表达式,它们都是完整表达式。所以每个表达式的副作用都发生在下一个表达式求值之前。
 
0

  6.5.1 利用for的灵活性

  for的9种用法:
  可以使用递减运算符来递减计数器。
  可以让计数器递增2、10等
  可以用字符代替数字计数
  除了测试迭代次数外,还可以测试其他条件。
  可以让递增的量几何增长,也就是说,每次都乘上而不是加上一个固定的量
  第三个表达式可以使用任意合法的表达式。无论是什么表达式,每次迭代都会更新该表达式的值。
  可以省略一个或多个表达式(但是不能省略分号),只要在循环中包含能输循环的语句即可。
  第一个表达式不一定是给变量赋初值,也可以使用printf()。记住,在执行循环的其他部分之前,只对第一个表达式求值一次或执行一次。
  循环体中的行为可以改变循环头中的表达式。

6.6 其他赋值运算符:+=、-=、*=、/=、%=

  C有许多赋值运算符。最基本、最常用的是=,它把右侧表达式的值赋给左侧的变量。其他赋值运算符都用于更新变量,其用法都是左侧是一个变量名,右侧是一个表达式,赋给变量的新值是根据右侧表达式的值调整后的值。确切的调整方案取决于具体的运算符。
0
  以上提到的运算符与=的优先级相同。

6.7 逗号运算符

  逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。
  逗号运算符有两个性质,首先,它保证了被它分割的表达式从左往右求值(换言之,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生)。
  其次,整个逗号表达式的值是右侧项的值。
  逗号也可用作分隔符。

6.8 出口条件循环:do…while

  while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这保证了至少执行循环体中的内容一次。
  下面是do while循环的通用格式:
do
    statement;
while(expression);
  statement可以是一条简单语句或复合语句。
  do…while循环在执行完循环体后才执行测试条件,所以至少执行循环体一次;而for循环或while循环都是在执行循环体之前先执行测试条件。do…while循环适用于那些至少要迭代一次的循环。例如
do
{
提示用户输入密码
读取用户输入的密码
} while (用户输入的密码不等于密码)

6.9 如何选择循环

  首先,确定是需要入口条件循环还是出口条件循环。
  通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。
  一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于涉及索引计数的循环,用for循环更合适。

6.10 嵌套循环

  嵌套循环指在一个循环内包含另一个循环。嵌套循环常用于按行和列显示数据,也就是说,一个循环处理一行中的所有列,另一个循环处理所有的行。

6.11 数组简介

  数组是按顺序储存的一些列类型相同的值,整个数组有一个数组名,通过整数下标访问数组中单独的项或元素。例如
 1 float debts[20]; 
  声明debts是一个包含20个元素的数组,每个元素都可以储存float类型的值。数组的第一个元素使debts[0],第二个是debts[1],以此类推,直到debts[19]。注意,数组元素的编号从0开始,不是从1开始。
  可以给每个元素赋float类型的值。
  使用数组元素和使用同类型的变量一样。
  要注意,考虑到影响执行的速度,C编辑器不会检查数组的下标是否正确。当运行程序时,这会导致数据被放置在已被其他数据占用的地方,可能会破坏程序的结果甚至导致程序异常中断。
  数组的类型可以是任意数据类型。
  可以把字符串储存在char类型的数组中。如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串。
  用于识别数组元素的数字被称为下标、索引或偏移量,下标必须是整数而且要从0开始计数。数组的元素被依次储存在内存中相邻的位置。
posted @ 2023-06-23 17:31  永生辉皇  阅读(96)  评论(0)    收藏  举报