关键字extern、volatile、const、static

本文深入解析C++中的关键字,包括extern、volatile、const和static的使用场景与含义,以及break和continue的区别。针对每个关键字提供了详尽的解释与示例代码,帮助读者理解并掌握这些重要的编程概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、extern

extern表示声明一个在其他地方定义过的全局变量
函数内

{
  extern int x; //重新声明x,且是外部变量(全局的),这个x的作用域为{}之间
  return x;
  }

(a) extern string name; // name在其他地方定义了(通常是在别的文件中定义了,但也可以是本文件中定义的),在这仅仅是重新声明一下,不会重新定义一个新变量。
string name( "exercise 3.5a" ); // 定义了一个名为name的变量,并设置初始值为"exercise 3.5a"。
(b) extern vector<string> students; // students在其他地方定义了(通常是在别的文件中定义了,但也可以是本文件中定义的),在这仅仅是重新声明一下,不会重新定义一个新变量。
vector<string> students; // 定义一个名为students的变量。

2、volatile

举例说明:
volatile int i=10; 
int j = i; 
... 
int k = i; 

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 

volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。

其中编译器编译优化是:
由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。

3、const(存在flash里,不占用内存)

转自http://blog.youkuaiyun.com/zhoukangli/article/details/8035456

我只要一听到被面试者说:"const意味着常数"不是常数,可以是变量,只是你不能修改它),我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems  Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)

如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

Const只是一个修饰符,不管怎么样a仍然是一个int型的变量

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

本质:const在谁后面谁就不可修改,const在最前面则将其后移一位即可,二者等效

 

前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,指向的整型数是不可修改的,但指针可以,此最常见于函数的参数,当你只引用传进来指针所指向的值时应该加上const修饰符,程序中修改编译就不通过,可以减少程序的bug)。

 

第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

 

如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 ,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码

3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

 

const关键字至少有下列n个作用:

1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了
2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const
3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为左值。例如:
const classA operator*(const classA& a1,const classA& a2); 
  operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 
a*b的结果赋值 
  操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。


const用来说明所定义的变量是只读的,这些在编译期间完成,编译器可能使用常量直接替换掉对此变量的引用。

4、static

  1. static第一个作用:隐藏

    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性

  2. static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化

  3. static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

在C语言中,static关键字有三种用途:
1 用于全局变量定义时。 
全局变量定义时加上static修饰,表示该变量为静态全局变量。作用域为当前文件。
2 用于函数定义或声明。
任意函数的定义或声明中包含了static修饰,表示该函数为静态函数,只能在本文件中被调用。
3 用于局部变量定义。
局部变量定义时,带有static关键字,表示其为静态局部变量,只被初始化一次,之后每次调用函数时,该变量值为上次函数退出时的值。即,改变量的生存周期被扩展到整个程序运行时间段内。



答案是1、2、2、2

5、break和continue

  for(int i=0;i<100;i++){

  if(i==50){

    continue;// 跳出当前循环,执行下面的循环,就是说,当i=50的时候,跳出循环,从i=51开始继续循环

 

    //业务逻辑

  }

 

 if(i==60){

    break;//break表示跳出整个for循环,也就是说,当i=60的时候,这个循环就结束了,不执行for循环下面的代码

  }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值