技术交流QQ群:1027579432,欢迎你的加入!

1.cpp变量类型

  • 变量实际上是存储空间的名称,cpp中每个变量都有指定的类型,类型决定变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可以作用在变量上。
  • 变量名可以是字母 数字 下划线组成,必须以字母或下划线开头。区分大小写
  • 几种基本的变量类型:


    基本的变量类型.png

2.cpp中的变量定义

  • 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量的定义指定一个数据类型,并包含该类型的一个或多个变量的列表,例如:
    格式:type variable_list;
    
  • type必须是基本数据类型或用户自定义的数据类型(如 类),variable_list可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔,例如:
    int i, j, k;  // 声明并定义了变量i, j, k,指示编译器创建类型为int的名为i,j,k的变量 
    char c, d, e;
    float f, ss;
    double d;
    
  • 变量可以在声明的时候被初始化,初始化器由一个等号后跟一个常量表达式组成,例如:
    格式:  type variable_name = value;
    extern int d = 3, f = 6;  // d 和 f 的声明
    int d = 3, f = 5;  // 定义并初始化 d 和 f
    byte z = 22;
    char x = 'x';
    
  • 不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的

3.cpp中的变量声明

  • 变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
  • 当使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。可以使用extern关键字在任何地方声明一个变量。虽然可以在C++程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
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;
}
  • 同样的,在函数声明时,提供一个函数名,而函数的实际定义则可以在任何地方进行。
// 变量的声明
extern int a, b;
extern int c;
extern float f;

// 函数声明
int func();



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;

    // 函数调用
    int i = func();
    return 0;
}

// 函数定义
int func(){
    return 0;
}

4.cpp中的左值和右值

  • cpp中的两种类型的表达式:
    • 左值:指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
    • 右值:存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
  • 变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。
int g = 20;
10 = 20;  报错!

5.变量的类型转换

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

6.变量定义与声明的区别

  • 定义包含了声明,但是声明不包含定义,变量声明是不会为变量开辟内存空间的,当初始化时,初始化必须有存储空间来进行,此时开始分配内存。如:
        int a = 0;     //定义并声明了变量 a
        extern int a;  //只是声明了有一个变量 a 存在,具体 a 在哪定义的,需要编译器编译的时候去找。