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

首先来说说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 修饰符用来定义变量是“易变的”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值