《Visual C++ 开发从入门到精通》——2.7 变量

本节书摘来自异步社区出版社《Visual C++ 开发从入门到精通》一书中的第2章,第2.7节,作者: 王东华 , 李樱,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.7 变量

知识点讲解:光盘视频PPT讲解(知识点)第2章变量.mp4

变量是指内容可以变化的量,它是访问和保存数据的媒介。变量在程序中的应用比较频繁,这就需要我们正确、灵活地使用才能够编写出高效的程序。本节将详细讲解C++变量的基本知识。

2.7.1 定义变量

变量不仅向编译器声明自身的存在,并同时为自身分配所需的空间,具体格式如下。

type varl[=value1], var2[=value2],………
其中,type是类型名,可以是int、char等任何类型的说明符;varl和var2是变量的名字,可以是任何合法的非保留字标识符,value1和value2是常量值。如果同时定义多个变量,则变量之间必须用逗号隔开,最后一个变量后加分号。

图像说明文字

注意:变量类型决定了应怎样去理解和操作该变量所对应的数据,变量名为程序提供了内存块的首地址和操作它的媒介。
实例004 分别定义5个变量,并分别初始化赋值处理
源码路径 光盘part02bian  视频路径 光盘视频实例第2章004

本实例的核心文件是bian.cpp,具体实现代码如下。

#include "stdafx.h"
#include "iostream.h"
int main(void) 
{
     int a=20;        //定义整型变量a
     char ch='a';     //定义字符型变量ch
     double d1,d2;    //定义双精度型变量d1和d2
     double d3;       //定义双精度型变量d3
     /*使用定义的5个变量*/
     d1=2.9;
     d2=3.1;
     d3=14;
     d3=d1+d3;
     cout<<d1<<endl;
     cout<<d2<<endl;
     cout<<d3<<endl;
     eturn 0; 
}```

范例007:演示变量和存储方式的关系
源码路径:光盘演练范例007
视频路径:光盘演练范例007
范例008:获取输入的用户名和密码
源码路径:光盘演练范例008
视频路径:光盘演练范例008`
在上述代码中,分别定义了5个变量a、ch、d1、d2、d3,并分别为这5个变量进行了赋值处理。编译执行后将输出对应的结果,执行结果如图2-4所示。


7bc22e46f07539d18b09ad4c2c3b99b4ba4cee79

图2-4 执行结果

2.7.2 声明变量

如果只需向编译器说明一个变量的存在,而不为其分配所需的存储空间,就叫变量的声明,它仅仅起到占位符的作用。具体声明格式如下。

extern type var1,var2,……
其中,extern是关键字,表示定义的外部变量;type是变量的类型,var1和var2是变量的名称。所谓外部变量,是指变量在当前程序的外部,要么是在另外一个文件中,要么是在本文件的后面。

实例005 使用extern声明了两个变量a和b
源码路径 光盘part02wai  视频路径 光盘视频实例第2章005

本实例的功能是使用extern声明两个变量a和b,实例文件wai.cpp的具体代码如下。

#include "stdafx.h"
#include "iostream.h"
#include "a_wai.h"          //变量a所在的头文件
extern int a;               //从外部引入变量a
extern int b;               //从外部引入变量b
int main(void)
{
     int c=10;          //定义变量c
     cout<<"a在另一个文件内,a="<<a<<endl;
     cout<<"b是声明的,但在本文件内,b="<<b<<endl;
     cout<<"c是定义的,c="<<c<<endl;
     return 0;
}
int b = 1;            //定义变量b```

