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就可以了

害,先这样吧。

 

posted @ 2020-09-24 22:11  踏上星辰  阅读(600)  评论(0编辑  收藏  举报