1.static
(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。
(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。
(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。
Static变量与普通的变量有什么区别:
1.static全局变量只初使化一次,防止在其他文件单元中被引用;
2.static局部变量只被初始化一次,下一次依据上一次结果值;
3.static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
2.const
const关键字在C语言中用于声明”只读变量”,其值不可修改,但具有确定的数据类型。C编译器总是为其分配相应的存储单元。
在C++中,const关键字用于声明常量,C++编译器视具体情况决定是为其分配存储单元还是仅将其作为编译期间的常量。
在C++中,还可以修饰类的成员函数,不改变类中的数据成员.
被const
char
char
const
const作用:修饰变量、修饰函数参数、修饰函数返回值三个作用。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
1)
3.inline
因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到调用函数的下一行代码继续执行。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。
而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
但是宏也有很多的不尽人意的地方。
1)、宏不能访问对象的私有成员。
2)、宏的定义很容易产生二义性。
3)、宏定义的常量在代码区,很多调试器不能够对其调试
4)、宏会增大代码的尺寸
我们举个例子:
#define
避免这些错误的方法是:给宏的参数都加上括号。
#define
内联函数和宏很类似,而本质区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈出栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
4.volatile
volatile字面意思是“易变的”。这个关键字来描述一个变量时,意味着给该变量赋值(写入)之后,马上再读取,写入的值与读取的值可能不一样,所以说它“易变的”。这是因为这个变量可能是一个寄存器,直接与外部设备相连,你写入之后,该寄存器也有可能被外部设备的写操作所改变;
简而言之,volatile关键字用于声明内存映射的易失型变量,这类变量的值随时可能由于某种编译器所不知道的原因(例如,外部设备对其写入)所改变,所以编译器在进行代码优化时不能对其做任何的假设和依赖
建议使用volatile变量的场所:
(1)
(2)
(3)
5.assert()
void assert( int expression );
assert(n != 0);
********************************************************
零碎小知识点:
1.switch的表达式不能为实型。
2.对于
对于
3.stdout和stderr是不同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会被输入,1)遇到回车,2)缓冲区满,3)fflush被调用。而stderr则不会。
4.
5.对于C++代码,对一个结构体而言,就算是空的,编译器仍然要为它分配空间,分配1个字节的空间;对于gcc下C代码,它是0;对于VC下C代码,它是1.
6.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。