注:本文是对苏小红版c语言教材第5章的笔记
- 机器语言是一种低级语言,而程序设计语言是一种高级语言
- 公式: 数据结构 + 算法 = 程序 仅对面向过程的语言成立
- 算法的基本特性:
- 有穷性
- 确定性
- 有效性
- 允许没有输入或一个/多个输入
- 必须有一个或多个输出
- n % 2 != 0 与 n % 2等价
if(a = b)当b != 0 时为真 - && 和 || 都具有“短路”特性:若表达式的值可以先有计算的左操作数的值单独计算出来,则将不再计算右操作数的值,这意味着某些操作数的值可能不会被计算
e.g.:
#include <stdio.h>
int main()
{
int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a<b);
printf("%d,%d\n",k,m);
return 0;
}
给k赋值的表达式中,n=b>a的值为1, 故右边的表达式不会被计算(即使a < b的值为1), 故m的值为0(不变)
6. 表达式1?表达式2:表达式3
表示若表达式1的值非0则执行表达式2, 否则执行表达式3
7. 多分枝控制
if(表达式1)语句1;
else if(表达式2)语句2;
else if(表达式3)语句3;
......
else if(表达式m)语句m;
else语句m + 1;
注意:条件语句只允许每个分支放置一条语句,故若一个分支有多条语句,应用{}扩起
- 浮点数与0的比较:
只能使用近似的方法
e.g.:
#include <math.h>
#define EPS 1e-3
...
if(fabs(a - b) < EPS)// 误差之内相等
- switch语句
switch (表达式)
{
case 常量1: 语句1;
//break;
case 常量2: 语句2;
//break;
...
case 常量n: 语句n;
//break;
default:
}
注意:1. 表达式只能是int型或char型
2. case本身没有条件判断的功能,如果没有break, 程序将依次执行下面的语句,直到遇到 } 为止
因此,若想用x X * 均表示乘法运算符,可以写成:
case *:
case x:
case X:
printf("...");
- 测试
白盒测试(结构测试):内部结构和流向已知, 尽量让测试数据覆盖每条语句,每个分支和每个判断条件,并减少重复覆盖
黑盒测试(功能测试):只检查程序功能是否符合功能说明
通常:选择有限的重要路径进行白盒测试,对重要的功能需求进行黑盒测试 - 编写判断条件时应从特殊到一般:
如应先判断是不是等边三角形,再判断是不是等腰三角形 - 对输入非法字符的检验和处理
检验scanf()返回值的方法
若scanf()调用成功,则其返回值为已成功读入的数据项数。
e.g.:
计算2个整数之和(排除异常输入的干扰)
#include <stdio.h>
int main()
{
int a, b, ret;
ret = scanf("%d %d", &a, &b);
if(ret != 2){
printf("error!");
fflush(stdin);//fflush()用于清除缓冲区中的内容,可能会带来可移植性的内容
}else{
printf("%d", a + b);
}
return 0;
}
- 字母可以参加计算
e.g.printf("%c", A + 32);
输出结果为a
但不能被当成数字读入
e.g.scanf(“%d, &a”);
输入a会出错 - 位运算:只能是char和int型
按位或:可用于清零
按位与:可用于置一
按位异或
按位取反
左移位:右边补0
右移位:
算数移位:x为有符号数时左边空位补符号位上的值
逻辑移位:x为无符号数时左边空位补0
左移n位相当于乘以2n,右移位相当于除以2n