1.printf打印函数
(1)%d 按照十进制整型数打印
(2)%6d 按照十进制整型数打印,至少 6 个字符宽
(3)%f 按照浮点数打印
(4)%6f 按照浮点数打印,至少 6 个字符宽
(5)%.2f 按照浮点数打印,小数点后有两位小数
(6)%6.2f 按照浮点数打印,至少 6 个字符宽,小数点后有两位小数
此外,printf 函数还支持下列格式说明:%o 表示八进制数;%x 表示十六进制数;%c
表示字符;%s 表示字符串;%%表示百分号(%)本身
2.自增与自减运算符只能作用于变量,类似于表达式(i+j)++是非法的。
3.什么是预编译,何时需要预编译?
(1)预编译又称为预处理,是做些代码文本的替换工作。
(2)总是使用不经常改动的大型代码体;程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将有包含文件预编译为一个预编译头。
4.布尔变量与零值比较
不可将布尔变量直接与 TRUE 、FALSE 或者 1 、0 进行比较。为根据布尔类型的语义,零值为“假” (记为 FALSE ) ,任何非零值都是“真” (记为TRUE ) 。TRUE 的值究竟是什么并没有统一的标准。例如 Visual C++ 将 将 TRUE 定义为1,而 Visual Basic 则将 TRUE 定义为-1 。
5.浮点变量与零值比较
无论是 float 是 还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“ == ”或“!= = ”与数字比较,应该设法转化成“ >= ”或“ <=”。
6.指针变量与零值比较
应当将指针变量用“ == ”或“!= = ”与 NULL比较。指针变量的零值是“空” (记为 NULL ) 。尽管 NULL 的值与0相同,但是两者意义不同。
7.循环效率
(1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数。
(2)如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
8.const 与 #define 的比较
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
9.函数接口的两个要素是参数和返回值。 C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer).C++ 语言中多了引用传递(pass by reference)。
注:如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该指针在函数体内被意外修改。
如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。
10.内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量, static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
11.指针与内存
(1)指针消亡了,并不表示它所指的内存会被自动释放。
(2)内存被释放了,并不表示指针会消亡或者成了 NULL 指针。
12.指针成为野指针
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为 NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。
例如 char *p = NULL;
char *str = (char *) malloc(100);
(2)指针 p 被 free 或者 delete 之后,没有置为 NULL,让人误以为 p 是个合法的指针。
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
class A
{
public:
void Func(void){ cout << “Func of class A” << endl; }
};
void Test(void)
{
A *p;
{
A a;
p = &a; // 注意 a 的生命期
}
p->Func(); // p 是“野指针”
}
函数 Test 在执行语句 p->Func()时,对象 a 已经消失,而 p 是指向 a 的,所以 p 就
成了“野指针”。
13.内存耗尽
(1)判断指针是否为 NULL,如果是则马上用 return 语句终止本函数。
(2)判断指针是否为 NULL,如果是则马上用 exit(1)终止整个程序的运行。