• C++语法基础(2)——顺序结构程序设计



    青舟智学×datawhale,仅为自己学习笔记,推荐大家参加datawhale组队学习注册青舟智学进行学习,侵权的话就删哈

    顺序结构程序设计

    数据类型

    什么是数据类型

    • 在C++的变量声明中,变量名之前需要指定数据类型
    • 数据类型将会决定一个变量存储什么样的信息,从而决定变量的容量有多大,在内存中需要分配多大的空间。
    • C++的数据类型分别为基本类型复合类型
    • 其中基本类型包括了整数浮点数
    • 复合类型是在基本类型的基础上创建的,包括数组字符串以及结构体等。

    整数类型

    • 整数类型分为数值整数类型字符类型
    • 数值整数用来表示没有小数部分的数字。
      • 数值整数可以按照占用内存大小分为shortintlong以及long long这四种,占用内存越大的类型能表示的数值范围就更大。
      • 同时又可以按照是否表示负值分为有符号版本和无符号版本
    • 字符类型则专门用来存储计算机中的基本符号:英文字母、数字以及标点等。

    整数类型-数值整数类型

    • short类型至少占据2个字节,即16位;一般占用2字节;

    • int在现代系统中一般占用4个字节,即32位;类型长度大于等于short类型;

    • long类型长度至少占据4个字节,且大于等于int类型;一般占用4个字节;

    • long long类型长度至少占据8个字节,且大于等于long类型;一般占用8个字节。

    • 计算机内存采用二进制的存储方式,每一个位可以表示0与1两种状态,因此占据 n n n位的内存块,可以表示 2 n 2^n 2n 个不同的数字。

      • 比如一个 8 位的内存块,可以表示 2 的 8 次方个不同的组合,也就是说能表示 256 个不同的整数;
      • 32 位的int类型,可以表示 2 32 = 4294967296 2^{32} = 4294967296 232=4294967296个不同的整数。
    • 每个类型数据可以分别指定有符号版本无符号版本,用来明确该类型是否需要表示负值。

      • 比如unsigned int就表示无符号的int类型,只能表示正值;
      • signed int就表示有符号的int类型,可以表示负值。
      • 在不指定有无符号时,都默认是有符号版本。
    • 如果是无符号版本,那么一个8位的内存块可以一一对应到0~255之间的整数;

    • 如果是有符号版本,那么就会考虑负数,这个8位的内存块可以表示**-128~127**之间的整数。

    short price = 500;    // 单价
    int coupon = -2000;   // 优惠
    long total = 48000;   // 总价
    
    • 1
    • 2
    • 3

    一定要注意每种类型能表示的范围,例如

    short total = 48000;  // 总价
    cout << "总价为:" << total << "元。\n";
    
    • 1
    • 2
    总价为:-17536元。
    
    • 1

    这是由于short默认状态下是符号类型,占据16位内存,数据范围在-32768~32767之间,所以无法正确表示48000。

    在确定变量的数值不会是负数的情况下, 我们可以利用unsigned关键字,加在原有数据类型之前,创建无符号的整数类型。

    unsigned short bike = 6;           // 单车数
    unsigned int car = 58000;          // 汽车数
    unsigned long people = 16825000;   // 总人数
    
    • 1
    • 2
    • 3

    整数类型-字符整数类型

    • 字符类型char是另一种特殊的整数类型,它专门用来存储计算机中的基本符号:英文字母、数字以及标点等。
    • 计算机通过ASCII编码,将128个字符映射到对应数字上,于是我们使用一个字节(8位)就可以将所有的字符表示出来。
    • 储存在类型为char的变量中的实际上是一个整数,对应于这个字符的ASCII编码值。
    • 所以,我们可以使用字符常量,也可以使用字符对应的ASCII编码,来给char类型的变量赋值。
    // 用字符常量初始化一个 char 类型
    char size_1 = 'L';
    // 用整数常量初始化一个 char 类型,字符L的ASCII编码值为76
    char size_2 = 76;
    
    • 1
    • 2
    • 3
    • 4

    浮点类型

    • 计算机用浮点数表示两类数:
      • 小数部分的数字; 例如:圆周率3.14、黄金分割比例0.618等,这些数字在整数之间
      • 数值非常的数字。 例如:宇宙中原子个数约10的80次方,这个数字已经无法被long long整型表示
    • C++中的浮点数分为三种类型:floatdouble以及long double,分别表示不同的精度。
    • 浮点数的精度在于它可以表示的有效位数以及指数范围。其中指数范围指的是可以表示的指数幂次大小;
    • 有效位数用来描述浮点数值的刻画精确程度。例如:3.14的有效位数是3位,3.1415926的有效位数是8位。
    • 在三种浮点类型中,更大的内存空间可以表示更多的有效位数:
      • float类型通常占用4个字节,有效位数为6位
      • double类型占用的空间是float类型的两倍,即8个字节,有效位数为15位
      • long double类型一般占用16个字节的空间
    float ratio = 0.618;           // 黄金分割比例
    double pi = 3.1415926;          // 圆周率
    long double atom = 1e80;   // 宇宙中原子个数
    
    • 1
    • 2
    • 3

    输入输出

    C语言格式化输入输出

    • printf()函数和scanf()函数进行格式化的输出输入
    • 格式化的意义是按指定的格式输入输出值,就是两个函数关键字的最末一个字母f(format)。
    • 在C++中,需要使用预处理指令include加载对应的头文件cstdio,并且使用标准命名空间std,完成格式化输入输出。
    #include <cstdio>
    using namespace std;
    
    • 1
    • 2

    C语言格式化输出

    printf(格式字符串, 待打印项1, 待打印项2, ...); 
    
    • 1
    const float kPrice = 3.5;    // 波波笔单价
    int num = 6;                 // 波波笔数量
    
    // 格式化字符串为 "波波笔的单价是:%f元,您购买了%d支。\n"
    // 其中,%f的地方用kPrice填充,%d的地方用num填充
    printf("波波笔的单价是:%f元,您购买了%d支。\n", kPrice, num); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    波波笔的单价是:3.500000元,您购买了6支。
    
    • 1

    在这里插入图片描述例如,"%+4.2f"表示打印一个浮点数,显示该浮点数的正负号,字段宽度为4个字符,其中小数点后有两位数字。
    在这里插入图片描述

    C语言格式化输入

    scanf(格式字符串, 地址项1, 地址项2, ...); 
    
    • 1
    • 输入函数的功能是通过程序将键盘获取的字符构成的字符串转换成对应整数类型的数值。
    • scanf()函数中的格式字符串用来表明字符输入的目标数据类型。
    • printf()函数不同,scanf()函数中的地址项是变量对应的内存地址,用来装载对应的输入数据。获取地址的规则如下:
      • 使用scanf()函数读取基本变量类型的值,在变量名前加上一个&
      • 使用scanf()函数将字符串读到字符数组中,则不要使用&,关于字符数组的使用将在之后的内容中进行讲解。
    const float kPrice = 3.5;    // 波波笔单价
    int num;                     // 波波笔数量
    
    printf("请输入您购买波波笔的数量:\n"); 
    // 输入数量num,%d表示是整数
    scanf("%d", &num); 
    printf("波波笔的单价是:%4.2f元,您购买了%2d支。\n", kPrice, num);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    请输入您购买波波笔的数量:
    
    • 1
    请输入您购买波波笔的数量:
    12
    波波笔的单价是:3.50元,您购买了12支。
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    C++流数据输入输出

    • C++形象地将数据输入和输出的传送过程称为(stream)
    • C++的标准函数库iostream中提供了输入输出(I/O)功能。需要使用预处理指令include加载对应的头文件,并且使用标准命名空间std。
    #include<iostream>
    using namespace std;
    
    • 1
    • 2

    以下讨论C++编程中最基本的标准输入输出操作,即使用cincout对系统指定的标准设备的输入和输出

    C++流数据输出

    cout << 输出内容1 << 输出内容2 <<...;
    
    • 1
    • cout不是C++预定义的关键字,而是在iostream中定义的一个容纳数据的载体
    • 符号"<<"在C++中的iostream头文件中进行了重新定义,重载为具有输出功能的符号,称为插入运算符,能够识别C++中所有的基本类型。
    • 与C语言一样,符号<<在C++中是被定义为左位移运算符。但这里在iostream头文件中对它进行了重新定义插入运算符
    • 可以多次使用<<运算符进行组合,在单个输出语句中打印不同的变量,字符串等。运算符的组合不引入额外的输出内容。
    • 多个输出语句的内容之间默认进行换行,需要借助转义字符’\n’或之前学习的endl执行换行操作。
    const float kPrice = 3.5;    // 波波笔单价
    int num = 6;                 // 波波笔数量
    cout << "波波笔的单价是:" << kPrice << "元,";
    cout << "您购买了" << num << "支。\n";
    
    • 1
    • 2
    • 3
    • 4
    波波笔的单价是:3.5元,您购买了6支。
    
    • 1
    • 使用默认的cout输出无法直接控制数字显示的宽度、浮点数显示的位数等显示细节。
    • 此外,对于字符串与变量相间输出的情况,会使得代码变得繁琐,需要使用多个<<运算符进行组合输出。

    C++流数据输入

    • iostream中定义的cin,用来将标准输入转化为字节流。使用格式为:
    cin >> 内存存储单元1 >> 内存存储单元2 >> ...; 
    
    • 1
    const float kPrice = 3.5;    // 波波笔单价
    int num;                 // 波波笔数量
    cout << "请输入您购买波波笔的数量:" << endl;
    cin >> num;
    
    • 1
    • 2
    • 3
    • 4
    • 头文件iostream将符号">>"重载为具有输入功能的符号,称为抽取运算符,能够识别C++中的字符型、整型以及浮点型数据类型。
    • 抽取运算符支持连续的输入,可以使用多个>>运算符进行组合,获得多个输入内容,并且存储在不同的变量之中。
    float sqaure_price;    // 每平方单价
    float total_price;    // 房屋总价
    cout << "请输入房屋每平方单价与房屋总价:" << endl;
    cin >> sqaure_price >> total_price;
    
    • 1
    • 2
    • 3
    • 4

    我们运行程序后根据提示信息,依次输入输入房屋每平方单价与房屋总价,之间以回车键进行分隔。

    请输入房屋每平方单价与房屋总价:
    5.5e4
    7650000
    
    • 1
    • 2
    • 3
    • 使用cin进行数据输入时,与之前介绍的scanf()函数的一个区别是:如果我们没有按照内存存储单元的存储类型进行输入,系统会自动返回0。

    算术运算符与表达式

    算术与赋值运算符

    C++中的基本算术运算分为如下5种:加法(+)和减法(-),乘法(*)和除法(\)以及求模(%)

    赋值运算符

    C++中,"="被称作赋值运算符,代表把表达式的值赋给变量的操作

    优先级和结合律

    • 对于算术运算符,遵循的是通常的代数优先级
    • C++使用()圆括号对来明确计算的顺序,在()中的表达式具有最高的计算优先级。
    • 优先级相同的两个运算符,通过结合律来决定计算的先后顺序
    • 算术运算符的结合律都是从左到右的
    • 赋值运算符的结合律是从右到左的

    自增自减运算符

    • C++中的++其实也是一种运算符,称为自增运算符
      • ++运算符只能作用在变量操作数上,可以使该变量的值在原来基础上递增1
      • 分为前缀模式++coffee和后缀模式milk++
      • 前缀模式的变量将先于赋值运算符进行递增
      • 后缀模式的变量将后于赋值运算符进行递增
    int coffee_box;
    int milk_box;
    int coffee = 0;
    int milk = 0;
    coffee_box = ++coffee;  //前缀模式
    milk_box = milk++;  //后缀模式
    printf("coffee_box = %d, coffee = %d. \n", coffee_box, coffee);
    printf("milk_box = %d, milk = %d. \n", milk_box, milk);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    coffee_box = 1, coffee = 1. 
    milk_box = 0, milk = 1. 
    
    • 1
    • 2
    • C++中与自增运算对应的是自减运算,使用自减运算符--

    计算且赋值运算符

    在这里插入图片描述

    位运算符与表达式

    C++按位运算符

    • 在计算机中,数据以二进制的形式储存
      • 每8位(bit)构成一个字节(byte)
      • 每个位具有01两种状态中的一种
        通过多个字节组合,内存以二进制形式存放数值。例如,
    • 字符类型char的常量7大小为1个字节
      • 存储为8位二进制数:0000 0111
    • 整数类型int的常量7大小为4个字节
      • 存储为32位二进制数:0000 0000 0000 0000 0000 0000 0000 0111

    C++中共包含6种按位运算符

    • 按位与运算符&
    • 按位或运算符|
    • 异或运算符^
    • 按位取反运算符~
    • 左移运算符<<
    • 右移运算符>>

    按位运算符只能对字符整型以及数值整型数据类型的常量变量使用,不能对浮点类型数据进行计算。

    位与运算符

    在这里插入图片描述

    int A = 60; // 0011 1100
    int B = 13; // 0000 1101
    
    cout << "A & B = " << (A & B) << endl;
    
    • 1
    • 2
    • 3
    • 4
    A & B = 0000 1100
    
    • 1
    A & B = 12
    
    • 1

    位或运算符

    在这里插入图片描述

    int A = 60; // 0011 1100
    int B = 13; // 0000 1101
    
    cout << "A | B = " << (A | B) << endl;
    
    • 1
    • 2
    • 3
    • 4
    A | B = 0011 1101
    
    • 1
    A | B = 61
    
    • 1

    位异或运算符

    在这里插入图片描述

    int A = 60; // 0011 1100
    int B = 13; // 0000 1101
    
    cout << "A ^ B = " << (A ^ B) << endl;
    
    • 1
    • 2
    • 3
    • 4
    A ^ B = 0011 0001
    
    • 1
    A ^ B = 49
    
    • 1

    位取反运算符

    二进制位取反规则是0110

    int A = 60; // 0011 1100
    
    cout << "~A = " << (~A) << endl;
    
    
    • 1
    • 2
    • 3
    • 4
    ~A = 1100 0011
    
    • 1
    • 在计算机中,所有的二进制数据都是用补码保存的。
    • 正数的补码就是原码本身
      • 正数变量A的原码为0011 1100,补码同样等于0011 1100
    • 负数的补码是在其原码的基础上,符号位不变,其余各位取反然后`+1
      • 负数变量~A的原码为1100 0011,补码等于1011 1100 + 1 = 1011 1101,值为-61,故~A = -61
        根据取反运算的规则,打印结果可得:
    ~A = -61
    
    • 1

    个对操作数取反运算的简单规律是:会得到比原先操作数的相反数还小1的结果。

    左右移运算符

    • 在C++中,左移运算符<<可以将一个操作数的各二进制位全部左移若干位。
      • 左边多余的二进制位将被丢弃
      • 右边不足的二进制位将被补0
    int A = 60; // 0011 1100
    
    cout << "A << 1 = " << (A << 1) << endl;
    
    • 1
    • 2
    • 3
    A << 1 = 0111 1000
    
    • 1
    A << 1 = 120
    
    • 1

    在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2运算。

    • 在C++中,右移运算符>>可以将一个操作数的各二进制位全部右移若干位。
      • 右侧多余的位将会被舍弃
      • 左侧对于无符号数,会在左侧补0
      • 左侧对于有符号数,会用符号位补齐:正数为0,负数为1
    int A = 60; // 0011 1100
    
    cout << "A >> 2 = " << (A >> 2) << endl;
    
    • 1
    • 2
    • 3
    A >> 2 = 0000 1111
    
    • 1
    A >> 2 = 15
    
    • 1
  • 相关阅读:
    树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
    Android——gradle构建知识片-散装版
    SpringBoot学习之注解校验参数@Validated@Valid
    JavaWeb-深度解析转发和重定向
    revit族库插件:CAD图块做成Revit族文件和族加密操作
    el-table操作列动态自适应设置(根据操作项个数动态设置宽度)
    封阳台窗户怎么选
    每日杂学:页面加载出现白页
    程序、进程与线程
    【微信小程序】一文解决button、input、image组件
  • 原文地址:https://blog.csdn.net/qq_44941689/article/details/125541911