写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我
热爱AI、热爱分享、热爱开源
! 这博客是我对学习的一点总结与记录。如果您也对深度学习、机器视觉、算法、C++
感兴趣,可以关注我的动态,我们一起学习,一起进步~
文章目录
上一篇:【C++养成计划】基本语法(Day2)
昨天我了解了C++的基本语法,今天我们来学习下变量作用域
。在玩转变量作用域之前呢,我们得先来看下什么是变量
?
一、变量
什么是变量?
变量名其实是程序可操作的内存的名称,变量值是内存里存储的数据。变量名由我们定义,它替代了变量值在内存中的存储地址,这样使得代码更友好。变量的命名规则
。变量名也是一种标识符,是由字母、数字和下划线字符组成。具体规则同C++标识符。详见:【C++养成计划】基本语法(Day2)变量类型
。每个变量都有指定的类型,类型决定了变量存储空间的大小和结构,该范围内的值都可以存储在内存中。变量定义、声明与初始化
。变量在使用之前,需要首先声明(定义)其类型和名称。在声明(定义)一个变量的同时,也可以给它赋予初值。在C++程序中,大多数情况下变量声明等同于变量定义。
#include<iostream>
using namespace std;
int main()
{
//1.声明(定义)变量
int a;
int b, c;
//2.初始化
a = 0;
b=1, c=2;
//3.边声明边初始化
int a=0;
int b=0, c=0;
return 0;
}
二、变量类型
在进行编程时,需要用到各种变量来存储各种信息。变量在使用之前,需要首先声明其数据类型,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。基本的数据类型
有:字符型、宽字符型、整型、浮点型、双浮点型、布尔型、无类型等。
其中宽字符型比较特殊,其实是使用关键字typedef
,由 short int 替换而来的数据类型。初学者可以先不掌握。
//关键字typedef将变量类型 short int 替换成了 wchar_t
typedef short int wchar_t;
一些基本的数据类型还可以使用一个或多个类型修饰符
进行修饰:
- signed :有符号
- unsigned:无符号
- short:短
- long:长
下表显示了各种变量类型在内存中存储值时占用的内存大小
,以及该类型的变量所能存储的最大值和最小值
。不同系统会有所差异。
对于未知数据类型的变量,想到知道它在内存中存储值时占用的内存大小,可以使用sizeof
来确定该变量的字节长度。
cout<<"数据类型int占用内存的字节长度:"<<sizeof(int);
C++ 也允许定义各种其他类型的变量,比如枚举、指针、数组、引用、数据结构、类等等,这将会在后续的章节中进行讲解。
三、常量
字面常量
。字面常量可以是任何类型,比如布尔型:true、false;整型:1、2、100;字符串:“Hello C++”,"I love you"等等。使用const将变量声明为常量
。从实用和编程的角度来看,这是最重要的C++常量声明方式。声明方式如下:
将圆周率Pi声明为一个常量
const double Pi = 3.14;
注:Pi是一个类型为double的常量。因此后面再不能对Pi重新赋值,否则将出现编译错误。
枚举常量
。在某些情况下,变量只能有一些特定的取值。例如,彩虹只有七种颜色,指南针的方位不能为“左”。在这些情况下,变量的取值范围由自己确定,可使用关键字enum来声明枚举常量。
enum RainbowColors
{
Vilet = 0;
Indigo,
Blue,
Green,
Yellow,
Orange,
Red
};
用枚举常量来指定变量的类型,这样声明的变量只能取指定的值。因此,如果要声明一个变量来存储彩虹的颜色,做法如下:
RainbowColors MyColor = Blue;
声明枚举常量时,编译器将枚举值(Vilet等)转换为整数,每个枚举值都比前一个大1。
你可以指定起始值,如果没有指定,编译器默认起始值为0。
因此,可知MyColor存储的蓝色Blue对应的数值是:2
使用#define定义常量
。这种做法已经被摒弃,因此不建议使用这种方法。这里介绍只是为了帮助你理解一些旧程序。
这里同样将圆周率Pi声明为一个常量,做法如下:
#define Pi 3.14
这是一个预处理器宏,让预处理器将随后出现的所有Pi都转换为3.14。这是一种文本替换,而不是智能替换。编译器既不了解也不关心常量的类型。
四、变量作用域
4.1 局部变量
在函数或一个代码块内部声明的变量,称为局部变量
。它们只能被函数内部或者代码块内部的语句使用。
#include <iostream>
using namespace std;
void Mul()
{
int a=0,b=0; //局部变量
cout<<"输入第一个数:";
cin>>a;
cout<<"输入第二个数:";
cin>>b;
int MulResult = a*b;
cout<<a<<"*"<<b<<"="<<MulResult<<endl;
}
int main()
{
Mul();
//cout<<a<<"*"<<b<<"="<<MulResult<<endl;
return 0;
}
这是一个简单的计算乘法的程序,运行结果如下:
分析:程序中的a、b是局部变量,作用域在函数Mul()内。如果在主函数main()中添加注释了的那一行,程序会报错。因为不能在函数Mul()外使用局部变量a、b。
4.2 全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量
。全局变量可以被任何函数访问
。全局变量一旦声明,在整个程序中都是可用的。
#include <iostream>
using namespace std;
//声明全局变量
int a=0, b=0, MulResult=0;
void Mul()
{
cout<<"输入第一个数:";
cin>>a;
cout<<"输入第二个数:";
cin>>b;
MulResult = a*b;
cout<<a<<"*"<<b<<"="<<MulResult<<endl;
}
int main()
{
Mul();
cout<<a<<"*"<<b<<"="<<MulResult<<endl;
return 0;
}
运行结果如下:
分析:这次把a、b声明为全局变量,可见a、b不仅在Mul()函数中有效,在主函数main()中也有效。
4.3 局部变量覆盖全局变量
在程序中,局部变量和全局变量的名称可以相同
,但是在函数内,局部变量的值会覆盖
全局变量的值。下面是一个实例:
#include <iostream>
using namespace std;
int MulResult=10; //全局变量
int main()
{
int MulResult=5; //局部变量
cout<<"MulResult="<<MulResult<<endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
4.4 初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化
。定义全局变量时,系统会自动初始化
为下列值:
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。