register变量必须是能被cpu寄存器所接受的类型。此变量必须是一个单个的值,并且其长度应小于或等于整形的长度,而且此变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern也没法使用。
由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。
在多重循环中,尽可能把最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
把循环嵌套控制在3层以内(有研究表明,循环嵌套超过3层时,程序员对循环的理解能力会减低)
C/C++任何类型的指针都可以直接赋值给void*,无需进行强制类型转换。
若函数不接收任何参数,要指明参数为void,例:func(void)
如果函数的参数可以是任意类型指针,应声明其参数为void*.
return语句不能返回指向“栈内存”的指针,该内存在函数体结束时被自动销毁。
大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
union:所有的成员的起始地址一致。
Typedef struct stu{
//code;
}stu_st, *stu_pst;
const stu_pst stu; //指针不能改
stu_pst const stu; //指针不能改
对于编译器来说,stu_pst是一个类型名,在解析时把类型名忽略了。所以const修饰的是指针。
斜杠(/)和星号(*)之间没有空格,才会被当作注释的开始
对于全局变量,必须要加注释;
注释尽量用英文,尽量避免用缩写;
注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上一行,但不可放在下方;
对于函数的入口、出口数据给出注释;
对一系列的数字编号给出注释。
用反斜杠换行时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格
对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或补1取决于编译系统的规定。
移位时的位数不能小于0.
[]优先级高与*
在程序编译的过程中,注释先于预处理指令被处理
#pragma message:
例:#ifdef _X86
#pragma message(“_86 macro activated!”)
#endif
数组:a[10]中,a是数组首元素的首地址,&a是数组的首地址,但它们的值是一样的。
C语言中,当一维数组做为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。
堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
栈:保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间有限。
静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在,由编译器在编译时分配。
assert是一个宏,不是函数,包含在assert.h头文件中。如果其后面括号里的值为假,则程序终止运行,并提示出错;如果后面括号里的值为真,则继续运行后面的代码。这个宏只在Debug版本上起作用,而在Release版本中被编译器优化掉。
所有网络协议都是采用大端模式(big enddian)传输数据的