当前位置: 首页 > news >正文

学习c++的第二天

目录

数据类型

基本数据类型

typedef 声明

枚举类型

类型转换

变量类型

变量定义

变量声明

左值(Lvalues)和右值(Rvalues)

变量作用域


数据类型

基本数据类型

C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:

类型关键字
布尔型bool
字符型char
整型int
浮点型float
双浮点型double
无类型void
宽字符型

wchar_t

类型修饰符:signed、unsigned、short、long
注:一些基本类型可以使用一个或多个类型修饰符进行修饰,比如:signed short int简写为short、signed long int 简写为long。

下表显示了各种变量类型在内存中存储值时需要占用的内存,以及该类型的变量所能存储的最大值和最小值。

注意:不同系统会有所差异,一字节为 8 位。默认情况下,int、short、long都是带符号的,即 signed。long int 8 个字节,int 都是 4 个字节,早期的 C 编译器定义了 long int 占用 4 个字节,int 占用 2 个字节,新版的 C/C++ 标准兼容了早期的这一设定。

类型范围
char1 个字节-128 到 127 或者 0 到 255
unsigned char1 个字节0 到 255
signed char1 个字节-128 到 127
int4 个字节-2147483648 到 2147483647
unsigned int4 个字节0 到 4294967295
signed int4 个字节-2147483648 到 2147483647
short int2 个字节-32768 到 32767
unsigned short int2 个字节0 到 65,535
signed short int2 个字节-32768 到 32767
long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int8 个字节-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int8 个字节0 到 18,446,744,073,709,551,615
float4 个字节精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double8 个字节双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double16 个字节长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t2 或 4 个字节1 个宽字符

注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):

typedef 声明

typedef是C和C++语言中的一个关键字,用于给一个已有的数据类型起一个新的别名。typedef可以提高代码可读性和可维护性。

typedef的语法如下:

typedef existing_type new_type_name;

其中,existing_type代表要起别名的已有数据类型,new_type_name代表新的别名。existing_type可以是任意合法的数据类型,包括基本数据类型、指针、结构体、联合体、枚举等。

typedef可以将一个复杂的数据类型(例如struct或者union)简化为一个易于使用和理解的名称,也可以定义新的类型名称以使得多个数据类型具有相同的类型名称,从而增加代码的清晰度。

下面是一些typedef的例子:

typedef int myint;   // 将 int 类型起个新的别名 myint
typedef float* pfloat;   // 将 float* 类型起个新的别名为 pfloat// 用 typedef 定义结构体别名
typedef struct {char name[20];int age;
} Person;// 用 typedef 定义枚举类型别名
typedef enum {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
} Weekday;

在上面的例子中,myint是int类型的别名,pfloat是float*类型的别名。Person是一个结构体别名,可以通过Person代替struct { char name[20]; int age; }来定义结构体。Weekday是一个枚举类型的别名,可以通过Weekday代替enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }来定义枚举类型。

需要注意的是,typedef只是给一个已有的数据类型起一个新的别名,它并不会创建新的数据类型。因此,typedef语句不能用于定义新的变量,而只能用于定义新的类型名称。

枚举类型

枚举类型是C和C++中的一种数据类型,用于定义一个有限的、命名的整数值集合。枚举类型可以简化代码的可读性和维护性,同时提供了一种方式来表示一组相关的常量。

在C/C++中,定义一个枚举类型使用enum关键字,其语法如下:

enum enum_name {value1,value2,value3,// ...
};

其中,enum_name是枚举类型的名称,value1、value2、value3等是枚举常量,表示枚举类型的取值。每个枚举常量都会被编译器分配一个整数值,默认情况下从0开始递增。

以下是一个示例:

enum Color {RED,    // 0GREEN,  // 1BLUE    // 2
};enum Weekday {Monday,     // 0Tuesday,    // 1Wednesday,  // 2Thursday,   // 3Friday,     // 4Saturday,   // 5Sunday      // 6
};

在上面的示例中,Color是一个枚举类型,它包含了三个枚举常量RED、GREEN和BLUE。默认情况下,RED的值是0,GREEN的值是1,BLUE的值是2。

同样地,Weekday是另一个枚举类型,它包含了七个枚举常量,分别代表星期一到星期日,它们的值从0到6递增。

在使用枚举类型时,可以通过枚举常量来表示具体的值。例如:

Color myColor = RED;
Weekday today = Wednesday;

上述代码中,myColor被赋值为RED,today被赋值为Wednesday。

