机器人CPP编程基础-01第一个程序Hello World
基础代码都可以借助人工智能工具进行学习。
C++
#include<iostream>
using namespace std;
main()
{
//Declaring an integer type variable A, allocates 4 bytes of memory.
int A=4;
cout<<A <<endl;
//Prints the address of the variable A.
cout<<&A <<endl;
/*
1. Variables cant have the same name.
2. Variable name cant start with a number.
3. Variable name should not contain spaces.
4. Variable name should be self-descriptive.
5. Variable name can't have special characters or keywords.
*/
//Re-initialization of A.
A=10;
cout<<A <<endl;
cout<<&A;
}
该代码主要执行以下操作:
- 声明一个名为
A
的整数类型变量,并将其初始化为4
。在 C++ 中,int
类型通常占用 4 个字节的内存空间。 - 使用
cout
语句输出变量A
的值,即4
。 - 使用
cout
语句输出变量A
的地址,即变量在内存中的位置。 - 通过注释的方式,列出了一些关于变量命名的规则和注意事项。
- 重新初始化变量
A
的值为10
。 - 使用
cout
语句再次输出变量A
的值,即10
。 - 最后,再次使用
cout
语句输出变量A
的地址。
代码解析完毕。
基本概念:
C++变量是一种在程序中存储数据的机制。变量是用于存储和操作数据的标识符。以下是C++变量的详细介绍:
- 变量的命名:变量名可以是字母、数字、下划线,并且必须以字母或下划线开头。变量名通常使用驼峰命名法或下划线命名法。
- 变量的类型:变量在声明时必须指定其类型。C++有许多内置类型,包括整数、浮点数、字符、布尔等。此外,还可以使用自定义类型,如结构体、类等。
- 变量的声明:在C++中,必须在程序中使用变量之前声明它们。声明告诉编译器变量的名称和类型,以便编译器知道如何为变量分配内存空间。
- 变量的赋值:在声明变量后,必须将其初始化为一个值。可以使用赋值运算符(=)将值赋给变量。
- 变量的作用域:变量的作用域是指变量在程序中的可见性和生命周期。C++中有两种类型的作用域:局部和全局。局部作用域限制了变量的可见性和生命周期,只能在定义它的代码块中使用。全局作用域使得变量在整个程序中都可见。
- 常量:常量是变量的特殊类型,表示一个不可变的值。在C++中,使用关键字
const
来声明常量。 - 变量的类型转换:在C++中,可以进行隐式类型转换和显式类型转换。隐式类型转换发生在编译器自动将一种类型的值转换为另一种类型时,例如将整数转换为浮点数。显式类型转换使用类型转换运算符(如
static_cast
、dynamic_cast
等)来显式地将一个类型的值转换为另一个类型。
以上是C++变量的详细介绍,掌握这些概念对于编写高效的C++程序非常重要。
C++14是C++语言的最新标准,它引入了一些关于变量的新特性和改进。以下是一些关于C++14中变量的详细介绍:
-
auto关键字:C++14引入了auto关键字,用于自动推断变量的类型。使用auto关键字可以简化变量的类型声明,特别是在使用复杂表达式或嵌套容器时。
-
列表初始化和变量声明:C++14支持使用花括号({})进行列表初始化,可以直接将初始值赋给变量,无需使用赋值运算符。例如:
cpp复制代码
int a = {10}; | |
std::string str = {"Hello World"}; |
-
初始化列表的构造器:C++14引入了初始化列表构造器,允许在类的构造函数中使用初始化列表来初始化成员变量。例如:
cpp复制代码
class MyClass { | |
public: | |
MyClass(int a, int b) : m_a(a), m_b(b) {} | |
private: | |
int m_a; | |
int m_b; | |
}; |
- 通用委托表达式:C++14引入了通用委托表达式(Generalized Delegate Expressions),允许使用更灵活的表达式来构造委托表达式。
- 静态断言:C++14引入了静态断言(Static Assert),用于在编译时检查条件是否满足。如果条件不满足,编译器将产生错误或警告。
- 右值引用和移动语义:C++14引入了右值引用(Rvalue Reference)和移动语义(Move Semantics),以优化资源的管理和性能。
以上是C++14中关于变量的详细介绍。这些新特性和改进提高了代码的可读性和性能,使C++更加现代化和灵活。
C++20是C++语言的最新标准,引入了一些关于变量的新特性和改进。以下是一些关于C++20中变量的详细介绍:
-
类型推断和auto关键字:C++20扩展了类型推断的功能,使得变量声明时可以省略变量名的类型,而只使用变量名即可。这使得代码更加简洁易读。
cpp复制代码
auto x = 10; // 推断x的类型为int | |
auto v = {1, 2, 3}; // 推断v的类型为std::initializer_list<int> |
-
结构化绑定:C++20引入了结构化绑定(Structured Binding),允许将一个结构体或联合体的成员变量直接分配给多个变量。
cpp复制代码
struct Point { | |
int x; | |
int y; | |
}; | |
Point p; | |
auto [x, y] = p; // 将p的x和y成员变量分配给x和y变量 |
-
范围for循环:C++20引入了范围for循环(Range-based for loop),允许在for循环中直接遍历容器或数组的元素。
cpp复制代码
int arr[] = {1, 2, 3, 4, 5}; | |
for (int elem : arr) { | |
// 直接访问arr的每个元素 | |
std::cout << elem << std::endl; | |
} |
- 初始化列表的构造器:C++20继续支持初始化列表构造器,允许在类的构造函数中使用初始化列表来初始化成员变量。
- concept关键字:C++20引入了concept关键字,用于定义类型的概念,用于约束模板参数的类型。这有助于提高代码的可读性和可维护性。
- if constexpr和if let:C++20引入了if constexpr和if let,用于在编译时条件判断和模式匹配,有助于编写更加简洁和高效的代码。
- coroutines:C++20引入了协程(Coroutines),这是一种控制流机制,允许函数在执行过程中暂停执行并将控制权返回给调用者,然后在某个特定点重新进入执行。协程可以用于实现异步编程、生成器等功能。
以上是C++20中关于变量的详细介绍。这些新特性和改进进一步提高了代码的可读性和性能,使C++更加现代化和灵活。
Arduino
int A = 4; // 声明一个整数类型的变量 A,并初始化为 4
void setup() {
Serial.begin(9600); // 初始化串口通信,波特率为 9600
}
void loop() {
Serial.print(A); // 输出变量 A 的值到串口
Serial.print(" "); // 输出一个空格
Serial.print(&A); // 输出变量 A 的地址到串口
Serial.println(); // 输出一个换行符
delay(1000); // 延时 1 秒
A = 10; // 重新初始化变量 A 的值为 10
}
在 Arduino IDE 中,可以通过串口监视器来查看输出结果。在 loop()
函数中,每次输出变量 A 的值、地址和重新初始化 A 的值后,都使用 delay(1000)
来延时 1 秒,以便观察输出结果的变化。
ROS1
#include <ros/ros.h>
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "my_node");
// 创建ROS节点句柄
ros::NodeHandle nh;
// 声明一个整数类型变量A,分配4个字节的内存空间
int A = 4;
// 发布变量A的值到"chatter"话题
ros::Publisher chatter_pub = nh.advertise<std_msgs::Int32>("chatter", 1000);
// 创建标准消息类型:整数类型(32位)
std_msgs::Int32 msg;
msg.data = A;
// 发布消息到"chatter"话题
ros::Rate loop_rate(1);
while (ros::ok()) {
msg.data = A;
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
上述代码是一个用于ROS1的C++节点,它使用了ROS的C++库。以下是代码的详细解释:
#include <ros/ros.h>
: 引入ROS的命名空间和头文件,这些文件包含了ROS中使用的各种函数和类。using namespace std;
: 引入std
命名空间,这样我们就可以直接使用标准库中的函数和对象,而无需在每个前面加上std::
。int main(int argc, char **argv)
: 主函数,程序的执行从这里开始。它接受两个参数:命令行参数的数量(argc
)和命令行参数的值(argv
)。ros::init(argc, argv, "my_node")
: 初始化ROS节点。这是ROS中每个节点必须做的第一步。它接受三个参数:命令行参数的数量和值,以及该节点的名称。ros::NodeHandle nh;
: 创建一个节点句柄对象nh
。节点句柄是ROS中非常重要的对象,它提供了与ROS系统的通信接口。ros::Publisher chatter_pub = nh.advertise<std_msgs::Int32>("chatter", 1000);
: 使用节点句柄创建一个名为chatter_pub
的发布者对象,并使用advertise
函数将其与名为"chatter"的话题关联起来。该发布者将使用std_msgs::Int32
消息类型发布消息。第二个参数是发布者队列的大小,这里设置为1000。std_msgs::Int32 msg;
: 创建一个名为msg
的std_msgs::Int32
消息对象,用于发布到"chatter"话题。msg.data = A;
: 设置消息对象msg
的数据字段为变量A
的值。chatter_pub.publish(msg);
: 使用发布者对象chatter_pub
发布消息对象msg
到"chatter"话题。ros::Rate loop_rate(1);
: 创建一个名为loop_rate
的速率对象,并将其设置为每秒发布一次消息(因为参数为1)。while (ros::ok())
: 创建一个循环,当ROS系统正常运行时,该循环会一直执行。ros::spinOnce();
: 执行一次ROS的Spin主循环,用于处理来自ROS系统的消息和调用回调函数。loop_rate.sleep();
: 调用速率对象的sleep
函数,暂停执行一段时间以保持发布频率为每秒一次。return 0;
: 返回0表示程序成功执行结束。
总的来说,该代码创建了一个ROS节点,它周期性地发布一个整数变量A
到名为"chatter"的话题中。它使用了ROS的核心组件,包括节点句柄、发布者和消息类型,以实现与ROS系统的交互。
……