1、位操作符:对两个操作数按位操作。
!和~是不同的。
2、布尔表达式:一旦得出结果就停止计算。
对experssion1 && experssion2和experssion3 || experssion4来说,如果exp1为0则exp2不会被计算。同样,如果exp3为1,exp4也不会被计算。
3、赋值表达式:返回值就是操作符左边的表达式的值。
printf("%d/n",x=999)的打印结果是999
4、printf()的返回值:打印的字符数/-1
5、定义和声明
只有当声明一个变量的同时为其分配一个空间才能称为“定义”。例:
定义:int i;
声明:extern int i;
6、static变量
static分为两种情况:(1)定义一个外部变量时声明为static变量,这种情况下,意味着此变量对于这个源代码文件之外的代码是隐形的(不可访问);(2)在函数中定义内部变量时声明为static变量,此时,意味着这个变量在函数调用返回后依然存在(但无法被其他函数访问),当程序再次进入同一个函数时,这个变量依然保持着上一次函数返回时的值。
7、变量的初始化
局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(Constant Expression)初始化。
8、void *
void *是通用类型指针,任何类型的指针都可以转化为void *类型,并且在将它转换回原来的类型时不会丢失信息。
9、复杂的指针声明(from K&R)
char **argv //argv:pointer to pointer to char
int (*daytab)[13] //daytab:pointer to array[13] of int
int *daytab[13] //daytab:array[13] of pointer to int
void *comp() //comp:function returning pointer to void
void (*comp)() //comp:pointer to function returning void
char (*(*x())[])() //x:function returning pointer to array[] of pointer to function returning char
char (*(*x[3])())[5] //x:array[3] of pointer to function returning pointer to array[5] of char
/* 谁要是写出最后两行这种代码大概会被读代码的人活活拍死吧…… */
10、typedef
typedef expression(tp);
tp var1;
可以理解为这样一个过程:将var1代入expression(tp)中所有tp的位置,就是tp var1所表达的含义。