C++ 变量类型,C++ 变量声明和定义的区别

c++ c++ 2166 人阅读 | 0 人回复

发表于 2022-11-26 15:29:00 | 显示全部楼层 |阅读模式

C++ 变量类型
变量其实只不过是程序可操作的存储区的名称。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C++ 是大小写敏感的。
基于前一章讲解的基本类型,有以下几种基本的变量类型,将在下一章中进行讲解:
类型
描述
bool存储值 true 或 false。
char通常是一个字符(八位)。这是一个整数类型。
int对机器而言,整数的最自然的大小。
float
单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。
c  var1.png
double
双精度浮点值。双精度是1位符号,11位指数,52位小数。
c  var2.png
void表示类型的缺失。
wchar_t宽字符类型。
C++ 也允许定义各种其他类型的变量,比如枚举、指针、数组、引用、数据结构、类等等,这将会在后续的章节中进行讲解。
下面我们将讲解如何定义、声明和使用各种类型的变量。
C++ 中的变量定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
c  var3.png
变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:
type variable_list;
在这里,type 必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:
  1. int    i, j, k;
  2. char   c, ch;
  3. float  f, salary;
  4. double d;
复制代码
int i, j, k; 声明并定义了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。
变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号,后跟一个常量表达式组成,如下所示:
type variable_name = value;
下面列举几个实例:
  1. extern int d = 3, f = 5;    // d 和 f 的声明
  2. int d = 3, f = 5;           // 定义并初始化 d 和 f
  3. byte z = 22;                // 定义并初始化 z
  4. char x = 'x';               // 变量 x 的值为 'x'
复制代码
C++ 中的变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
实例
尝试下面的实例,其中,变量在头部就已经被声明,但它们是在主函数内被定义和初始化的:
  1. #include <iostream>
  2. using namespace std;

  3. // 变量声明
  4. extern int a, b;
  5. extern int c;
  6. extern float f;
  7.   
  8. int main ()
  9. {
  10.   // 变量定义
  11.   int a, b;
  12.   int c;
  13.   float f;

  14.   // 实际初始化
  15.   a = 10;
  16.   b = 20;
  17.   c = a + b;

  18.   cout << c << endl ;

  19.   f = 70.0/3.0;
  20.   cout << f << endl ;

  21.   return 0;
  22. }
复制代码
当上面的代码被编译和执行时,它会产生下列结果:
30
23.3333
同样的,在函数声明时,提供一个函数名,而函数的实际定义则可以在任何地方进行。例如:
  1. // 函数声明
  2. int func();

  3. int main()
  4. {
  5.     // 函数调用
  6.     int i = func();
  7. }

  8. // 函数定义
  9. int func()
  10. {
  11.     return 0;
  12. }
复制代码
C++ 中的左值(Lvalues)和右值(Rvalues)
C++ 中有两种类型的表达式:
  • 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
  • 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;

变量的类型间是可以互相转换的,转换又分为自动转换和强制转换。
自动转换规则:
  • 1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
  • 2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。     a、若两种类型的字节数不同,转换成字节数高的类型     b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  • 3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  • 4、char型和short型参与运算时,必须先转换成int型。
  • 5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度:
  1. int a=1;
  2. double b=2.5;
  3. a=b;
  4. cout << a; //输出为 2,丢失小数部分
复制代码
  1. int a = 1;
  2. double b = 2.1;
  3. cout << "a + b = " << a + b << endl;  //输出为a + b = 3.1
复制代码

强制转换规则:
强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型
  1. int a = 1;
  2. double b = 2.1;
  3. cout << "a + b = " << a + (int)b << endl;  //输出为a + b = 3
复制代码

现在才算理解声明和定义的区别了:
定义包含了声明,但是声明不包含定义,如
  1. int a = 0;     //定义并声明了变量 a
  2. extern int a;  //只是声明了有一个变量 a 存在,具体 a 在哪定义的,需要编译器编译的时候去找。
复制代码
函数也是类似,定义的时候同时声明。但如果只是声明,编译器只知道有这么个函数,具体函数怎么定义的要编译器去找。
  1. void fun1();  //函数声明

  2. void fun1(){  //函数定义
  3.     cout<<"fun1"<<endl;
  4. }
复制代码
变量左值可以出现在等式的左边或者右边。出现在左边可以用来判锻NULL,以防出现逻辑错误
  1. #include "stdafx.h"

  2. int  *a = NULL;
  3. int main()
  4. {

  5.     if (a = NULL)//赋值语句,并非判断语句
  6.     {
  7.         return false;
  8.     }
  9.     if (NULL = a)//!!!!ERROR  此处在程序编译阶段不通过,“=”右边不能为变量名

  10.     {
  11.         return false;
  12.     }
  13.     if (a == NULL)//可行 ,判断指针a是否为空
  14.     {
  15.         return false;
  16.     }
  17.     if (NULL == a)//可行 ,判断指针a是否为空。在实际项目中,为了防止将“==”误写作“=”推荐讲变量名写在右侧,编译器可以帮助寻找错误
  18.     {
  19.         return false;
  20.     }

  21.     return 0;
  22. }
复制代码

C/C++ 编译 cpp 文件是从上往下编译,所以 main 函数里面调用其他函数时,如果其他函数在 main 函数的下面,则要在 main 函数上面先声明这个函数。
或者把 main 函数放在最下面,这个不仅限于 main 函数,其他函数的调用都是如此。被调用的函数要在调用的函数之前声明。

用 extern 声明外部变量是不能进行初始化:
c  var4.png
为什么会这样呢?因为 extern int a; 只是声明而不是定义,声明是不会为变量开辟内存空间的,自然无法对其进行初始化的操作。

c  var5.png
c  var6.png

extern 关键字声明在变量和函数之前的说明。
1、作用在变量之前
变量只允许定义一次,但可以在多个文件中声明。
Test.cpp 中:
int s32Val = 0;     // 定义一个变量 s32Val,并赋初值为 0
Test1.cpp 中:
extern int s32Val;  // 声明变量 s32Val,它在 Test.cpp 中被定义,此处不可赋值
Test2.cpp 中:
extern int s32Val;  // 声明变量 s32Val,它在 Test.cpp 中被定义,此处不可赋值
2、作用在函数之前
Test.h:
extern void Fun();   // 函数声明,extern 用于标识次函数为外部可调用函数
Test.cpp:
void Fun();  // 函数定义


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则