1、C++的数据类型

    1.数据和类型**

    • 计算机处理的对象是**数据,而数据是以某种特定的形式存在的(例如整数 浮点数 字符等形式) **

    • 不同的数据之间往往还存在某些**联系**(例如由若干个整数组成一个整数数组)。

    • 数据结构指的是数据的组织形式**。例如,数组就是一种数据结构。**



    * 一、数据类型与表达式 - 图1 | 类型 | 类型标识符 | 字节 | 数值范围 | | | —- | —- | —- | —- | —- | | 整型 | [signed] int | 4 | -2147483648 ~ +2147483647 | | | 无符号整型 | unsigned [int] | 4 | 0 ~ 4294967295 | | | 短整型 | short [int] | 2 | -32768 ~ +32767 | | | 无符号短整型 | unsigned short [int] | 2 | 0 ~ 65535 | | | 长整型 | long [int] | 4 | -2147483648 ~ +2147483647 | | | 无符号长整型 | unsigned long [int] | 4 | 0 ~ 4294967295 | | | 字符型 | [signed] char | 1 | -128 ~ +127 | | | 无符号字符型 | unsigned char | 1 | 0 ~ 255 | | | 单精度 | float | 4 | 3.410~3.410 | | | 双精度型 | double | 8 | 1.710~1.710 | | | 长双精度型 | long double | 8 | 1.710~1.7*10 | |

    2.常量与变量

    • 常量:在程序运行过程中,其值一直保持不变的量为常量

      1. 常量也区分不同的类型:3040 为整型,30.040.0为实型,<br /> 编辑器只是根据其表面形式来判断其类型。
    • 变量:在程序运行过程中,其值可以改变的量为变量 。

    变量在程序执行中能够赋值,发生变化。变量有一个名字,并在使用之前要说
    明其类型,一经说明,就在内存中占据与其类型相应的存储单元。
    不管什么类型的变量,都是说明在前,使用在后。

    • 变量的存储类型

      • auto存储类

        1. 属于一时性存储,其存储空间可以被若变量多次覆盖使用
      • register存储类

        1. 存放在通用寄存器中。
      • extern存储类

        1. 在所有函数和程序段中都可引用。
      • static存储类

        1. 在内存中是以固定地址存放的,在整个程序运行期间都有效。
    • 变量名的命名方法

      • 变量名、数组名、函数名、数组名、函数名…称为标识符。
      • 标识符只能由字母、数字、下划线这三种字符组成,且第一个字符必须为字母或下划线,长度不大于247个字符,大小写不通用。
      • 关键字不能作为标识符,关键字即是VC++的语法要求中使用的字, 如int if while 等。

        1. 正确的标识符:INT, sum , de12, SUM等。
      • 变量必须使用前定义,以分配空间

      • 命名方式

    一般变量都是用匈牙利命名法命名的:
    ** 匈牙利**命名法是种一编程时的命名规范
    基本原则是:变量名=属性+类型+对象描述
    **

    • 变量赋初值
      • 定义变量时,计算机会在内存中开辟一个空间,空间中为随机值,随后可以给这个空间赋值。空间的值在程序运行中可以改变。


    3.整型数据**

    • 整型常量
      • 整形量是没有小数点的整数。
      • 范围: -2的31次方 ~ 2的31次方 - 1
      • 三种形式: (1)十进制 (默认) 例: 43、 1345 、87654

    (2)八进制 (以0开头) 例: 053、02501、0253146
    (3)十六制 (以0x开头) 例: 0x2B、0x541、0x15666

    • 整形变量
      • 有符号型:short 在内存中占两字节 范围为 -2的15次方 ~ 2的15次方 - 1

    int 在内存中占四字节 范围为 -2的-31次方 ~ 2的31次方 - 1
    long 在内存中占四字节 范围为 -2的-31次方 ~ 2的31次方 - 1

    • 无符号型:最高位不表示符号位

    unsigned short 在内存中占两字节 范围为 0 ~ 2的16次方 - 1
    unsigned int 在内存中占四字节 范围为 0 ~ 2的32次方 - 1
    unsigned long 在内存中占四字节 范围为 0 ~ 2的32次方 - 1

    • 说明

    (1)整型常量也有长短之分,常量无unsigned型,但一个非负的整形常量可赋给 unsigned型的变量
    (2)若一个常量定义为长整形数,则在其后家l或L进行区分。
    如:32L 、 564 l

    • 整型数据在内存中的存储方式

    一个数在内存中为:
    批注 2020-08-06 170947.png
    当这个数是有符号数时,为-1;为无符号数时,为2-1
    内存中的数以补码的形式存放
    例:

    1. #include<iostream.h>
    2. void main()
    3. {
    4. unsigned short a;
    5. short int b = -1;
    6. a=b;
    7. cout<<"a="<<a<<endl;
    8. }

    运行结果: a=65535
    解析: 不同类型的整型数据间的赋值就是按存储单元中的存储形式直接传送。
    批注 2020-08-06 173155.png
    如上图,a、b的存储形式在内存中相同,输出时,由于a、b的数据类型不同,输出的值也不同。

    • 实型数据
      • 实型数据又称浮点数,有两种表示方式:

    (1)十进制形式: 23.0、24.5、3.56789
    (2)指数形式: 23E1、145e-1、356789e1
    注:e前有数字,后面必须是整数

    • 实型变量分单精度 float和双精度 double 两种形式:

      1. 1float:占四字节,提供7~8位有效数字。<br /> 2double:占八字节,提供15~16位有效数字。
    • 当计算机中出现小于机器所能表示的最小数时,机器只能当0来处理,当出现超过机器所能表示的最大数时,出现溢出现象。定点数、浮点数均会出现溢出现象。

    4.字符型数据(char)

    • 字符型数据实际上是作为整型数据在内存中存储的
      计算机以字符编码的形式处理字符,因此在计算机内部以ASCLL码的形式表示所有字符。
    • 7位二进制数即可表示一个字符,用一个字节存储一个字符

    例: A的ASCLL码为65,在内存中表示为:
    批注 2020-08-06 223338.png

    • 定义一个字符型变量时,要用’ ‘把字符括起来。

      1. 可直接用字符的整型值给变量赋值
      1. char grade;
      2. //以下赋值形式等效
      3. grade='A';
      4. grade=65;
      5. grade=0x41;
      6. grade=0101;


    • 非打印字符

      • 有些ASCLL的字符代表操作,不能打印

        1. 如:回车、退格等,可用两种方式表示这些字符<br /> 1ASCLL码的形式 char re= 13;<br /> 2)用转义字符 char re=' \r';
    转义字符 含义 ASCLL代码
    \a 响铃 7
    \n 换行,将当前位置移到下一行开头 10
    \t 水平制表(跳到下一个tab位置) 9
    \b 退格,将当前位置移到前一列 8
    \r 回车,将当前位置移到本行开头 13
    \f 换页,将当前位置移到下页开头 12
    \v 竖向跳格 8
    \\ 反斜杠字符“\” 92
    \‘ 单引号(撇号)字符 39
    \‘’ 双引号字符 34
    \0 空字符 0
    \ddd 1到3位8进制所代表的字符
    \xhh 1到2位16进制数所代表的字符 25


    • 转义字符包含多个字符,但它只代表一个字符。编译系统在见到字符“\”时,会接着找它后面的字符,把它处理成一个字符,在内存中只占一个字节

    5.字符串常量

    • 用” “表示,在内存中按顺序存放,以’\0’结束。

    如:”CHINA “
    批注 2020-08-06 233105.png
    实际内存是对应字符的ASCLL码格式
    批注 2020-08-06 233105.png
    注:’a’在内存中占一个字节,”a”占两个字节

    6.标识符常量

    • 定义标识符常量的两种方式:

    1)一种是使用编译预处理指令;
    2)一种是使用C++的常量说明符const。
    例:

    1. #define PRICE 30
    2. //程序中出现的PRICE均用30替代
    3. #define PI 3.1415926
    4. #define S "China"

    7.强制转换类型

    • 语法: (类型名) (表达式)

    如: (double)a 、 (int)(x+y) 、(int) 6.2%4 = 2

    • 强制类型运算后原变量不变,但得到一个所需类型的中间变量。

    例:

    1. int x;
    2. float y = 5.8;
    3. x=(int) y;

    结果: x=5,y=5.8

    2、运算符
    1.运算符的类型

    • 算术运算符 +(加), -(减), *(乘) , / (除) , %(整除求余) , ++(自加) , —(减)
    • 关系运算符 >(大于), <(小于), ==(等于), >=(大于或等于), <=(小于或等于)
    • 逻辑运算符 &&(逻辑与)、||(逻辑或)、!(逻辑非)
    • 位运算符 <<(按位左移)、 >>(按位右移)、 &(按位与)、 |(按位或)、 ^(按位异或)、

    ~(按位取反)

    • 赋值运算符 =(等号及其拓展赋值运算符)
    • 杂项运算符 条件运算符(?:)、逗号、指针运算符(*)、引用运算符和地址运算符(&)、

    求字节运算符(sizeof)、强制类型转换运算符、成员运算符(.)、指向成员运算
    符(->)、下标运算符([ ])等

    2.运算符优先级
    批注 2020-08-06 233105.png

    3.自增、自减运算符**

    • 只能用于变量,不可用于常量和表达式,因为表达式在内存中没有具体空间,常量所占的空间不能重新赋值。
    • 结合方式:自右至左,优先级次高
    • 自增、自减运算符在变量前面时,先运算后赋值;在后面时,先赋值,后运算。

    4.sizeof()运算符

    • sizeof()是单目运算符,用于计算某个操作数类型的字节数。
    • 格式:sizeof(<类型>)

    例: sizeof( int ) //其值为4

    5.算术运算符和算术表达式

    • +(加), -(减), *(乘) , / (除) , %(整除求余) , ++(自加) , —(减)
    • 用算术运算符连接起来的式子是算术表达式
    • 两个整数相除结果为整数。 如:1/2=0 , 5/2=2
    • 整数才可求余,余数的符号与左边数的符号相同

    如: 3%2=1 , -3%2=-1 , 3%-2=1 , -3%-2=-1 , 8%4=0

    • 优先级与结合性

    优先级大小:() > 、/ 、%*> + 、- ,先乘除(余),后加减。
    结合性 :自左向右结合

    6.关系运算符和关系表达式

    • (大于), <(小于), ==(等于), >=(大于或等于), <=(小于或等于)

    • == 与= 的差异 =是赋值运算,==是判断是否相等
    • < 、 > 、 <= 、 >= 的优先级大于 == 、 !=
    • 算术运算符的优先级大于关系运算符的优先级

    • 关系表达式

      • 用关系运算符将表达式连接棋类称为关系表达式。
      • 关系表达式的结果只有两个,真为1,假为0。

    7.逻辑运算符

    • &&(逻辑与)、||(逻辑或)、!(逻辑非)

      • &&(逻辑与): 两边同为真,结果才为真,有一边为假,结果就为假。

        1. 设有结论ABA&&B的结果如下:<br /> ![批注 2020-08-07 095828.png](https://cdn.nlark.com/yuque/0/2020/png/2314091/1596765520345-24e3113b-b2dc-4569-a352-cbf63bcaa077.png#align=left&display=inline&height=161&margin=%5Bobject%20Object%5D&name=%E6%89%B9%E6%B3%A8%202020-08-07%20095828.png&originHeight=233&originWidth=211&size=11977&status=done&style=none&width=146)
      • ||(逻辑或):两边只要有一边为真,则结果为真,两边同为假,结果才为假。

    设有结论A、B,A||B的结果如下:
    批注 2020-08-07 095828.png

    • !(逻辑非):将真(1)转换为假(0),将假(0)转换为真(1)。

      设有结论A,!A的结果如下:
      批注 2020-08-07 095828.png

    注意:

    1. 优先级大小: > 算术 > 关系 > 逻辑 > 赋值 > 逗号
    2. 作为条件,所有非0值都为真;作为结果只有0或1两种
    3. 不可写为 1< x <10 , 正确写法: 1<x &&x<10
    4. 当前面的表达式可得出整个表达式的结果时,不必再求后面的表达式

    如: a&&b&&c,当a为0时,表达式为0,不必求b与c。

    例题:
    1.判断某年是否为闰年的表达式
    1)能被400整除;2)能被4整除,不能被100整除
    答案:

    1. (year%400==0)||(year%4==0&&year%100!=0)

    2.当c=4时,(c=1)&&(c=3)&&(c=5) 的值为
    答案: 1
    解析:表达式c=1将c的值变为1,为真

    8.赋值运算符和赋值表达式

    • “=”左边必须是变量名
    • 若“=”两边变量类型不同,在赋值时要进行类型转换;

      转换原则:根据左边的类型转换。

    • 少字节赋值给多字节变量

      • 若多字节变量为unsigned,则转换后多余字节补零。

    批注 2020-08-07 095828.png

    • 若多字节变量为有符号型,则转换后拓展少字节的最高位。

      1. ![批注 2020-08-07 095828.png](https://cdn.nlark.com/yuque/0/2020/png/2314091/1596767356937-90e7fa2e-d6c9-442e-b3d7-2d85340c714b.png#align=left&display=inline&height=134&margin=%5Bobject%20Object%5D&name=%E6%89%B9%E6%B3%A8%202020-08-07%20095828.png&originHeight=245&originWidth=653&size=20946&status=done&style=none&width=358)<br /> 转换后,数据的符号不变
    • 多字节赋值给少字节变量

    低位照搬
    例:

    1. int a =-1;
    2. short int b;
    3. b=a;

    结果: b=-1
    解析:
    批注 2020-08-07 095828.png

    • 复合的赋值运算符

      • a+=3 等价于 a=a+3
      • x=y+3 等价于 x=x(y+3)
      • x/=x-4 等价于 x=x/(x-4)
      • x+=y 等价于 x=x+y
      • i+=j— 等价于 i=i+(j—)
    • 赋值表达式

    a=b=5; 结果: b=5 ,a=5
    “=”的结合性为自右至左

    9.逗号运算符和逗号表达式

    • 表达式1,表达式2,表达式3,。。。,表达式n
    • 顺序求解,结果为最后一个表达式的值,并且优先级最低

    例: a=(3+4,5*6,2+1); a = 3

    10.各类数值型数据间的混合运算

    • 整型、实型、字符型数据间可以混合运算
    • 不同类型的数据要先转换成同一类型的数据再进行运算

    转换规则:

    1. ![128ff300a18b87d605f25679100828381e30fdbd_WPS图片.jpg](https://cdn.nlark.com/yuque/0/2020/jpeg/2314091/1596725011492-c99e8390-64fc-4134-a54c-e4d562980945.jpeg#align=left&display=inline&height=578&margin=%5Bobject%20Object%5D&name=128ff300a18b87d605f25679100828381e30fdbd_WPS%E5%9B%BE%E7%89%87.jpg&originHeight=578&originWidth=580&size=59072&status=done&style=none&width=580)