需要注意的是,枚举常量的作用域是在所属的枚举类型中,并且枚举常量之间是唯一的。也可以通过显式地指定枚举常量的值来自定义枚举常量的整数值。例如:

enum Status {OK = 0,ERROR = -1,WARNING = 1
};

在这个示例中,Status是一个枚举类型,它包含了三个枚举常量OK、ERROR和WARNING,并且分别被赋予了整数值0、-1和1。

枚举类型在编程中经常用于表示一组相关的常量,增加代码的可读性和可维护性。它在switch语句中也常用于改善代码的可读性,使得程序更加清晰易懂。

类型转换

类型转换是将一个数据类型的值转换为另一种数据类型的值。

C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。

1、静态转换(Static Cast):
静态转换是一种编译时类型转换,在代码中使用 static_cast<type>(value) 的形式进行。它可以将基本数据类型或者用户定义的类型进行转换。静态转换通常用于比较宽松的类型转换,例如将一个指针转换为整数类型,或者将一个整数类型转换为枚举类型等。但需要注意的是,静态转换可能会导致数据精度损失或无效的转换,因此在进行类型转换时要谨慎使用,并确保转换操作是安全和合理的。

2、动态转换(Dynamic Cast):
动态转换是一种运行时类型转换,在代码中使用 dynamic_cast<type>(pointer) 的形式进行。它通常用于将一个基类指针或引用转换为派生类指针或引用。在进行动态转换时,需要注意转换操作的安全性,如果指针或引用不是指向实际对象,则转换操作会失败,返回空指针或引用。

3、常量转换(Const Cast):
常量转换是一种用于移除变量的常量属性或加上变量的常量属性的类型转换,使用 const_cast<type>(variable) 的形式进行。它通常用于解决一些编译器警告或者将 const 类型转换为非 const 类型的情况。但是需要注意,常量转换只能用于非常量变量上,否则会导致未定义的行为。

4、重新解释转换(Reinterpret Cast):
重新解释转换是一种类型转换,它可以将一个指针转换为另一个无关类型的指针,或者将一个整数类型转换为一个指针类型,使用 reinterpret_cast 进行。它通常用于将不同类型之间的二进制数据进行转换,但需要注意的是,这种转换可能会产生危险和未定义的行为,因此在使用时要格外小心。

下面是一个简单的代码示例,演示了在 C++ 中如何使用不同类型转换方式:

#include <iostream>
using namespace std;int main() {// 静态转换int a = 10;double b = static_cast<double>(a);cout << "Static Cast: " << b << endl;// 动态转换class Base {public:virtual void print() {cout << "This is a Base class." << endl;}};class Derived : public Base {public:void print() {cout << "This is a Derived class." << endl;}};Base* base_ptr = new Derived;Derived* derived_ptr = dynamic_cast<Derived*>(base_ptr);if (derived_ptr != NULL) {derived_ptr->print();} else {cout << "Dynamic Cast Failed." << endl;}// 常量转换const int x = 5;int y = const_cast<int&>(x);y++;cout << "Const Cast: " << y << endl;// 重新解释转换int c = 100;void* ptr = reinterpret_cast<void*>(&c);int* d = reinterpret_cast<int*>(ptr);cout << "Reinterpret Cast: " << *d << endl;return 0;
}

输出结果如下:

Static Cast: 10
This is a Derived class.
Const Cast: 6
Reinterpret Cast: 100

该示例中分别使用了四种不同的类型转换方式,包括静态转换、动态转换、常量转换和重新解释转换。静态转换将整数类型转换为浮点数类型,动态转换将基类指针转换为派生类指针并调用其成员函数,常量转换将 const 类型的变量转换为非 const 类型的变量并修改其值,重新解释转换将整数类型的变量地址转换为 void 类型的指针并再次转换回整数类型的指针。通过该示例,可以更加深入地理解不同类型转换方式的使用方法和注意事项。

变量类型

1、整数类型(Integer Types):

  • int:用于表示整数,通常占用4个字节。
  • short:用于表示短整数,通常占用2个字节。
  • long:用于表示长整数,通常占用4个字节。
  • long long:用于表示更长的整数,通常占用8个字节。

2、浮点类型(Floating-Point Types):

  • float:用于表示单精度浮点数,通常占用4个字节。
  • double:用于表示双精度浮点数,通常占用8个字节。
  • long double:用于表示更高精度的浮点数,占用字节数可以根据实现而变化。

