2013.03.12
1.注释代码
#if 0
statements
#endif
注释效果要比要好
2.stdio.h头文件可以访问标准I/O库(Standard I/O Library),并且定义了EXIT_SUCCESS和EXIT_FAILURE符
号。
3.二维数组 a[3][4], a+1并不表示元素a01的地址,而是数组第二行的首地址,因为二维数组名是指向行的,而
非指向某个元素。
4.C++中,++运算和*运算具有相同的优先级,且方向是从右至左,所以*P++和 *(p++)作用是完全相同的。
5.typedef 允许为各种数据类型定义新名字。
e.g. typedef char *Ptr_to_char;
Ptr_to_char a; //声明a是指向字符的指针
6.const在指针中的应用
e.g. int const *pi
//一个指向整型常量的指针,地址可以改,内容不可以改。
int *const pi
//一个指向整型的常量指针,内容可以改,地址不可以改。
int const *const pi //一个指向整型常量的常量指针,两者都不能改。
7.判断表达式的长度并不需要对表达式进行求值
e.g.sizeof(a=b+1),此时并没有对a赋值
8.强制类型转换具有很高的优先级,把强制类型转换放在一个表达式中,只会改变第一个项目的类型,如果对
整 个表达式的结果进行强制类型转换,必须将表达式用括号括起来。
9."短路求值"---short-circuited evaluation
e.g. (1)(a>5)&&(a<10) 如果(a>5)为假,则不用判断后者
(2)条件操作符 express1?expression2:expression3 如果expression1 为真,取表达式2,而不用计算3
10.条件操作符:
e.g. b=a>5?3:20-->if(a>5) b=3; else b=20;
11.逗号操作符:整个逗号表达式的值是最后那个表达式的值。表达式①,②,③,④的值为④的值。
12.array[下标]=*(array+下标)
除了优先级以外,下标引用和间接访问完全相同。
13.布尔值:C并不具备显式的布尔类型,所以可以用整数来代替,规则是:零是假,任何非零值都是真。
如果一个变量用于表示布尔值,应该始终把它设置为0或1.
14.左值和右值:左值标识了一个可以存储结果值的地点,而右值指定了一个值。e.g.a=b+5正确,b+5=a错误。
变量可以作为左值,表达式也可以。
e.g.*pi可以当做左值和右值,此时左值指定需要进行修改的位置,右值提取当前存储于这个位置的值。
e.g.int a[30];
.....
a[b+10]=0; //表达式的左边是个表达式,但它是一个合法的左值,因为它标识了一个特定的位置。
15.int array[10];
表达式 2[array] 是合法的,=*(array+2)
16.数组参数的值是一个指针,下标引用实际上是对指针执行间接访问操作,在声明数组参数时不指定它的长度 是合法的,因为函数并不为数组元素分配内存。
17.数组名不用指针常量来表示的两种情况(自己也不是很明白,先放着吧,呵呵)
① 数组名作为sizeof的操作符 sizeof返回整个数组的长度,而不是指向数组的指针
② 数组名作为单目操作符&的操作数 此时产生的是一个指向数组的指针,而不是指向某个指针常量的指针
18.可变参数列表 通过stdarg宏来实现,该宏定义于stdarg.h头文件,声明了一个类型va_list 和三个宏 va_begin、va_arg、va_end。
19.指定位置设置为1 value=value | 1<<bit_number
指定位置清0 value=value & ~1<<bit_number
20.函数指针最常用的两个用途:把函数指针作为参数传递给函数(回调函数)以及用于转换表
转换表:例子
double add(double,double);
double sub(double,double);
double mul(double,double);
double div(double,double);
double (* func[])(double,double)={add,sub,mul,div};
21.树的遍历:前序遍历,中序遍历,后序遍历,层次遍历
其中前序遍历检查节点的值,然后递归的遍历左子树和右子树
中序遍历首选遍历左子树,然后检查节点的值,最后遍历右子树
后序遍历首先遍历左右子树,然后检查节点的值
层次遍历逐层检查树的节点,首先处理根节点,接着是它的孩子,再接着是孙子,依次类推。
根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问结点的操作发生在遍历其左右子树之后。