您的位置:首页 > 编程语言 > C语言/C++

c语言关键字学习之 static register inline volatile

2017-06-30 15:09 423 查看
首先来说说static,static主要用在这几个地方:定义全局静态变量,定义静态局部变量,定义静态函数。

被static修饰的变量具有全局的作用,生命周期和作用域需要特别注意!

静态全局变量和静态局部变量都是存储在静态存储区,区别于其他变量存在栈区和堆区。所以它是在编译的时候就确定的。通过反编译可以看出

int g_nNum = 0x2222;

static int g_sNum = 0x3333;//作用域在程序开始到结束

static int fun(){

return ++g_nNum;

}

int _tmain(int argc, _TCHAR* argv[])

{

for (int i = 0; i < 10;i++)
{
static int mNum = 0x0;//作用域在for循环体内
mNum++;
printf("%d\n", mNum);//static的变量只能定义一次,即使是在循环体内。重新赋值之后都是用上一次的值
}
int fNum = fun();
printf("%x\n", g_nNum);
printf("%x\n", g_sNum);
return 0;

}

register 用来定义寄存器变量的,寄存器是接近cpu的读写速度,比内存中数据速度要快。所以经常用到变量定义为寄存器变量有利于提高程序运行速度。同时寄存器是有限,资源宝贵,能存储到寄存器的变量只能是int,short,char等类型。早期的编译器不能需要自己定义才会把变量存到寄存器,发展现状只有变量反复用到才可以被放到寄存器中,即使定义了也没用。另外,全局变量不能定义为寄存器变量。

register int i = 1;
double res = 0, ad = 1.0, sign = 1.0;
for (; i < 100000000;i++)
{
res += ad;
sign = -sign;
ad = sign / (2 * i + 1);
}
res *= 4;
printf("pi is %f", res);

inline函数被定义为内联函数,是为了提高程序执行效率,其实和register,都是属于和编译器干的活,编辑器将经常用到的函数,编译成内联函数,执行一份代码拷贝,

内联函数的逻辑不宜太多。空间换时间!

inline void printf(int nNum){

printf("%d\n", nNum);

}

int _tmain(int argc, _TCHAR* argv[])

{
for (int i = 0; i < 10;i++)
{
printf(i);//在编译的时候,进行函数拷贝替换,这里可以理解,以前去买超市买酱油要跑2公里,现在直接把超市开在我家了,想买就买!
}

return 0;

}

volatile 修饰符用来定义变量是“易变的”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