范例009:判断是否是闰年
源码路径:光盘演练范例009
视频路径:光盘演练范例009
范例010:组合判断处理
源码路径:光盘演练范例010
视频路径:光盘演练范例010`
执行后的效果如图2-5所示。


84fa3979506cf257513f9b2672a882f8e87120d2

图2-5 执行效果

在上述代码中,extern声明一个来自其他文件的变量a,然后声明一个在主函数后才被定义的变量b。变量a是直接调用的,它在外部文件a_wai.h中被定义,具体代码如下。

extern int a=1;
这样,虽然a和b都被声明为外部变量,但是a是在文件a_wai.h中定义的,b则是在函数main的末尾定义的,c则只是一个定义。

图像说明文字

注意:在上述代码中,变量的声明并没有给变量分配存储空间,所以在声明时不能给其赋值,因为它在实际上是不存在的。如果将变量a的声明写为如下格式。
extern int a=1; //从外部引入变量a
上述写法是错误的,因为此时的a还没有存储空间,数值1将无处可放。

2.7.3 变量的作用域

变量的作用域是指变量可以被引用的区域,变量的生存期是指变量的生命周期,变量的作用域与生存周期是密切相关的。本节将简要介绍变量作用域的基本知识。

1.作用域和生存期
变量的作用域决定了变量的可见性,说明变量在程序哪个区域可用,即程序中哪些语句可以使用变量。作用域有3种:局部、全局和文件作用域。具有局部作用域的变量称为局部变量,具有全局作用域和文件作用域的变量称为全局变量。

大部分变量都具有局部作用域,它们声明在函数内部。局部的作用域开始于变量声明的位置,并在标志该函数或块结束的右括号处结束。下面的例子列出了几种不同的局部变量。

例如,局部变量和函数形参具有局部作用域。

void Myprogram(int x)
{                                //形参的作用域开始于此
int y=3;                         //局部变量的作用域开始于此
{
int z=x+y;                       //块内部变量z的作用域开始于此,x和y在该语句内可用
}                                //z的作用域结束
}                                //变量y、x作用域结束```
全局变量声明在函数的外部,其作用域一般从变量声明的位置开始,在程序源文件结束处结束。全局作用域范围最广,甚至可以作用于组成该程序的所有源文件。当将多个独立编译的源文件连接成一个程序时,在某个文件中声明的全局变量或函数,在其他相连接的文件中也可以使用,但使用前必须进行extern外部声明。例如,如下为具有全局作用域的变量。

int x=1; //全局变量x的作用域开始于此,结束于整个程序源文件
void Myprogram(int x)
{

 ……

}
……`
全局作用域是指在函数外部声明的变量只在当前文件范围内可用,但不能被其他文件中的函数访问。要使变量或函数具有文件作用域,必须在它们的声明前加上static修饰符。当将多个独立编译的源文件链接成一个程序时,可以利用static修饰符避免一个文件中的外部变量由于与其他文件中的变量同名而发生冲突。

下面的代码演示了具有文件作用域的全局变量。

staticx=1;                  //全局变量x的作用域开始于此,结束于当前文件
void Myprogram(int x)
{
……
}
……```
在同一作用域内声明的变量不能同名,但不同作用域声明的变量可以同名。

变量的生存期是指在程序执行的过程中,一个变量从创建到被撤销的一段时间,它确定了变量是否存在。变量的生存期与作用域密切相关,一般变量只有在生存后才能可见。但作用域与生存期还是有一些区别的,作用域是指变量在源程序中的一段静态区域,而生存期是指变量在程序执行过程中存在的一段动态时间。有些变量(函数参数)没有生存期,但是有作用域;有些变量虽然在生存期,但却不在作用域。

实例006 演示说明同名变量的屏蔽问题
源码路径 光盘\part02\yu  视频路径 光盘\视频\实例\第2章\006

本实例的核心文件是yu.cpp,具体实现代码如下。

include "stdafx.h"

include "iostream.h"

int i_sum=100;
void main()
{

 cout<<" 这是一个C++程序!"<<endl;
 int i_sum=200;
 cout<<i_sum<<endl;

};``

