機器人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系統的交互。
……
?