3、字符类型(Character Types):

  • char:用于表示字符,通常占用1个字节。
  • wchar_t:用于表示宽字符,通常占用2或4个字节。
  • char16_t:用于表示16位Unicode字符,占用2个字节。
  • char32_t:用于表示32位Unicode字符,占用4个字节。

4、布尔类型(Boolean Type):

  • bool:用于表示布尔值,只能取true或false。

5、枚举类型(Enumeration Types):

  • enum:用于定义一组命名的整数常量。

6、指针类型(Pointer Types):

  • type*:用于表示指向类型为type的对象的指针。

7、数组类型(Array Types):

  • type[]或type[size]:用于表示具有相同类型的元素组成的数组。

8、结构体类型(Structure Types):

  • struct:用于定义包含多个不同类型成员的结构。

9、类类型(Class Types):

  • class:用于定义具有属性和方法的自定义类型。

10、共用体类型(Union Types):

  • union:用于定义一种特殊的数据类型,它可以在相同的内存位置存储不同的数据类型。

11、其他类型:

  • 空类型(void):空类型表示无类型。
  • nullptr类型(nullptr):nullptr类型表示空指针。

12、引用类型:

  • 引用类型(int&,float&等)

注意:这些变量类型具有不同的特性和用途。基本数据类型用于存储单个数据值,复合数据类型可以存储多个相关数据值,指针类型和引用类型用于间接访问变量和内存地址,类类型用于创建自定义的对象类型,空类型表示无类型,nullptr类型表示空指针。

例如,以下是使用不同变量类型的示例:

#include <iostream>
using namespace std;int main() {int age = 25; // 整数类型double salary = 5000.75; // 浮点数类型char grade = 'A'; // 字符类型bool isPassed = true; // 布尔类型int numbers[] = {1, 2, 3, 4, 5}; // 数组类型struct Person {string name;int age;};Person person1 = {"John", 30}; // 结构体类型enum Color { RED, GREEN, BLUE }; // 枚举类型Color color = GREEN;int* ptr = nullptr; // 指针类型int& ref = age; // 引用类型class Circle {double radius;};Circle c; // 类类型void* p = nullptr; // 空类型return 0;
}

在这个示例中,我们用不同的变量类型声明和初始化了变量。请注意,C++是一种静态类型语言,变量必须在使用之前显式声明其类型,并且不能在运行时更改其类型。

变量定义

在C++中,可以使用以下语法来定义变量:

type variable_name;       // 变量定义,不初始化
type variable_name = value;  // 变量定义,并初始化为特定的值

其中,type表示变量的数据类型(type 必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象),variable_name表示变量的名称(variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。),value表示变量的初始值。

以下是一些示例:

int age;                         // 定义一个整数变量age
double salary = 5000.75;         // 定义一个双精度浮点数变量salary并初始化为5000.75
char grade = 'A';                // 定义一个字符变量grade并初始化为'A'
bool isPassed = true;            // 定义一个布尔变量isPassed并初始化为trueint x, y, z;                     // 同时定义多个整数变量x, y, z
double pi = 3.14159, radius = 5; // 同时定义多个双精度浮点数变量pi, radius并初始化

注意事项:

  • 变量名必须遵循标识符的命名规则,且不能与C++的关键字重复。
  • 在定义变量时,可以选择是否对其进行初始化。未初始化的变量将具有不确定的值。
  • 可以在定义变量时使用赋值运算符 = 进行初始化,将特定的值赋给变量。
  • 在同一行上可以定义多个相同类型的变量,并用逗号 , 分隔它们。

值得一提的是,C++还支持在函数内部定义局部变量、在类中定义成员变量以及在命名空间中定义全局变量。这些变量定义的语法稍有不同,但基本原则和概念相同。

变量声明

在C++中,变量的声明是指在使用变量之前提前声明其存在,告诉编译器变量的类型和名称。变量声明只会创建变量的标识符,而不会分配内存空间或初始化变量。

以下是一些变量声明的例子:

1、声明整数变量:

extern int age;      // 声明一个整数变量age

2、声明浮点数变量:

extern double pi;   // 声明一个双精度浮点数变量pi

3、声明字符变量:

extern char grade;   // 声明一个字符变量grade

4、声明布尔变量:

extern bool isPassed;   // 声明一个布尔变量isPassed

5、声明字符串变量:

#include <string>      // 引入<string>头文件
using namespace std;extern string name;    // 声明一个字符串变量name

需要注意的是,变量的声明通常与变量的定义分开。变量的定义是在声明的基础上为变量分配内存空间并可能进行初始化。变量的声明一般放在头文件中,以便在多个源文件中共享同一个变量。