范例011:计算某年某月某日是第几天
源码路径:光盘\演练范例\011
视频路径:光盘\演练范例\011
范例012:猴子吃桃的问题
源码路径:光盘\演练范例\012
视频路径:光盘\演练范例\012```
执行后的效果如图2-6所示。

<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/8d3d393fc0f78ff4e930d8624c51477e6111ee30.png" >
</div>



图2-6 执行效果

在同一作用域内变量同名,在编译阶段编译器会报语法错误,我们可以方便地定位和调试。但是对于不同作用域的变量同名,则不会出现语法错误,但是会出现实例所演示的同名变量屏蔽问题。通过以上步骤,我们演示了不同作用域同名变量的屏蔽问题,而如何才能够输出正确的结果呢?则要借助作用域限定符。

2.作用域限定符
从实例006可以看出,如果局部变量和全局变量同名,则在局部作用域内只有局部变量才起作用,C语言没有提供这种情况下访问全局变量的途径。在C++中,可以通过作用域限定符“: :”来标识同名的全局变量。

实例007 使用作用域限定符“: :”
源码路径 光盘\part02\xian  视频路径 光盘\视频\实例\第2章\007

例文件xin.cpp的具体实现代码如下。

include "stdafx.h"

include

int i_sum=123;
void main(){

 cout<<" 这是一个C++程序!"<<endl;
 int i_sum=456;
 cout<<::i_sum<<endl;

};`

范例013:解决加油站的加油问题
源码路径:光盘\演练范例\013
视频路径:光盘\演练范例\013
范例014:解决买苹果的问题
源码路径:光盘\演练范例\014
视频路径:光盘\演练范例\014\
程序运行后的效果如图2-7所示。```

<div style="text-align: center">
 <img src="https://yqfile.alicdn.com/264df12450515474ee571d4dfc30f25aafc81bdd.png" >
</div>



图2-7 执行效果

通过以上步骤,演示了使用作用域限定符来解决不同作用域同名变量屏蔽问题的方法。在此需要说明的是,作用域限定符“::”只能用来访问全局变量,而不能用来访问一个在语句块外声明的同名局部变量。例如,下面的代码是错误的。

void main(){

 cout<<" 这是一个C++程序!"<<endl;
 int i_sum=123;
 {
      int i_sum=456;
      :i_sum=789;
 }

};`
编译程序就会弹出以下错误提示信息。

error C2039: 'i_sum' : is not a member of "global namespace"```
3.C++变量初始化
变量初始化就是对变量一个初始的赋值,此操作可以在变量定义时进行,也可以在定义后再进行。在前面的实例中,我们多次实现了变量初始化处理。

当定义一个变量时,我们应给它进行初始化的动作。当然除了系统会帮我们初始化的变量外(如全局变量、静态变量或外部变量,系统会帮我们初始化成0、null)。对于局部变量,它是在一个堆或栈中,如果不给它初始化,那么再使用时就很难决定它的当前状态。

未初始化的变量是C和C++程序中错误的常见来源。养成在使用内存之前先清除的习惯,可以避免这种错误,在定义变量的时候就将其初始化。

按照C和C++相同的低层高效率传统,通常并不要求编译器初始化变量,除非你显式地这样做(如局部变量、构造函数初始式列表中遗漏的成员),应该显式地初始化变量。

几乎没有理由不对变量进行初始化。实际上没有任何理由值得冒未定义行为可能带来的危险。

4.C++变量命名规范
俗话说,没有规矩不成方圆,命名当然不能随意,而需要遵循一定的规范。C++变量的命名不但要遵循其标识符的命名规则,还要遵循一些其他规范。

变量名的第一个字符必须是字母、下划线或@。
第一个字符后的字符可以是字母、下划线或数字。
由字母(大写A~Z或小写a~z)、数字(0~9)和下划线(_)组成。
不能包含除下划线之外的任何特殊字符。
不能包含换行、空格、制表符等空白字符。
不能包含C++保留字,如int、main等。
要区分大小写,如temp和Temp是不同的。
变量长度无限制,但系统只会取前1 024个字符。
变量名要有意义,要一看便懂,提高可读性,以便于系统维护。
如果名称包含一个以上的单词,最好单词首字母大写。
在习惯上都趋于用小写字符命名。
例如,下面的变量名都是正确的。

aaaaaa
@aaaaaaa
_aaaaaa`
下面的变量名是不正确的。

6666aaa
aa-bb
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值