C:static、extern、auto、register的区别比较
我介绍的都是在c里面的用法
一、auto作用详解
auto是存储类别说明符。
默认情况下,声明在块{ int x}或函数头 f(int x,x)中的任何变量都属于自动存储类别
而我们为了更清楚(#^.^#)地表达你的意图(例子:为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其他存储类别),
那么我们就可以用关键字auto
for example->
int main(void)
{
auto int plox;
return 0;
}
注意:!!!! auto关键字在c++的用法完全不同,要考虑兼容问题的话,就不要用auto作为存储类别说明符了(#^.^#)
而其实<自动存储类别>很简单,该自动变量在被定义的块(即{ }这种形式)中才能访问变量,程序退出该块,那么变量就消失了。
好了Y(^o^)Y下面讲register
二、register说明
使用存储类别说明符register便可以声明寄存器变量。
寄存器变量存储在CPU的寄存器,那么o(* ̄︶ ̄*)o访问和处理这些变量的速度就可以杠杠的,妈妈再也不用担心我的速度了。\(^o^)/~。
值得注意的是,寄存器变量也是块作用域,无链接和自动存储期。
--------------滴滴,我来简单说一下链接。
c语言有3种链接属性:外部~,内部~,无链接。
简答说就是外部和内部就是可以在多文件程序中使用。(*^▽^*)详细的自己请教度娘吧
---------------over
回到正题,打住。
我打个样
int main(void)
{
regesiter int quick;
return 0;
} 嘿嘿,在函数头也可以使用哦。void macho(regesiter int n)
但是,。。。。请注意,寄存器就那么大,声明register的数据类型还是很有限滴。速度是很快了,肯定就资源就很有限啦。(*^▽^*)
三、static
首先我来介绍一下静态变量。-------> 静态的意思是该变量在内存中原地不动,并不是指值不变。且具有文件作用域的自动具有静态存储器。
当然啦,我们自己( ̄_, ̄ )也可以创建具有静态存储期、块作用域的局部变量。嘻嘻(* ̄rǒ ̄)你只要 在定义变量时在前面加上static就\(^o^)/~OK了。
要注意的是,自己创建具有静态存储期的变量在离开它们所在函数后,这些变量不会消失。
( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)没例子就是瞎扯淡,我们来看一下
(1)
1 #include <stdio.h> 2 void push(); 3 int main(void) 4 { 5 for(int i=1;i<=5;i++) 6 push(); 7 return 0; 8 } 9 void push() 10 { 11 static int s=1; 12 s++; 13 printf("%d",s); 14 }
大家肯定猜不到输出结果是什么。
居然输出结果是23456!!!!!!!!!!_____λ......___丬 别走啊~,哈哈,这就是牛逼克拉斯的static干的好事
1) A static int variable remains in memory while the program is running. A normal or auto variable is destroyed when a function call where the variable was declared is over.-----这是英语解释,嘿嘿。
因为你只要加了这个static,它就保存了你的值,不会随着函数的烟消云散而抛弃掉你的。简直是人生大爱啊。
并且,(* ̄︿ ̄)其实有一个小秘密。静态变量和外部变量在程序被载入内存时已经执行完毕啦。所以调用这个函数时,是直接跳过s=1这条指令了,所以就一直叠加了嘛。嘿嘿。
(2)
#include <stdio.h> int main() { static int x; int y; printf("%d \n %d", x, y); }
大家猜猜结果。。。。。。(o゜▽゜)o☆[BINGO!],
第一个会输出0,第二个嘛。。。嘿嘿每个人的输出就不一样啦。
Static variables (like global variables) are initialized as 0 if not initialized explicitly.
嘿嘿,锻炼一下英语理解能力。
到了最后一个了
四、extern
#include<stdio.h> int func(); int main() { func(); //1 printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); }
很明显,在mian()里面是找不到num的,num定义还在后面
但是,这是用extern就起作用了
#include<stdio.h> int func(); int main() { func(); //1 extern int num; printf("%d",num); //2 return 0; } int num = 3; int func() { printf("%d\n",num); }
extern int num是指示编译器去别处查询其定义。
extern 可以引用另一个文件的变量
b.c
#include<stdio.h> int main() { extern int num; printf("%d",num); return 0; }
extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。
c.c
#include<stdio.h> int num = 5; void func() { printf("fun in a.c"); }
但是 extern int num=3这种写法是不对的,不能对其赋值,只能在原来那个定义的文件中去重新赋值。或者在extern int number之后number=5就可以了
害,先这样吧。