C语言中static和auto用法详解

目录
  • static的第一种用法:定义为静态变量
  • static的第二种用法:有理说不清,直接代码见真知
  • auto的用法:直接代码见真知
  • 总结

static的第一种用法:定义为静态变量

何为静态变量?存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。就是只进行一次初始化。不理解?看代码!

代码见真知:

#include<stdio.h>
int main()
{
	void fun();   //定义一个空函数

	for(int i=0;i<3;i++)
	{
		fun();    //调用函数
	}
	return 0;
}
void fun()
{
	int i=0;
	static int static_i=0;

	printf("没有加static的结果为:%d\n",i);
	printf("加了static的结果为:%d\n",static_i); 

	i++;    //没有加static,i最终都会被初始化为0

	static_i++;  //加了static,只初始化一次,后面继续累加

	printf("\n");
}

运行结果:

由结果可以看出有static的在持续累加,除了第一次没有再初始化。

static的第二种用法:有理说不清,直接代码见真知

#include<stdio.h>
int main()
{
	int i,sum;
	sum=2;

	for(i=0;i<3;i++)
	{
        //外置模块
		printf("外置模块为:%d\n",sum);
		sum++;

        //内置模块
		{
			static int sum=1;  //局部重新定义sum的初始值
			printf("内置模块为:%d\n",sum);
			sum++;
		}

		printf("\n");
	}
	return 0;
} 

运行结果:

 由结果可见:外置模块和内置模块是互不影响的,这就是static的第二种用法,保持局部一部分稳定,不会随外部的变化而变化。

auto的用法:直接代码见真知

#include<stdio.h>
int main()
{
	int i,sum;
	sum=2;
	for(i=0;i<3;i++)
	{
        //外部
		printf("外置模块为:%d\n",sum);
		sum++;

        //局部
		{
			auto int sum=1;
			printf("内置模块为:%d\n",sum);
			sum++;
		}

		printf("\n");
	}
	return 0;
} 

代码看不懂?结合运行结果就懂了:

由结果显而易见:外置模块持续累加,内置模块全部为1,与static的第二种用法相比较,auto局部不断进行初始化 ,而static是局部除第一次外不再初始化。

static和auto的相同之处是都能只在局部进行改变,与外置模块互不干涉。

总结

到此这篇关于C语言中static和auto用法详解的文章就介绍到这了,更多相关C语言static和auto内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中auto,register,static,const,volatile的区别详细解析

    1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率. (3)static常见的两种用途:1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型.在一

  • C语言中static和auto用法详解

    目录 static的第一种用法:定义为静态变量 static的第二种用法:有理说不清,直接代码见真知 auto的用法:直接代码见真知 总结 static的第一种用法:定义为静态变量 何为静态变量?存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.就是只进行一次初始化.不理解?看代码! 代码见真知: #include<stdio.h> int main() { void fun(); //定义一个空函数 for(int i=0;i<3;i++) { fun();

  • C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. void* memcpy(void* destination, const void* source, size_t num); void* dest 目标内存 const void* src 源内存 size_t num 字节个数 库中实现的memcpy函数 struct { ch

  • C语言中 “_at()” 特殊地址定位详解

    C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int variable __at(0x8000) = 100; 意为将variable变量定位到0x8000这个地址. 指令的目的是告诉链接器将指定地址定位到某个地址里面,在使用该功能的时候需要注意一点的是,地址的范围需要符合单片机的datasheet给出的地址映射表, 注意,如果地址超出了flash的最大范围,程序将无

  • C语言中fgets和fscanf区别详解

    C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据) ②fscanf:从文件中读取一段数据存入缓冲区(fscanf遇到空格或回车就结束,它会把空格或回车转换为\0,所以它是读一小段数据) 二.举个例子:把a.txt文件中的内容复制到b.txt. a.txt中的内容(第一行中"我爱你小白"和"开玩笑&q

  • C语言中scanf与scnaf_s函数详解

    目录 scanf_s 使用scanf_s scanf 使用scanf 总结 scanf_s scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s().在调用该函数时,可以提供一个数字以表明最多读取多少位字符. MSDN上scanf_s的简单模型:int scanf_s( const char *format [, argument]...);一般我们常用的格式:scanf_s(输入格式,输入流 [,输

  • Go语言中interface语法与使用详解

    目录 初识interface 基本语法 其他注意事项 interface底层实现 iface eface 侵入式与非侵入式的理解 interface的应用场景 类型转换 实现多态功能 补充:interface 与 nil 的比较 总结 初识interface Go语言的面向对象的知识点时,发现它的面向对象能力全靠 interface 撑着,而且它的 interface 还与我们以前知道的 interface 完全不同.故而整个过程不断的思考为什么要如此设计?这样设计给我们带来了什么影响? int

  • C语言中的sscanf()函数使用详解

    sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源. 其中的format可以是一个或多个 {%[*] [width] [{h |

  • C语言中free函数的使用详解

    free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存.对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题.如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误. 看一个程序 #include <stdio.h> #include <stdlib.h> int main() { cha

  • sql语言中delete删除命令语句详解

    Table:用于标示删除的数据表的名称. 1:该表必须是一个事实存在的表,对于该处的表必须是一个实际存在于数据库中的表格,必能是由于select等语句创造出来的中间表. 2:该方式可以通过联合的方式同时在两个表格中满足一定关联条件的数据. Top(*)用于指定删除的数据的数量 1:Top(N)表示在该表中删除表格中最靠前的N条数据. 2:在delete中不能和order连用,所以也不能通过top和order by连用来删除按照某一条件排序的全部的靠前的几条记录. 3:改语句不能用于sql2000

  • C语言中的rand()和rand_r()详解

    目录 背景 rand()和rand_r()的区别 rand() rand_r() 总结 背景 最近在学<并行程序设计导论>这门课,在做使用Pthreads并行化蒙特卡洛法估计 π \pi π的实验时遇到了一个问题,使用多线程反而要比单线程要慢很多,输出如下所示 可以看到,使用一个线程时程序运行只需要2.89031秒,但是使用两个线程时运行时间竟然达到了9.14698秒. 最终发现了问题所在:每个线程在执行下面的函数时,生成随机数使用了rand()函数,就是这个函数的使用才导致多线程运行时所需要

随机推荐