例如,在一个名为 variables.h 的头文件中声明变量:

extern int age;        // 声明整数变量age
extern double pi;      // 声明双精度浮点数变量pi
extern char grade;     // 声明字符变量grade

然后,在源文件中进行变量的定义和初始化:

#include "variables.h"int age = 25;          // 定义并初始化整数变量age
double pi = 3.14159;   // 定义并初始化双精度浮点数变量pi
char grade = 'A';      // 定义并初始化字符变量grade

这样,通过在源文件中包含声明的头文件,可以在不同的源文件中访问和使用这些变量。

左值(Lvalues)和右值(Rvalues)

在C++中,表达式可以分为左值(lvalues)和右值(rvalues)。左值和右值的主要区别在于它们在赋值操作符的左边或右边出现的位置。

左值(lvalue)是一个具有内存地址并且可以被引用的表达式。它可以出现在赋值操作符的左边或右边。换句话说,左值是一个可以被取址的表达式。典型的左值包括变量、对象成员以及通过解引用指针获得的值。

右值(rvalue)是一个临时的、不具有内存地址的表达式。它只能出现在赋值操作符的右边。右值通常是临时生成的值、字面量或表达式的结果。右值不能直接被引用,但可以通过将其绑定到右值引用(rvalue reference)来延长其生命周期。

C++11引入了右值引用(rvalue references),它们是一种新的引用类型,用于延长右值的生命周期并支持移动语义。通过将右值绑定到右值引用上,可以对其进行修改或移动。

下面是一些示例:

int x = 5;       // x是一个左值
int& lvalueRef = x;  // 左值引用可以引用左值int y = x + 3;  // x+3是一个右值
int&& rvalueRef = x + 3;  // 右值引用可以引用右值int z = std::move(x);  // std::move()将左值转换为右值引用

需要注意的是,C++中的一些情况下,左值可以被隐式地转换为右值,例如在函数返回语句中,即使左值也可以用作右值。

总结来说,左值是具有内存地址的表达式,可以出现在赋值操作符的左边或右边。右值是临时生成的、不具有内存地址的表达式,只能出现在赋值操作符的右边。右值引用类型可以绑定到右值,并支持对其进行修改或移动。

变量作用域

一般来说有三个地方可以定义变量:

  • 在函数或一个代码块内部声明的变量,称为局部变量。

  • 在函数参数的定义中声明的变量,称为形式参数。

  • 在所有函数外部声明的变量,称为全局变量。

1、全局作用域(Global Scope):在任何函数、代码块之外定义的变量具有全局作用域。这意味着它们在整个程序中都是可见和可访问的。全局变量在程序启动时被创建,在程序结束时销毁。

#include <iostream>int globalVariable = 10;  // 全局变量int main() {std::cout << globalVariable << std::endl;  // 可以在任何位置访问全局变量return 0;
}

2、块作用域(Block Scope):在函数或代码块内部定义的变量具有块作用域。这意味着它们只在定义它们的代码块内部是可见和可访问的。当代码块执行完毕后,变量将被销毁。

#include <iostream>int main() {int x = 5;  // 块作用域的变量{int y = 10;  // 嵌套的块作用域的变量std::cout << x << " " << y << std::endl;  // 可以在代码块内部访问x和y}std::cout << x << std::endl;  // 只能在外层代码块内部访问x// std::cout << y << std::endl;  // 错误:y超出了作用域,无法访问return 0;
}

3、函数参数作用域(Function Parameter Scope):函数参数的作用域仅限于函数内部。它们在函数被调用时创建,并在函数执行完毕后销毁。

#include <iostream>void myFunction(int param) {  // 参数param的作用域仅限于函数内部std::cout << param << std::endl;  // 可以在函数内部访问参数param
}int main() {myFunction(5);// std::cout << param << std::endl;  // 错误:参数param的作用域仅限于函数内部,无法在main函数中访问return 0;
}

4、类作用域(Class Scope):在类定义内部声明的变量具有类作用域。它们可以被类中的任何成员函数访问。

#include <iostream>class MyClass {
public:int classVariable;  // 类作用域的变量void myMethod() {std::cout << classVariable << std::endl;  // 可以在成员函数中访问类作用域的变量}
};int main() {MyClass obj;obj.classVariable = 10;obj.myMethod();return 0;
}

需要注意的是,当在内部作用域中声明的变量与外部作用域中的变量同名,内部作用域的变量会隐藏外部作用域的同名变量。

