【c++】变量

什么为变量

变量就是一块程序可操作的内存空间的别称。所以我们可以把c++中的所有数据类型都叫做变量。但是我们为了方便学习,才强调常量、基本类型、复合类型、对象



存储区

我们可以把内存分为如下区域(这些区域都是软件模拟出来的,而不是硬件)

1栈:栈(static)特点时先进后出,后进先出,代码块中的定义的变量就是这种类型。先定义的变量先入栈,后定义的变量先出栈

2堆:堆(heap)时操作系统分给程序自由使用的内存区域。c++中我们使用new就是申请的这块却与

3静态存储区。静态存储区存储这常量,还有static类型的变量和函数。这块内存是在c++程序运行时创建,结束时消亡。其中的数据一般情况下只有唯一的一份(编译器决定)


Tips:

c++有一个关键字叫做register 定义变量。把变量放在在寄存器中,c++11标准移除了这条规则,但是保留了关键字



变量的命名

1、变量名只能使用字符,数字和下划线(_)

2、名称的第一个字符不能是数字

3、区分大小写

4、不能使用c++关键字

5、一两个下下划线和大写字母大头的名称被保留实现(编译器及其使用的资源),以一个下划线开头的名称被保留实现,用作全局表示符

6、c+++的名字没有长度限制,但是有的平台限制了长度

7名称要有意义


Tips:

对于第五条来。我们书写的变量名在编译器编译之后会变成各种各样的名字,而上面就是编译器使用的名字,如果你在程序中使用这样的名字会导致编译器行为不确定

Tips:

因为命名是一个很有主观意愿的事情。所以出现了很多学派,如java中的驼峰命名法,微软的匈牙利命名法...大家可以按照自己喜好和项目约定来规定变量命名得意


声明变量

变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。

当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。

尝试下面的实例,其中,变量在头部就已经被声明,但它们是在主函数内被定义和初始化的:

#include <iostream>
using namespace std;

// 变量声明
extern int a, b;
extern int c;
extern float f;
  
int main ()
{
  // 变量定义
  int a, b;
  int c;
  float f;
 
  // 实际初始化
  a = 10;
  b = 20;
  c = a + b;
 
  cout << c << endl ;

  f = 70.0/3.0;
  cout << f << endl ;
 
  return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

30
23.3333

当然我们不可能拿声明干这样幼稚的事情,声明一般有两种用法(都是告诉编译器我们定义的变量长什么样)


声明枚举

在使用枚举的时候必须要有枚举的定义

file1:

#ifndef  _TEST_
#define _TEST_
enum A {AA,BB,CC};
#endif

连接下面两个文件

file2

include"file1"
enum A  a=AA;

file3

include“file1”//必须包括
extern enum A a;


Tips:

extern 还有一种用法extern“C”,有兴趣的可可以参照点击打开链接


C++ 中的变量定义

变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:

type variable_list;

在这里,type 必须是一个有效的 C++ 数据类型,可以是 char、w_char、int、float、double、bool 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:

int    i, j, k;
char   c, ch;
float  f, salary;
double d;

int i, j, k; 声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。

变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:

type variable_name = value;

下面列举几个实例:

extern int d = 3, f = 5;    // d 和 f 的声明 
int d = 3, f = 5;           // 定义并初始化 d 和 f
byte z = 22;                // 定义并初始化 z
char x = 'x';               // 变量 x 的值为 'x'

不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。


typedef

typedef是给变量和类创建别名用的一个关键字,格式如下

typedef typeName aliasName

比如

typedef char byte

现在byte就是char的别名了,之后我们就可以使用byte来代替char了。就像下面一样

byte b=‘A’;
const byte  ba[]="AAAA";

和这个有类似功能的就是#define了。但是它不适合定义多个变量。如下

#define BYTE char *
BYTE p c;//一个是char* 一个是char
typedef char* byte
byte p1,p2;//两个都是char*







变量持续性

变量的持续性又叫变量的生命周期。可以分为以下几种

1自动存储持续性:典型的案例就函数中定义的变量和函数参数,函数运行时为它们分配内存,运行完毕自动回收内存,使用栈的方式实现

2静态存储持续性:函数之外定义的变量和static修饰的变量它们的持续性为静态,静态的意思是说它们在整个程序运行过程中都是存在的

3线程存储持续性:(c++11) 让计算放在可并行处理的不同线程中。使用thread_local声明

4动态存储持续性:new分配处来的空间,这块区域有程序决定产生和消失。使用堆的方式实现



变量的连接性

众所周知c++的编译会经过一个叫做连接的部分,这个部分是把不同的编译单元连接在一起称为一个完整的程序。而连接性就是描述名称在不同编译单元的可见性,分为如下几种
1外部连接性(多个文件之间共享):全局变量连接性就是外部的
2内部连接性(只能在本单元中共享):静态变量或者时const全局变量(c++修改了const全局变量的连接性规则)
3无连接性(不能共享):局部变量

变量的作用域

作用域描述了变量在多大范围之内可见 可分全局变量和局部变量

全局变量


在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。

全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量:

#include <iostream>
using namespace std;
 
// 全局变量声明
int g;
 
int main ()
{
  // 局部变量声明
  int a, b;
 
  // 实际初始化
  a = 10;
  b = 20;
  g = a + b;
 
  cout << g;
 
  return 0;
}

在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:

#include <iostream>
using namespace std;
 
// 全局变量声明
int g = 20;
 
int main ()
{
  // 局部变量声明
  int g = 10;
 
  cout << g;
 
  return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

10

tips:

static 和const的全局变量连接性是内部的,而不同的全局变量连接性都是外部的。但是它们的持续性都是在程序整个运行过程中都是存在


局部变量

{}(块)中定义的变量和函数的形参都是局部变量
#include <iostream>
using namespace std;
 
int main ()
{
  // 局部变量声明
  int a, b;
  int c;
 
  // 实际初始化
  a = 10;
  b = 20;
  c = a + b;
 
  cout << c;
 
  return 0;
}


tips:

局部静态变量的连接性是无,持续性是程序的整个生命周期



初始化局部变量和全局变量

当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

数据类型初始化默认值
int0
char'\0'
float0
double0
pointerNULL

正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。




C++ 中的左值(Lvalues)和右值(Rvalues)

C++ 中有两种类型的表达式:

  • 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
  • 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int g = 20;

但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值