现在的位置: 首页 > 综合 > 正文

C/C++要点全掌握(一)——基础概念

2018年04月11日 ⁄ 综合 ⁄ 共 1638字 ⁄ 字号 评论关闭

       最近参加了几个公司到学校的招聘会,笔试时大多要求使用C/C++语言,而且有些笔试考到了语言的细节部分。说来汗颜,C/C++只在大一学习时使用了一年,之后一直在学习高级语言的组件开发,到现在C/C++语言的有些细节,部分已经忘记。在此将C/C++的基础要点重拾一遍,以便往后忘记之时查阅。

 

1局部变量存储于堆栈上,堆栈是一个动态可变的存储区,所以局部变量是在声明它们的块入口处创建,出口处销毁。

 

2全局变量存储在一个编译器设定的固定存储区中。他们在程序运行的整个时间内占据空间。

 

3声明与定义的区别:声明说明变量的名称及类型;定义会导致给变量分配内存。同一变量可以有许多声明,但仅有一个定义。

 

4大多数情况下,变量声明也是定义。通过在extern限定符关键字可以声明变量而没有定义它,但要记住在程序的后面其他部分定义该变量。

fun1()
{
  extern int a;//声明a为全局变量,其将在后面定义
  ...
}
...
int a;//定义全局变量

注:如果将”int a;”定义语句放在函数fun1前,则在fun1中就不必再声明a为全局变量,因为编译器已经知道a为一个已经定义了的全局变量了。语句“extern
int a;”
只是声明一个变量而没有定义它,如果在声明时给该变量赋初值,即语句”extern int a=1;”,那么该声明就变成了一个定义全局变量语句。显然,在fun1内不能使用该语句,否则编译器会给出一个“不能对带有块范围的外部变量进行初始化”的错误提示。

 

5静态变量是永久变量,在两次调用之间它们的值是不变的(其实这点全局变量也满足了!)。静态变量分为静态局部变量静态全局变量两种。使用static修饰变量时,编译器像全局变量一样为之创建永久的存储区,但区别是静态局部变量只在其所在块内可知,而静态全局变量则只在其所在文件可知。这样,static就使变量仅为需要它们的函数(部分)所知,一定程度上“隐藏”了静态变量,使其相对与其他部分是“透明”的。

注:在C++应当使用命名空间从而更好的达到上述目的。

 

6函数和全局变量有外部链接,当指定extern(大多数情况是不必指定的,因为函数默认就是extern的,而在非块内定义变量默认是extern变量),他们对组成程序的所有文件都是可用的;静态全局变量有内部链接,当指定static时,他们对所在文件内是可知的;局部变量没有链接。

注:其实静态全局变量还可当作全局变量,只是其可知范围被缩小了,只在本文件可知;静态局部变量也可当作局部变量,只是其生命周期被延长了,不像局部变量一样在块出口销毁,而其可知范围未变。

举一例说明下静态局部变量的使用优点:

//返回增加后的引用计数,count在其他部分不可访问
int AddRef()
{   
 //静态局部变量,只在本函数内可知,只在第一次调用分配内存
 //静态变量如果未赋初值将被置为类型默认值   
 static int count=0; //该语句可看作只在第一次调用执行,以后调用仅起声明作用   
 count++;   
 return count;
}

//counter在本文件其他部分可被访问
static int counter=0;//静态全局变量,在本文件内可知

int func1()
{   
  ...  
  return AddRef();//返回调用func1次数
}

 

7寄存器变量(用register修饰)要求编译器把一个变量的值保存在CPU寄存器而不是内存中,使对寄存器变量的操作比普通内存变量快。使用寄存器变量应注意以下几点只能用register修饰局部变量和形式参数;在C中不能通过&运算符取寄存器变量地址;在C++取寄存器变量地址可能阻止它被优化。

 

8CC++中都没有指定表达式中子表达式的求值顺序,如果有以下语句:

X=f1()+f2();

f1()f2()的执行结果又依赖于同一个共享变量且会修改该变量,那么应该根据逻辑人为指定他们的执行顺序。

 

    下接C/C++要点全掌握(二)

 

 

 

 

 

 

 

 

抱歉!评论已关闭.