C语言大学教程第8版第3章

C语言大学教程第8版第3章

Gitee仓库:https://gitee.com/CHNcfl/fc_C 知识点

1、任何计算机程序都可用仅用3种(具体7种)控制结构实现:顺序、选择、循环。

选择结构: 1)if单分支选择:当条件为真时,选择执行一个操作,否则跳过这个操作。 2)if...else双分支选择:当条件为真时,选择执行一个操作,否则执行另一个操作。 3)switch多分支选择:根据一个表达式的值,从多个不同的操作中选择一个执行。

循环结构: 1)while循环:当条件为真时,进入循环 2)do...while循环:先执行一个操作,再判断,当条件为真时,进入循环 3)for循环:

2、条件可以是表达式与表达式进行对比,因为最终比较的是值。例:if ((x + y) % 9 > 1 + y)

3、C语言中唯一的三元运算符:条件运算符( ?:),条件 ?为真 :为假。需要的3个操作数和条件运算符共同构成了一个条件表达式。条件运算符的功能比 if...else 语句更强。         以下三种语句达到的效果相同。条件运算符的第二个和第三个操作数要使用类型相同的表达式,否则可能会出现微妙的错误。

1、if (grade >= 60) {puts("通过!");} else {puts("未通过!");}2、puts( grade >= 60 ? "通过!" : "未通过!");3、grade >= 60 ? puts("通过!") : puts("未通过!");

4、if 语句的语句体中只能有一条语句。         如果语句体中仅有一条语句,就不必用一对花括号来封装这条语句。当语句体包含多条语句时,就必须用一对花括号将这些语句封装在一起。         包含在一对花括号内的一组语句,被称为复合语句或一个语句块。复合语句在语法上等同于一个语句。在程序中可以放置单个语句的任何地方,可以放置一个复合语句,或放置一个空语句(在可以放置单个语句的地方只写上一个分号( ;))。

5、if...else 有两种代码风格:                 从C编译器的角度看,这两种形式是完全等价的。程序员更喜欢用右侧这种风格,原因是它避免了因多级缩进造成的代码向右偏移,代码向右偏移使得在一行中能够编写代码的空间变少,进而导致不必要的语句拆分,降低程序的可读性。

6、while循环有两种方式控制循环:计数控制循环,标记控制循环。

计数控制:必须设置一个名为计数器(Counter)的变量counter来规定循环体将要执行的次数。         因为在循环开始前,循环的次数就是已知的,又被称为确定性循环。         由于浮点数是一个近似值,所以用浮点数来控制计数循环可能会产生一个不精确的计数值,进而导致循环终止条件判断错误。

标记控制:需要设置一个标记值(信号值 / 哑元值 / 标志值),程序判定接收到的数据是标记值后,跳出循环。         因为循环次数未知,又被称为非确定性循环。标记值不应与合理的输入值相混淆,否则程序将无法判断数据是否输入结束。         满足以下两个条件之一时即可使用标记控制循环:1、循环次数未知。2、每次循环都包含输入数据的语句。

7、涉及到除法(取余)操作时,要注意除数是否为0!!!当发现除数为0时,要在程序中进行适当的处理(如打印一条出错信息)。

8、average = (float)total / counter;         两个整数相除,计算机将进行整数除法,如果运算结果是小数,小数部分将被截断,打印出来的结果只显示整数部分。由于先执行除法运算,再执行赋值运算,所以在将除法结果赋值给变量之前,结果的小数部分就已经丢失了。         为了使整数相除能得到小数结果,必须把整型操作数临时转换成浮点数,这就要用到强制类型转换运算符(float),该运算符为它的操作数 total 创建了一个浮点数据类型的临时副本,此时变量 total 中保存的仍然是整数。这时,除法运算就变成了一个浮点数( total 的浮点数据类型的临时副本)除以存储在变量 counter 中的一个 unsigned int 类型的整数。这种使用强制类型转换运算符来实现类型转换的方式称为显式的类型转换(可直接看出来哪个操作数被转换类型了)。         C语言要求参与算术运算的所有操作数的数据类型必须一致,所以编译器在对源程序进行编译时,将对算术表达式中的个别操作数进行隐式的类型转换操作。例如,对一个包含 float 和 int 类型数据的算术表达式,编译器将为所有的 int 类型数据生成副本,并将副本转换为 float 类型数据,这样最终执行的运算就是浮点数运算,运算结果就是浮点数类型。

9、转换说明符%.2f表示打印一个精度为2(精确到小数点后2位)的浮点数。若采用%f作为转换说明符(即不规定精度),则默认精确到小数点后6位(相当于使用转换说明符%.6f)。当按照指定精度打印浮点数时,打印的数值将是小数部分四舍五入的,而存储在变量中的浮点数值是不变的。         只有在 printf 函数的格式转换说明符中才能规定精度,在 scanf 函数的格式控制串的转换说明符中规定精度是错误的。         scanf 函数读取一个浮点数时,如果整数位是0,可以省略不写。

printf("%f ", 3.14159); // 3.141590printf("%.1f ", 3.14159); // 3.1printf("%.2f ", 3.14159); // 3.14printf("%.3f ", 3.14159); // 3.142printf("%.4f ", 3.14159); // 3.1416printf("%s", "输入a值:");scanf("%f", &a); // 输入a值:.1234

10、因为计算机为一个数据分配的存储空间是定长的,所以浮点数并不总是百分百精确的,在绝大多数计算机中,浮点数只是它们数学上表示数据的近似值。期望用浮点数来精确地表示一个数据,往往会得到一个错误的结果。所以不要试图去比较两个浮点数是否相等。

11、输出一个 unsigned int 类型的数据时,要使用转换说明符%u。

12、二元运算符加一个赋值运算符( = ):+=、-=、*=、/=、%=,等,其功能是:将运算符右边表达式的值与运算符左边变量的值进行运算,结果保存在运算符左边的变量中。

13、自增自减运算符:++,--。该运算符的操作数只能是一个简单变量名。 ++a:将a值加1,在含有a的表达式中,使用a的新值进行计算。 a++:在含有a的表达式中,使用a的当前值进行计算,然后将a值加1。         在一个只包含一个变量的语句中,变量的先增或后增,对结果无影响。当变量出现在一个表达式中时,先增或后增才会有不同的执行结果。

良好编程习惯

1、即便语句体中仅包含单个语句,也建议用一对花括号将语句体封装起来,这可以解决“悬挂else问题”。

2、一个没有初始化的变量包含有“垃圾”值:分配给变量的内存单元中的旧值。要初始化所有的计数器变量和总和变量(3.8.c),否则,程序运行结果可能是错误的。

3、使用标记控制的循环时,在请求输入的显示中应显式的提醒用户什么是标记值!!!

4、在一个表达式中,建议只有一个变量使用自增自减运算符。

5、嵌套层次过多会造成理解困难,建议嵌套层数不超过3层。

安全C程序设计

1、3.9.c中,也可以用 unsigned int 来


比丘资源网 » C语言大学教程第8版第3章

发表回复

提供最优质的资源集合

立即查看 了解详情