机器人CPP编程基础-02变量Variables
全文AI生成。
#include
using namespace std;
main()
{
int a=10,b=35; // 4 bytes
cout<<"Value of a : "<
该代码是用C++编写的,它包含了各种数据类型的声明和初始化,以及如何使用cout
语句来打印这些变量的值和地址。下面是每行的详细解析:
以上就是对这段代码的详细解析。
#include
: 包含输入/输出流的库。这使得程序可以使用输入和输出功能。using namespace std;
: 声明使用std
命名空间。std
是标准缩写,表示标准库。这样,我们就可以直接使用标准库中的名字,而不用在每个名字前都写std::
。main()
: 程序的主函数,所有C++程序都从这里开始执行。int a=10,b=35;
: 声明两个整数变量a和b并初始化为10和35。cout<<"Value of a : "<: 使用cout
打印"Value of a : "和变量a的值,然后打印"Address of a : "和变量a的地址。&
操作符用于获取变量的内存地址。endl
用于插入新行。
cout<<"Value of b : "<: 与上述类似,但打印的是变量b的值和地址。
short s=20;
: 声明一个短整型变量s并初始化为20。在大多数系统上,short通常是2字节(16位)。cout <<"Value of s : "<< s << endl;
: 使用cout
打印"Value of s : "和变量s的值。float f1=20.03;
: 声明一个单精度浮点型变量f1并初始化为20.03。在大多数系统上,float通常是4字节(32位)。double d1=50.55416416;
: 声明一个双精度浮点型变量d1并初始化为50.55416416。在大多数系统上,double通常是8字节(64位)。cout <<"Value of f1 : "<< f1 << endl;
: 使用cout
打印"Value of f1 : "和变量f1的值。cout <<"Value of d1 : "<< d1 << endl;
: 使用cout
打印"Value of d1 : "和变量d1的值。char c1='A';
: 声明一个字符变量c1并初始化为'A'。cout<: 使用cout
打印变量c1的值,也就是字符'A'。
string s1="Hello Tridib";
: 声明一个字符串变量s1并初始化为"Hello Tridib"。cout<: 使用cout
打印变量s1的值,也就是"Hello Tridib"。
string s2="Welcome to CPP !";
: 声明另一个字符串变量s2并初始化为"Welcome to CPP !"。cout<: 使用cout
打印变量s2的值,也就是"Welcome to CPP !"。
string combineStrings=s1+", "+s2;
: 将s1和s2连接在一起,创建一个新的字符串combineStrings。cout<: 使用cout
打印变量combineStrings的值,也就是"Hello Tridib, Welcome to CPP !"。
bool b1=true;
: 声明一个布尔型变量b1并初始化为true。在C++中,布尔类型的值只能是true或false。cout<: 使用cout
打印变量b1的值,也就是true。在C++中,输出布尔值时会自动转换为字符串"true"或"false"。
b1=1515;
: 将变量b1的值更改为整数1515。在C++中,布尔类型的值也可以是0或非0的任何整数。cout<: 使用cout
打印变量b1的值,由于非零的整数会被视为true,所以这里输出的是true。
b1=-445;
: 将变量b1的值更改为-445。cout<: 使用cout
打印变量b1的值,由于非零的整数会被视为true,所以这里 输出的是true。
b1=0;
: 将变量b1的值更改为0。
cout<: 使用cout
打印变量b1的值,由于布尔类型的值只能是true或false,所以这里输出的是false。
unsigned short int u1=60445;
: 声明一个无符号短整型变量u1并初始化为60445。在大多数系统上,unsigned short通常是2字节(16位)。cout<< u1 <: 使用cout
打印变量u1的值。由于是无符号类型,所以可以输出大于255的整数。
const string myname="Tridib";
: 声明一个常量字符串变量myname并初始化为"Tridib"。const关键字表示该变量的值不能被修改。cout << myname << endl;
: 使用cout
打印变量myname的值,也就是"Tridib"。C++是一种多范式编程语言,支持多种变量类型。下面是C++中主要的变量类型及其描述:
基本类型
整数类型:这些类型用于存储整数值。有符号和无符号两种类型。
int
: 通常为32位,但大小可能因平台而异。short
: 通常为16位。long
: 通常为32位或64位,大小可能因平台而异。long long
: 通常为64位,大小可能因平台而异。浮点类型:这些类型用于存储带有小数点的值。
float
: 单精度,通常为32位。double
: 双精度,通常为64位。字符类型:这些类型用于存储单个字符或ASCII值。
char
: 有符号或无符号,通常为8位。布尔类型:bool
,用于存储逻辑值,可以取true
或false
。
复合类型
指针类型
int *p;
:定义一个指向整数的指针。double *dp;
:定义一个指向双精度浮点数的指针。char *cp;
:定义一个指向字符的指针。引用类型
int &ref;
:定义一个对整数变量的引用。引用和它引用的变量在内存中是同一实体。枚举类型
enum color { red, green, blue };
:定义了一个名为color的枚举类型,包含三个可能的值:red、green和blue。自定义类型
特殊类型
void
:表示无类型,常用于函数的返回值类型,如void func()
表示该函数没有返回值。const
:表示常量,一旦给定值就不能改变。例如const int a = 10;
,a的值就不能再改变。volatile
:表示易变的,即程序无法预知该变量的值会随时发生变化。例如硬件寄存器的值、正在运行的进程等。复合类型(如数组、指针、引用等)的进一步扩展:
int *arr[5]
定义了一个包含5个指向整数的指针的数组。int **pp;
定义了一个指向指针的指针,该指针可以指向一个整数类型的变量。int &arr[5]
定义了一个包含5个整数引用的数组。每个引用都是它引用的数组元素的别名。函数指针:指向函数的指针,例如int (*fp)(int)
定义了一个接受一个整数参数并返回一个整数的函数指针。
智能指针:C++11引入了智能指针,以帮助管理动态分配的内存。智能指针是一种类,它以一种安全的方式自动管理动态分配的内存。以下是一些智能指针类型:
std::unique_ptr
:这种类型的指针在离开作用域时自动删除其所有权。它只能指向一个对象,并保证其指向的对象在任何时刻都有一个所有者。std::shared_ptr
:这种类型的指针允许多个智能指针共享同一个对象。当最后一个智能指针离开作用域或被重置时,它会自动删除所指向的对象。std::weak_ptr
:这种类型的指针也是指向共享对象的,但不会增加对象的引用计数。当最后一个shared_ptr
离开作用域或被重置时,weak_ptr
将看到对象的析构。这些是C++中的主要变量类型。根据需要,还可以创建自定义类型和结构,以满足特定的编程需求。
C++14引入了一些新的变量类型,这些类型在C++11和C++17中都有所扩展。以下是一些C++14中引入的新变量类型:
原子类型(Atomic Types):这些类型定义在
atomic
:定义了一个原子操作的基本类型。原子操作是一种在单个线程中执行的操作,它可以在没有其他线程干扰的情况下修改数据。atomic_flag
:定义了一个原子标志,可以用于实现简单的原子布尔操作。数组的初始化:C++14引入了一种新的数组初始化方法,允许使用花括号{}
进行初始化。例如:
cpp复制代码
int arr[] = {1, 2, 3, 4, 5}; |
通用 Lambda 捕获:C++14引入了通用 lambda 捕获,允许捕获变量,无论它们是否在作用域中。例如:
cpp复制代码
auto lambda = [captured_var = some_global_var](){ /* Use captured_var */ }; |
std::move
和std::forward
函数,用于移动语义和完美转发。0x1p+2n
表示一个十六进制浮点数。这些是C++14引入的一些主要变量类型和功能。这些功能增强了语言的表达力和性能,并提供了更多的灵活性和控制。
C++20引入了一些新的变量类型和功能,进一步扩展了语言的表达力和性能。以下是一些C++20中引入的新变量类型和功能:
概念(Concepts):概念是一种用于指定类型必须满足的条件的语言特性。可以使用概念来约束模板参数的类型,以便在模板实例化时确保类型符合特定的要求。这有助于提高代码的可读性和可维护性。
cpp复制代码
template |
|
template |
结构化绑定(Structured Binding):C++20引入了结构化绑定,允许将一个表达式的值直接分配给多个变量。这使得在解构数组、元组或其他复合类型时更加方便。
cpp复制代码
int a = 1, b = 2; |
|
auto [c, d] = a + b; // c = 3, d = 3 |
if constexpr:C++20引入了if constexpr
语句,它允许在编译时根据条件选择不同的代码路径。这对于在编译时进行条件编译和静态分派非常有用。
cpp复制代码
template |
|
if constexpr (std::is_integral_v |
|
// 处理整数类型 |
|
} else if constexpr (std::is_floating_point_v |
|
// 处理浮点数类型 |
|
} |
|
} |
<=>
,用于执行基于比较的操作。这可以用于实现自定义类型的比较操作。这些是C++20引入的一些主要变量类型和功能。这些功能进一步增强了语言的表达力和性能,并提供了更多的灵活性和控制。
#include
void setup() {
Serial.begin(9600);
int a = 10;
Serial.print("Value of a : ");
Serial.print(a);
Serial.print(" Address of a : ");
Serial.println(&a);
short s = 20;
Serial.print("Value of s : ");
Serial.println(s);
float f1 = 20.03;
Serial.print("Value of f1 : ");
Serial.print(f1);
Serial.println();
double d1 = 50.55416416;
Serial.print("Value of d1 : ");
Serial.println(d1);
char c1 = 'A';
Serial.print(c1);
Serial.println();
const char* s1 = "Hello Tridib";
Serial.println(s1);
const char* s2 = "Welcome to CPP !";
Serial.println(s2);
const char* combineStrings = pgm_read_word(&combineStrings); //pgm_read_word(&combineStrings) is used to get the address of the combineStrings variable in flash memory space and is not related to the original code
Serial.println(combineStrings);
bool b1 = true;
Serial.println(b1);
b1 = 1515;
Serial.println(b1);
b1 = -445;
Serial.println(b1);
b1 = 0;
Serial.println(b1);
unsigned short int u1 = 60445;
Serial.println(u1);
}
void loop() {
// put your main code here, to run repeatedly:
}
Arduino IDE使用的是C++的变量类型,因此它支持C++的所有常见变量类型。以下是在Arduino IDE中常用的C++变量类型:
基本类型
int
: 用于表示整数值,通常为16位。unsigned int
: 用于表示无符号整数值,通常为16位。long
: 用于表示长整数值,通常为32位。unsigned long
: 用于表示无符号长整数值,通常为32位。char
: 用于表示字符值,通常为8位。bool
: 用于表示布尔值,可以取true
或false
。float
: 用于表示单精度浮点数值,通常为32位。double
: 用于表示双精度浮点数值,通常为64位。指针类型
int *p;
:定义一个指向整数的指针。char *str;
:定义一个指向字符数组的指针。数组类型
int arr[10];
:定义一个包含10个整数的数组。char str[] = "Hello";
:定义一个包含字符串"Hello"的字符数组。结构体类型
struct MyStruct { int id; char name[20]; };
:定义一个名为MyStruct的结构体,包含一个整型成员变量id和一个字符数组成员变量name。联合体类型
union MyUnion { int id; char name[20]; };
:定义一个名为MyUnion的联合体,包含一个整型成员变量id和一个字符数组成员变量name。函数类型
int myFunction(int arg1, char arg2);
:定义一个名为myFunction的函数,接受一个整型参数arg1和一个字符型参数arg2,并返回一个整型值。自定义类型
typedef int MyInt;
:定义一个新的类型别名MyInt,相当于int类型。枚举类型
enum MyEnum { RED, BLUE, GREEN };
:定义一个名为MyEnum的枚举类型,包含三个可能的值:RED、BLUE和GREEN。类型转换
(float) x
将x转换为浮点数类型。常量和常量表达式
这些是在Arduino IDE中常用的C++变量类型和相关概念。了解这些变量类型和概念对于编写Arduino程序非常重要。
AI生成是否可行???
#include
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "my_node");
ros::NodeHandle nh;
int a=10,b=35; // 4 bytes
ros::console::cout << "Value of a : " << a << " Address of a : " << &a << ros::console::endl;
ros::console::cout << "Value of b : " << b << " Address of b : " << &b << ros::console::endl;
short s=20; //2 bytes
ros::console::cout << "Value of s : " << s << ros::console::endl;
float f1=20.03; //4 bytes
ros::console::cout << "Value of f1 : " << f1 << ros::console::endl;
double d1=50.55416416; //8 bytes
ros::console::cout << "Value of d1 : " << d1 << ros::console::endl;
int c1 = 65;
ros::console::cout << c1 << ros::console::endl;
std_msgs::String s1;
s1.data = "Hello Tridib";
ros::console::cout << s1.data << ros::console::endl;
std_msgs::String s2;
s2.data = "Welcome to CPP !";
ros::console::cout << s2.data << ros::console::endl;
// string concatenation not supported in ROS
// you can use roscpp'sRosOutSignal to achieve this easily.
// RosOutSignal().outStr(s1.data + ", " + s2.data);
// instead of the line above you can do:
std_msgs::String combineStrings;
combineStrings.data = s1.data + ", " + s2.data;
ros::console::cout << combineStrings.data << ros::console::endl;
bool b1=true; //Boolean is true or false. FALSE IS ALWAYS ZERO, EVERY OTHER NUMBER IS TRUE.
ros::console::cout << b1 << ros::console::endl;
b1=1515;
ros::console::cout << b1 << ros::console::endl;
b1=-445;
ros::console::cout << b1 << ros::console::endl;
b1=0;
ros::console::cout << b1 << ros::console::endl;
//Positive numbers or unsigned numbers. Increases the positive range.
unsigned short int u1=60445;
ros::console::cout << u1 << ros::console::endl;
// const string myname="Tridib"; is not supported in ROS, you should use a string_view instead. (not implemented in roscpp at the time of writing)
}
ROS1 Noetic是ROS1的一个版本,使用C++作为主要的编程语言。在ROS1 Noetic中,常见的C++变量类型包括以下几种:
std::shared_ptr
和std::unique_ptr
两种智能指针类型,用于自动管理资源的生命周期。boost::function
和boost::slot
,用于实现事件驱动的回调机制。ros
、std_msgs
、sensor_msgs
等,用于组织和管理ROS相关的代码和消息类型。std_msgs::String
、sensor_msgs::Image
等,用于在ROS系统中进行节点之间的通信。这些消息类型通常定义在ROS1的消息规范中。ros::ServiceServer
和ros::ServiceResponse
,用于在ROS系统中实现服务调用。这些服务类型定义在ROS1的服务规范中。actionlib::SimpleActionClient
和actionlib::SimpleGoal
,用于在ROS系统中实现复杂的行为控制。这些动作类型定义在ROS1的动作规范中。除了上述变量类型外,ROS1 Noetic还提供了许多其他的工具和库,用于实现机器人控制、传感器数据处理、可视化等功能。