c++---------数据类型

news/2024/12/23 20:38:31 标签: c++, java, jvm
  1. 基本数据类型
    • 整数类型(Integral Types)
      • int(整型)
        • 这是最常用的整数类型,通常用于存储一般范围的整数值。在32位系统中,int类型一般占用4个字节,取值范围大约是 - 2147483648到2147483647。例如,int age = 25;用于存储人的年龄。
      • short(短整型)
        • 占用的内存空间比int小,通常为2个字节,适用于存储范围较小的整数。例如,short temperature = -10;可用于存储温度等范围相对较小的整数,其取值范围大约是 - 32768到32767。
      • long(长整型)
        • 用于存储较大范围的整数。在32位系统中,long通常占用4个字节,和int大小相同,但在64位系统中,long可能占用8个字节,取值范围更宽。例如,long population = 10000000000L;(注意后面的L后缀用于表示长整数常量)可用于存储人口数量等较大的整数值。
      • long long(长长整型)
        • 这是C++11新增的类型,一般占用8个字节,能存储更大范围的整数。例如,long long bigNumber = 9223372036854775807LL;(注意后面的LL后缀用于表示长长整数常量),其取值范围大约是 - 9223372036854775808到9223372036854775807。
      • unsigned修饰符(无符号整数类型)
        • 当在整数类型前加上unsigned时,变量只能存储非负整数,其取值范围从0开始。例如,unsigned int count = 0;用于计数等场景,unsigned int在32位系统中的取值范围是0到4294967295。
    • 浮点数类型(Floating - Point Types)
      • float(单精度浮点数)
        • 占用4个字节的内存,用于存储单精度浮点数。例如,float height = 1.75f;(注意后面的f后缀用于表示单精度浮点数常量)用于存储人的身高。float类型的有效数字位数相对较少,大约为6 - 7位。
      • double(双精度浮点数)
        • 占用8个字节的内存,能提供更高的精度,用于存储双精度浮点数。例如,double pi = 3.141592653589793;用于存储圆周率等需要高精度的数值。double类型的有效数字位数大约为15 - 16位。
      • long double(长双精度浮点数)
        • 占用的字节数和精度因编译器和系统而异,通常比double有更高的精度。例如,在一些系统中,long double可能占用10或16个字节,用于特殊的高精度计算场景。
    • 字符类型(Character Types)
      • char(字符型)
        • 用于存储单个字符,占用1个字节的内存。例如,char grade = 'A';用于存储学生成绩等级等单个字符。字符在内存中是以ASCII码(美国信息交换标准代码)或者其他字符编码(如UTF - 8)的形式存储的,在ASCII码中,字符'A'对应的十进制值是65。
      • wchar_t(宽字符型)
        • 用于存储宽字符,通常用于处理Unicode字符。其大小和编码方式取决于编译器和系统,一般占用2或4个字节。例如,wchar_t unicodeChar = L'你';(注意前面的L前缀用于表示宽字符常量)用于存储中文字符等宽字符。
  2. 复合数据类型
    • 数组(Arrays)
      • 定义和初始化:数组是一组相同类型的数据元素的集合。例如,int numbers[5];定义了一个包含5个int类型元素的数组。可以在定义时进行初始化,如int anotherNumbers[3] = {1, 2, 3};。数组的元素通过下标访问,下标从0开始,例如numbers[0]表示数组numbers的第一个元素。
      • 用途:用于存储和处理一组相关的数据。例如,存储学生的成绩int scores[30];,或者存储图像的像素颜色值等。
    • 结构体(Structures)
      • 定义和组成:结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员。例如:
      struct Student {
        int id;
        char name[20];
        float gpa;
      };
      
      定义了一个名为Student的结构体,包含学生的学号、姓名和平均绩点。可以通过Student student1; student1.id = 1; strcpy(student1.name, "John"); student1.gpa = 3.5;来创建和初始化结构体变量。
      • 用途:用于将多个相关的数据组合在一起,方便管理和操作。例如,在处理学生信息、员工信息等复杂的数据结构时非常有用。
    • 联合体(Unions)
      • 定义和特点:联合体是一种特殊的复合数据类型,它的所有成员共享同一块内存空间。例如:
      union Data {
        int i;
        float f;
        char c;
      };
      
      定义了一个名为Data的联合体。在某一时刻,联合体只能存储其中一个成员的值。例如,Data data; data.i = 10;此时内存中存储的是整数10,如果接着使用data.f = 3.14;,那么之前存储的整数10就会被覆盖,内存中存储的是浮点数3.14。
      • 用途:主要用于节省内存空间,当多个数据类型不会同时使用时,可以使用联合体。例如,在某些嵌入式系统或者对内存要求苛刻的场景中,对于一些可能是不同类型但不会同时出现的数据可以使用联合体来存储。
    • 枚举(Enums)
      • 定义和取值:枚举是一种用户自定义的数据类型,用于定义一组命名的常量。例如:
      enum Color {
        RED,
        GREEN,
        BLUE
      };
      
      定义了一个名为Color的枚举类型,其中包含REDGREENBLUE三个枚举常量。默认情况下,RED的值为0,GREEN的值为1,BLUE的值为2,也可以显式地指定枚举常量的值,如enum Color {RED = 1, GREEN = 2, BLUE = 3};
      • 用途:用于提高程序的可读性。例如,在一个图形绘制程序中,使用枚举Color来表示颜色,比使用整数0、1、2来表示不同颜色更加清晰,并且可以防止非法的值被使用。
  3. 指针类型(Pointer Types)
    • 定义和表示:指针是一个变量,其值是另一个变量的地址。例如,int num = 10; int* ptr = #,这里ptr是一个指针,它存储了变量num的地址。指针的类型必须与它所指向的变量类型相匹配,如int*指向int类型的变量,float*指向float类型的变量。
    • 用途:可以用于动态内存分配、访问数组元素、函数参数传递等多种场景。例如,在动态内存分配中,int* dynamicArray = new int[5];可以创建一个包含5个int类型元素的动态数组。在函数参数传递中,使用指针可以在函数内部修改函数外部变量的值。
  4. 引用类型(Reference Types)
    • 定义和特性:引用是一个别名,它必须在定义时初始化,并且之后不能再引用其他对象。例如,int originalVariable = 10; int& referenceVariable = originalVariable;,这里referenceVariableoriginalVariable的引用,对referenceVariable的操作实际上就是对originalVariable的操作。
    • 用途:常用于函数参数传递,避免函数参数的拷贝,提高效率。例如,void function(int& parameter) {...},在函数内部对parameter的操作会直接影响到传递进来的变量。

