深入理解const,volatile,static关键字

我们先来看一段代码:

//注意使⽤C++编译器编译(源⽂件使⽤.cpp后缀)

// 或者在 C 编译器中编译期间打开优化选项,⽐如:
// gcc test.c -O2
# include <stdio.h>
int main ()
{
const int n = 10 ;
int *p = ( int *)&n;
*p =
20 ;
printf ( "%d\n" , n);
return 0 ;
}

//看看程序输出的结果是什么?

只要编译器适当的对代码进⾏优化,这⾥就可能输出: 10,⽽不是我们改变之后的值。
这是为什么呢?
是编译器在编译期间,可能对代码进⾏优化。
当编译器看到这⾥的
numconst修饰,从语义上讲这⾥的num是不期望被改变(不改变)
的,那优化的时候就可以把
num的值存放到寄存器(以提⾼访问的效率)中。以后只要使⽤
num的地⽅都去寄存器中取,那即使num对应的内存中的值发⽣变化,寄存器也是感知不到

的。所以造成输出10的结果。

当我们对代码进⾏如下修改:
const的深度讲解及volatile关键字介绍

#include <stdio.h>
int main()
{
//使⽤volatile关键字对num修饰。
volatile const int n = 10;
int *p = (int *)&n;
*p =
20;
printf("%d\n", n);
return 0
;
}

结果⼜会是什么呢?
这⾥我们可以看到,当我们对
*p做了修改之后, num的输出变成了20
这⾥
volatile 这个关键字起到关键的作业。
那我们说说
volatile 关键字的作⽤和使⽤场景。
volatile作⽤:
编译时不优化,执⾏时不缓存,每次需从内存中读出(保证内存的可⻅性)。
场景:
⽤于多线程或多CPU编程。
如果不显示的初始化,静态变量的初始化为
0
⽽⾃动变量是不做任何初始化的,是随机值


#include <stdio.h>
static int m;
int fun1()
{
static int n = 0;
n++;
printf("n = %d\n",n);
}
int fun2()
{
m =
0;
m++;
printf("m = %d\n",m);
}
int main()
{
int i;
变量的初始化:
for(i = 0; i < 10; i++)
{
fun1();
}
for(i = 0; i < 10; i++)
{
fun2();
}
return 0;

}

程序运行结果:

static的总结:

1. 当它作⽤于函数定义时,或者⽤于代码块之外的变量声明时, static关键字⽤于修改标示符
链接属性
。外部链接属性变为内部链接属性,标识符的存储类型和作⽤域不受影响。也就
是说变量或者函数只能在当前源⽂件中访问。不能在其他源⽂件中访问。
2. 当它⽤于代码块内部的变量声明时, static关键字⽤于修改变量的存储类型。从⾃动变量变
为静态变量
。变量的属性和作⽤域不受影响。

猜你喜欢

转载自blog.csdn.net/csdn_baotai/article/details/80206995