18.1.1~18.1.2
[TOC]
第四章:C程序控制
for循环语句
for循环语句的标准格式是:
for(表达式1; 表达式2; 表达式3)
语句
其中,表达式1用于对循环控制变量初始化,表达式2是循环继续条件,表达式3用于对循环控制变量进行增值;
很多情况下,表达式1和表达式3是用逗号运算符分隔的表达式组,组中各个表达式一次从左向右求值;
在for循环语句的初始化和增量部分,只编写与循环控制变量有关的表达式;
for循环语句的三个表达式可以选择省略,但分号
;需保留。
//计算存款利息
#include <stdio.h>
#include <math.h>
int main(void)
{
double principal=1000, amount, rate=0.05;
int year = 1;
printf("%4s%21s\n", "Year", "Amount on deposit"); //制表
for (; year <= 10; year++)
printf("%4d%21.2f\n", year, amount = principal * pow(1.0 + rate, year));
return 0;
}
-
double为双精度浮点数类型,变量比float更大,精度也更高; -
pow(x,y)函数能够求得x的y次幂,它接收两个double型实参,返回一个double型结果。使用pow函数前,需在源程序中包含头文件math.h; - 转换说明符
%21.2f表明这个变量占用的域宽为21,保留的精度为2; - 若显示出的数码个数小于域宽,将会自动向右对齐。在
%与域宽之间插入减号-能实现左对齐。
Switch多重选择语句
switch多重选择语句由一系列case从句和一个可选的default从句组成,每个case只能测试一个整型常量表达式。
#include <stdio.h>
int main(void)
{
int grade;
int aCount = 0;
int bCount = 0;
int cCount = 0;
while ((grade = getchar()) != EOF) {
switch (grade) {
case'A':
case'a':
++aCount;
break;
case'B':
case'b':
++bCount;
break;
case'C':
case'c':
++cCount;
break;
case'\n': //对换行或空白符处理
case'\t':
case' ':
break;
default:
printf("Incorrect letter. Enter a new letter/n");
break;
} //end switch
} //end while
printf("A:%d\n", aCount);
printf("B:%d\n", bCount);
printf("C:%d\n", cCount);
return 0;
}
-
getchar函数表示从键盘读入一个字符,类型为char的整数;除了使用getchar从键盘录入字符外,还可使用scanf_s,通过转换说明符%c来输入字符; -
EOF意为“End Of File”,为符号常量,windows中通过Ctrl + Z实现输入; - 每个case标签下可有多个操作语句而不需要使用花括号括起;
- 当每次只需要一个字符时,需要对输入流中的换行或其他空白符进行处理;
- 除了
int和char外,C语言中还有short(-32768 ~ +32768)、long(-2147483648 ~ +2147483648),int取值范围至少与short相当但不超出long,数据类型signed char可表示范围在-128 ~ +127之间的整数或计算机字符中的任意字符; - 字符常量用单引号
''括起来的特定字符表示。
do...while循环语句
执行do...while循环语句时,首先执行循环体,然后再进行循环条件的测试,因此,do...while循环语句的循环体至少被执行一次。应当使用花括号括起循环体,以避免与while循环语句的混淆。
//打印1到10
#include <stdio.h>
int main(void)
{
int counter = 1;
do {
printf("%d\n", counter);
} while (++counter <= 10);
return 0;
}
break和continue语句
- 在
while、for、do...while和switch语句中,执行break语句将导致程序立即从这些语句中退出,转去执行紧跟这些语句之后的下一条语句。 - 在
while、for、do..while循环结构中,执行continue语句会使控制流略过循环体中剩余语句,重新开始新一轮循环。在while和do...while循环结构中,执行continue语句后,将立即开始下一环节循环条件的测试;在for循环语句中,执行continue语句后,将立即开始下一轮环节的增量表达式,然后开始循环条件测试。 - 因此使用
continue语句时,while与for循环结构工作方式不同。
性能提示:对于结构化程序设计技术,适当使用
break与continue语句有助于程序运行速度更快。
逻辑运算符
- 逻辑与运算符
&&、逻辑或运算符||都是二元运算符,从左到右结合;逻辑非!是一元运算符,从右向左结合。 - 给出目前为止运算符优先级和结合律:
| 运算符 | 结合律 | 类型 | ||
|---|---|---|---|---|
++(后缀) --(后缀) |
从右向左 | 后缀类 | ||
+ - ! () ++(前缀) --(后缀) |
从右向左 | 一元类 | ||
* / %
|
从右向左 | 乘法类 | ||
+ -
|
从左向右 | 加减类 | ||
< <= > >=
|
从左向右 | 关系类 | ||
&& |
从左向右 | 逻辑与运算符 | ||
| ` | ` | 从左向右 | 逻辑或运算符 | |
!= ==
|
从左向右 | 相等类 | ||
?: |
从右向左 | 条件类 | ||
= += -= *= /= %=
|
从右向左 | 赋值类 | ||
, |
从左向右 | 逗号运算符 |
区分相等运算符==和赋值运算符=
在一常量一变量中使用相等运算符如 x == 7 时,习惯写为 7 == x ,即将常量写在左边,有助于避免运行时发生的逻辑错误。
错误预防提示:程序编写完成后,用文本搜索器检索程序中每一个
=,检查其是否使用正确。