在这里插入图片描述

表达式

  • 基本算术运算符
    • C++提供了基本的算术运算符,包括加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
    • 加法和减法:例如,int a = 5 + 3;计算结果为8int b = 10 - 4;结果为6。这些运算符可以用于整数、浮点数等数值类型。
    • 乘法和除法int c = 2 * 3;得到6,对于除法,int d = 10 / 3;在整数除法中结果为3,因为整数除法会舍去小数部分。如果是浮点数相除,如double e = 10.0 / 3.0;结果为3.333333(具体精度取决于数据类型)。
    • 取模:取模运算符%返回除法运算的余数。例如,int f = 10 % 3;结果为1,常用于判断一个数是否能被另一个数整除等场景。
  • 算术表达式中的类型转换
    • 自动类型转换(隐式类型转换):当不同类型的数据进行算术运算时,C++会自动进行类型转换。一般是将取值范围较小的类型转换为取值范围较大的类型。例如,在表达式int a = 3; double b = 2.5; double c = a + b;中,a会自动转换为double类型后再进行加法运算,结果c5.5
    • 强制类型转换(显式类型转换):可以使用(type)type()(对于一些类型转换函数)的形式进行强制类型转换。例如,int a = (int)3.7;结果为3,将double类型的3.7强制转换为int类型,会舍去小数部分。不过,强制类型转换可能会导致数据精度丢失或其他错误,应谨慎使用。
  1. 关系表达式
    • 关系运算符
      • C++中的关系运算符用于比较两个值的大小关系,包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)和小于等于(<=)。
      • 例如,int a = 5; int b = 3; bool c = a > b;这里c的值为true,因为5大于3。关系表达式的结果是bool类型,即truefalse
    • 使用场景和注意事项
      • 关系表达式常用于条件判断,如if语句和while语句等。例如,if (a == b) {... }判断ab是否相等。需要注意的是,在使用==!=时,容易与赋值运算符=混淆。例如,if (a = b)是一个赋值操作,会将b的值赋给a,并且整个表达式的值为a的值,通常这不是我们想要的比较操作,应该仔细检查代码以避免这种错误。
  2. 逻辑表达式
    • 逻辑运算符
      • C++有三种逻辑运算符:逻辑与(&&)、逻辑或(||)和逻辑非(!)。
      • 逻辑与(&&:只有当两个操作数都为true时,结果才为true。例如,bool a = true; bool b = false; bool c = a && b;结果为false。逻辑与运算符还有一个短路特性,即当第一个操作数为false时,不会计算第二个操作数,因为结果已经确定为false
      • 逻辑或(||:只要两个操作数中有一个为true,结果就为true。例如,bool d = a || b;结果为true。逻辑或运算符也有短路特性,当第一个操作数为true时,不会计算第二个操作数,因为结果已经确定为true
      • 逻辑非(!:用于对一个bool值取反。例如,bool e =!a;结果为false
    • 逻辑表达式的嵌套和优先级
      • 逻辑表达式可以嵌套使用,例如,bool f = (a && b) || (!c);。在计算逻辑表达式时,逻辑非!的优先级最高,其次是逻辑与&&,最后是逻辑或||。可以使用括号来改变运算顺序,以确保表达式按照期望的方式计算。
  3. 赋值表达式
    • 赋值运算符
      • 基本的赋值运算符是=,用于将一个值赋给一个变量。例如,int a = 5;5赋给变量a。此外,还有复合赋值运算符,如+=-=*=/=%=。例如,a += 3;等价于a = a + 3;,这些复合赋值运算符可以简化代码并提高代码的执行效率。
    • 赋值表达式的左值和右值概念
      • 在赋值表达式中,左边的操作数必须是一个左值,即可以出现在赋值运算符左边的表达式,它通常是一个变量。右边的操作数可以是一个右值,即可以出现在赋值运算符右边的表达式,它可以是一个常量、变量或表达式的结果。例如,5 = a;是错误的,因为5是一个常量,不是左值。
  4. 条件表达式(三目运算符)
    • 语法和功能
      • 条件表达式的语法为condition? expression1 : expression2,其中condition是一个条件(关系表达式或逻辑表达式等),如果conditiontrue,则计算expression1并返回其结果,否则计算expression2并返回其结果。
      • 例如,int a = 5; int b = 3; int max = (a > b)? a : b;这里max的值为5,因为a > btrue,所以返回a的值。条件表达式可以在一些简单的条件判断场景中替代if - else语句,使代码更加简洁。
  5. 逗号表达式
    • 语法和计算顺序
      • 逗号表达式的语法是expression1, expression2,..., expressionN,它会从左到右依次计算每个表达式的值,最后返回最后一个表达式的值。
      • 例如,int a = (1 + 2, 3 * 4);先计算1 + 2,然后计算3 * 4,最后a的值为12,因为逗号表达式返回最后一个表达式的值。逗号表达式通常用于在一个表达式中执行多个操作,但只关心最后一个操作的结果的场景。
        以下是各类C++表达式对应的代码示例,方便你更好地理解它们的用法:

算术表达式示例

#include <iostream>

int main() {
    // 加法运算
    int num1 = 5;
    int num2 = 3;
    int sum = num1 + num2;
    std::cout << "加法结果:" << sum << std::endl;

    // 减法运算
    int diff = num1 - num2;
    std::cout << "减法结果:" << diff << std::endl;

    // 乘法运算
    int product = num1 * num2;
    std::cout << "乘法结果:" << product << std::endl;

    // 整数除法运算
    int divResult1 = 10 / 3;
    std::cout << "整数除法结果:" << divResult1 << std::endl;

    // 浮点数除法运算
    double num3 = 10.0;
    double num4 = 3.0;
    double divResult2 = num3 / num4;
    std::cout << "浮点数除法结果:" << divResult2 << std::endl;

    // 取模运算
    int remainder = 10 % 3;
    std::cout << "取模结果:" << remainder << std::endl;

    // 自动类型转换示例
    int intValue = 5;
    double doubleValue = 2.5;
    double result = intValue + doubleValue;
    std::cout << "自动类型转换结果:" << result << std::endl;

    // 强制类型转换示例
    double doubleNum = 3.7;
    int convertedNum = (int)doubleNum;
    std::cout << "强制类型转换结果:" << convertedNum << std::endl;

    return 0;
}

关系表达式示例

#include <iostream>

int main() {
    int a = 5;
    int b = 3;
    // 大于关系判断
    bool greater = a > b;
    std::cout << "a大于b的判断结果:" << (greater? "true" : "false") << std::endl;

    // 等于关系判断,注意这里容易误写成赋值(=),要格外小心
    bool equal = a == b;
    std::cout << "a等于b的判断结果:" << (equal? "true" : "false") << std::endl;

    return 0;
}

逻辑表达式示例

#include <iostream>

int main() {
    bool a = true;
    bool b = false;
    // 逻辑与运算示例
    bool andResult = a && b;
    std::cout << "逻辑与结果:" << (andResult? "true" : "false") << std::endl;

    // 逻辑或运算示例
    bool orResult = a || b;
    std::cout << "逻辑或结果:" << (orResult? "true" : "false") << std::endl;

    // 逻辑非运算示例
    bool notResult =!a;
    std::cout << "逻辑非结果:" << (notResult? "true" : "false") << std::endl;

    // 逻辑表达式嵌套示例
    bool nestedResult = (a && b) || (!a);
    std::cout << "嵌套逻辑表达式结果:" << (nestedResult? "true" : "false") << std::endl;

    return 0;
}

赋值表达式示例

#include <iostream>

int main() {
    int a = 5;
    // 基本赋值运算
    std::cout << "初始a的值:" << a << std::endl;
    a = 10;
    std::cout << "赋值后a的值:" << a << std::endl;

    // 复合赋值运算示例
    int b = 3;
    b += 2;  // 等价于b = b + 2;
    std::cout << "b += 2后的结果:" << b << std::endl;
    b *= 3;  // 等价于b = b * 3;
    std::cout << "b *= 3后的结果:" << b << std::endl;

    return 0;
}

条件表达式(三目运算符)示例

#include <iostream>

int main() {
    int num1 = 5;
    int num2 = 3;
    int max = (num1 > num2)? num1 : num2;
    std::cout << "两数中的较大值:" << max << std::endl;

    return 0;
}

逗号表达式示例

#include <iostream>

int main() {
    int result = (1 + 2, 3 * 4);
    std::cout << "逗号表达式结果:" << result << std::endl;

    return 0;
}

这些示例涵盖了不同类型的C++表达式,你可以将代码复制到C++编译器中运行,观察实际的输出结果,进一步掌握各表达式的特点和用法。

在这里插入图片描述


http://www.niftyadmin.cn/n/5796972.html

相关文章

Cmd命令大全(万字详细版)

1. 常用命令 1.1 cd命令 //进入d盘 D: //进入F盘 F: cd /? //获取使用帮助cd \ //跳转到硬盘的根目录cd C:\WINDOWS //跳转到当前硬盘的其他文件d: //跳转到其他硬盘cd /d e:\software //跳转到其他硬盘的其他文件夹&#xff0c;注意此处必须加/d参数。…

瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 文章目录 7 修改员工信息7.1 启用/禁用员工账号7.1.1 需求梳理7.1.2…

vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)

文章目录 先在ananconda prompt里创建并激活了虚拟环境&#xff0c;然后执行where python&#xff0c;显示的第一个就是这个虚拟环境python解释器路径&#xff1a;然后我们可以在vscode里添加这个python解释器&#xff1a; 先在ananconda prompt里创建并激活了虚拟环境&#xf…

【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法

文章目录 多态多态的主要类型 一、virtual、override 和 base 关键字1、**virtual 关键字** (虚方法)2、**override 关键字** (重写)3、**base 关键字** (基类访问)4、总结&#xff1a; 二、抽象类和抽象方法1、抽象类1.1 什么是抽象类1.2 定义和使用抽象类 2、抽象方法2.1 什么…

python报错系列(16)--pyinstaller ????????

系列文章目录 文章目录 系列文章目录前言一、pyinstaller ????????1.报错如下2.安装pyinstaller3.报错如下&#xff1a;4.封装py文件为exe成功5.国内源 总结 前言 一、pyinstaller ??? 1.报错如下 PS D:\Users\gxcaoty\Desktop\性能覆盖率> pyinstaller37.exe…

远程过程调用(RPC,Remote Procedure Call)是一种协议

远程过程调用&#xff08;RPC&#xff0c;Remote Procedure Call&#xff09;是一种协议&#xff0c;允许程序在不同的计算机上执行代码&#xff0c;就像调用本地函数一样。在Python中&#xff0c;有几种常见的RPC框架和库可以用来实现远程过程调用。 以下是一些常用的Python …

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

【Redis】缓存

什么是缓存 https://tech.meituan.com/2017/03/17/cache-about.html Spring Data Redis Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能。 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>sp…