结果:
a作为静态局部变量,第一次进入该函数的时候,进行第一次变量的初始化,在程序整个运行期间都不释放。(因为下一次调用还继续使用上次调用结束的数值)
但是其作用域为局部作用域,但定义它的函数或者语句块结束时,其作用域的也随之结束。
修饰全局变量的时候,这个时候全局变量只在文件中访问,不能在其他的文件中访问,即便是extern外部声明也不可以。
关于变量:首先程序以及变量下载后都在flash中,程序运行的时候,必然才能从FLASH中出来到内存中的。
就是告诉编译器,不要对变量的读取和存储去做优化。不加它,程序会运行的很快,不会与内存之间进行读写存储。
它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
在读写的时候,需要告诉这个变量是不稳定的,编译的时候不需要优化。(不需要优化的意思就是去特殊地址去访问它)。
当变量在触发中断中修改,而编译器判断主函数里面没有修改该变量,因此可能只执行一次从内存到寄存器的读操作,而后每次只会从该寄存器中读取变量副本,使得中断程序的操作被短路。
在本次线程内, 当读取一个变量时,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当内存变量或寄存器变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 。
有两个以上文件都需要使用共同的变量,我们将这些变量定义为全局变量。
定义常量;防止数据改变。
#:转换成一对双引号括起来的参数名字符串
如: #define PRINT(NAME) printf(#NAME)
PRINT(Hello word 1);
##:连接符,即把两个宏变量拼接到一起。