变量的作用域是C++中管理变量可见性和访问性的重要概念。了解变量作用域对于编写正确和清晰的代码非常重要。

相关文章:

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…...

Android NDK开发详解之调试和性能分析的系统跟踪概览

Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件&#xff0c;该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…...

AD9371 官方例程HDL JESD204B相关IP端口信号

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…...

蓝牙服务:优化体验,提高连接效率

文章目录 1. 对蓝牙连接进行优化2. 设备配对的缓存机制3. 优化蓝牙连接的稳定性 蓝牙技术已经成为我们生活中不可或缺的一部分&#xff0c;我们使用它进行音频传输、数据传输、设备连接等等。然而&#xff0c;有时蓝牙连接会让用户感到非常困扰&#xff0c;比如连接速度缓慢、连…...

SSM校园设备管信息管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

选题理由 随着计算机网络及多媒体技术的广泛应用&#xff0c;互联网已成为高校办学的基础设施和必备条件&#xff0c;基于互联网的高校信息管理越来越综合化&#xff0c;越来越多的教学管理、行政管理工作将架构在互联网上&#xff0c;互联网正在变为学校实施教学、科研和管理…...

iOS的应用生命周期以及应用界面

在iOS的原生开发中&#xff0c;我们需要特别关注两个东西&#xff1a;AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示&#xff1a; AppDelegate是应用程序委托对象&#xff0c;它继承了UIResponder类…...

Macos下安装使用Redis

Redis 是一个基于内存的key-value的结构数据库适合存储热点数据 Macos安装Redis https://redis.io/docs/getting-started/installation/install-redis-on-mac-os/安装redis brew install redis查看安装信息&#xff1a; brew info redis前台启动redis: redis-server后台启…...

Redis的四种部署方案

这篇文章介绍Reids最为常见的四种部署模式&#xff0c;其实Reids和数据库的集群模式差不多&#xff0c;可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署&#xff0c;其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境…...

Microsoft Edge不能工作了,可能原因不少,那么如何修复呢

Microsoft Edge打不开或不能加载网页是用户在Windows 10、Android、Mac和iOS设备上的网络浏览器上遇到的许多错误之一。其他Microsoft Edge问题可能包括浏览器窗口和选项卡冻结、网站崩溃、互联网连接错误消息以及丢失Microsoft Edge书签、收藏夹、密码和收藏。 Microsoft Edg…...

算法---缺失的第一个正数

题目 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1&#xff1a;输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a;输入&#xff1a;nums …...

【算法与数据结构】--算法应用--算法和数据结构的案例研究

一、项目管理中的算法应用 在项目管理中&#xff0c;算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究&#xff0c;展示了算法在项目管理中的实际应用&#xff1a; 项目进度管理&#xff1a; 甘特图算法&#xff1a;甘特图是一种项目进度管理…...

java如何获取调用接口的ip?

获取调用者的ip 场景&#xff1a;想知道哪个ip访问的某个接口时&#xff0c;就需要打印出来看看&#xff0c;这时就可以使用这个方法了。 案例&#xff1a; //HttpServletRequest 入参加上,请求对象public ForkResponse queryXXX(RequestBody XXXX xxxx, HttpServletRequest …...

ubuntu 18 更新git版本到 2.80.1

前言 使用gitlab的时候&#xff0c;发现下面这条语句不能用 git init --initial-branch XXX查看git version git version下载 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.38.1.tar.gz 或者 https://git-scm.com/download/linux 或者去github上面下载…...

测试C#调用Aplayer播放视频(2:VideoPlayer源码学习)

参考文献1除了介绍Aplayer组件的用法之外&#xff0c;还提供有demo下载以供学习&#xff0c;本文学习并记录其中的使用方式。   VideoPlayer项目使用C#在VS2013开发&#xff0c;其解决方案中包括VideoPlayer和VideoPlayer两个小项目&#xff0c;前者基于.net framework4.0&am…...

YOLOv5 分类模型的预处理

YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…...

25 行为型模式-备忘录模式

1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…...

物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片&#xff0c;更加智能、可靠&#xff0c;精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址&#xff0c;通信…...

int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?

int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...

数据结构|基础知识定义

1.值传递、地址传递、值返回、地址返回 1> 值传递&#xff1a;普通变量作为函数参数传递是单向的值传递&#xff0c;只是将实参的值复制一份给形参变量&#xff0c;形参的改变不会影响实参的值&#xff0c;因为所在内存空间不同 如果传递的是地址&#xff0c;被调函数使用指…...

物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片&#xff0c;其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信&#xff0c;双向数据…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...