機器人CPP編程基礎-02變量Variables
全文AI生成。
C++
#include<iostream>using namespace std;main()
{int a=10,b=35; // 4 bytescout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;cout<<"Value of b : "<<b<<" Address of b : "<<&b <<endl;short s=20; //2 bytescout <<"Value of s : "<< s << endl;float f1=20.03; //4 bytesdouble d1=50.55416416; //8 bytescout <<"Value of f1 : "<< f1 << endl;cout <<"Value of d1 : "<< d1 << endl;char c1='A';cout<<c1<<endl;string s1="Hello Tridib";cout<<s1<<endl;string s2="Welcome to CPP !";cout<<s2<<endl;string combineStrings=s1+", "+s2;cout<<combineStrings<<endl;bool b1=true; //Boolean is true or false. FALSE IS ALWAYS ZERO, EVERY OTHER NUMBER IS TRUE.cout<<b1<<endl;b1=1515;cout<<b1<<endl;b1=-445;cout<<b1<<endl;b1=0;cout<<b1<<endl;//Positive numbers or unsigned numbers. Increases the positive range.unsigned short int u1=60445;cout<< u1 <<endl;const string myname="Tridib";cout << myname << endl;}
該代碼是用C++編寫的,它包含了各種數據類型的聲明和初始化,以及如何使用cout
語句來打印這些變量的值和地址。下面是每行的詳細解析:
以上就是對這段代碼的詳細解析。
#include<iostream>
: 包含輸入/輸出流的庫。這使得程序可以使用輸入和輸出功能。using namespace std;
: 聲明使用std
命名空間。std
是標準縮寫,表示標準庫。這樣,我們就可以直接使用標準庫中的名字,而不用在每個名字前都寫std::
。main()
: 程序的主函數,所有C++程序都從這里開始執行。int a=10,b=35;
: 聲明兩個整數變量a和b并初始化為10和35。cout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;
: 使用cout
打印"Value of a : "和變量a的值,然后打印"Address of a : "和變量a的地址。&
操作符用于獲取變量的內存地址。endl
用于插入新行。cout<<"Value of b : "<<b<<" Address of b : "<<&b <<endl;
: 與上述類似,但打印的是變量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<<c1<<endl;
: 使用cout
打印變量c1的值,也就是字符'A'。string s1="Hello Tridib";
: 聲明一個字符串變量s1并初始化為"Hello Tridib"。cout<<s1<<endl;
: 使用cout
打印變量s1的值,也就是"Hello Tridib"。string s2="Welcome to CPP !";
: 聲明另一個字符串變量s2并初始化為"Welcome to CPP !"。cout<<s2<<endl;
: 使用cout
打印變量s2的值,也就是"Welcome to CPP !"。string combineStrings=s1+", "+s2;
: 將s1和s2連接在一起,創建一個新的字符串combineStrings。cout<<combineStrings<<endl;
: 使用cout
打印變量combineStrings的值,也就是"Hello Tridib, Welcome to CPP !"。bool b1=true;
: 聲明一個布爾型變量b1并初始化為true。在C++中,布爾類型的值只能是true或false。cout<<b1<<endl;
: 使用cout
打印變量b1的值,也就是true。在C++中,輸出布爾值時會自動轉換為字符串"true"或"false"。b1=1515;
: 將變量b1的值更改為整數1515。在C++中,布爾類型的值也可以是0或非0的任何整數。cout<<b1<<endl;
: 使用cout
打印變量b1的值,由于非零的整數會被視為true,所以這里輸出的是true。b1=-445;
: 將變量b1的值更改為-445。cout<<b1<<endl;
: 使用cout
打印變量b1的值,由于非零的整數會被視為true,所以這里輸出的是true。
-
?
b1=0;
: 將變量b1的值更改為0。 cout<<b1<<endl;
: 使用cout
打印變量b1的值,由于布爾類型的值只能是true或false,所以這里輸出的是false。unsigned short int u1=60445;
: 聲明一個無符號短整型變量u1并初始化為60445。在大多數系統上,unsigned short通常是2字節(16位)。cout<< u1 <<endl;
: 使用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<T>
:這種類型的指針在離開作用域時自動刪除其所有權。它只能指向一個對象,并保證其指向的對象在任何時刻都有一個所有者。std::shared_ptr<T>
:這種類型的指針允許多個智能指針共享同一個對象。當最后一個智能指針離開作用域或被重置時,它會自動刪除所指向的對象。std::weak_ptr<T>
:這種類型的指針也是指向共享對象的,但不會增加對象的引用計數。當最后一個shared_ptr
離開作用域或被重置時,weak_ptr
將看到對象的析構。
這些是C++中的主要變量類型。根據需要,還可以創建自定義類型和結構,以滿足特定的編程需求。
C++14引入了一些新的變量類型,這些類型在C++11和C++17中都有所擴展。以下是一些C++14中引入的新變量類型:
-
原子類型(Atomic Types):這些類型定義在<atomic>頭文件中,用于表示可以在不引起其他線程阻塞的情況下被單獨操作的值。原子類型包括整數、浮點數和指針類型。
atomic<T>
:定義了一個原子操作的基本類型。原子操作是一種在單個線程中執行的操作,它可以在沒有其他線程干擾的情況下修改數據。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 */ }; |
- 右值引用(Rvalue References):進一步擴展了右值引用,使其更易于使用和更靈活。C++14引入了
std::move
和std::forward
函數,用于移動語義和完美轉發。 - 類型萃取(Type deduction):C++14引入了一些新的類型萃取規則,包括萃取數組和函數類型的參數。
- Unicode 支持:C++14引入了更全面的 Unicode 支持,包括新的字符類型和函數。
- 線程局部存儲(Thread-local storage):C++14引入了線程局部存儲,允許為每個線程存儲單獨的變量副本。
- 二進制字面值:C++14引入了新的二進制字面值,包括二進制整數和二進制浮點數。
- 字面值的顯示浮點數:C++14允許在字面值中使用顯示浮點數,例如
0x1p+2n
表示一個十六進制浮點數。
這些是C++14引入的一些主要變量類型和功能。這些功能增強了語言的表達力和性能,并提供了更多的靈活性和控制。
C++20引入了一些新的變量類型和功能,進一步擴展了語言的表達力和性能。以下是一些C++20中引入的新變量類型和功能:
-
概念(Concepts):概念是一種用于指定類型必須滿足的條件的語言特性。可以使用概念來約束模板參數的類型,以便在模板實例化時確保類型符合特定的要求。這有助于提高代碼的可讀性和可維護性。
cpp復制代碼
template <typename T> concept bool C() { return requires (T t) { t++; }; } | |
template <C T> void f(T t) { ++t; } |
-
結構化綁定(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 <typename T> void f(T value) { | |
if constexpr (std::is_integral_v<T>) { | |
// 處理整數類型 | |
} else if constexpr (std::is_floating_point_v<T>) { | |
// 處理浮點數類型 | |
} | |
} |
- 三向比較(Three-way Comparison):C++20引入了三向比較運算符
<=>
,用于執行基于比較的操作。這可以用于實現自定義類型的比較操作。 - 模板別名(Template Aliases):C++20引入了模板別名,允許使用別名來簡化模板的聲明和使用。
- 折疊表達式(Fold Expressions):C++20引入了折疊表達式,允許在展開二元或三元運算符時進行遞歸計算。這對于實現高階函數和泛型算法非常有用。
- 嵌套的命名空間(Nested Namespaces):C++20允許在命名空間內部定義另一個命名空間,以更好地組織代碼。
- 上下文重復名稱(Contextual Repeated Name):C++20允許在特定上下文中重復使用名稱,這有助于提高代碼的可讀性。
- 模塊(Modules):C++20引入了模塊,這是一種將代碼劃分為邏輯單元的方式,以提高編譯速度和代碼組織。模塊可以用于實現特定功能或庫的封裝和重用。
- 概念工具(Concept Tools):C++20提供了一組工具,用于定義和操作概念。這有助于提高代碼的可讀性和可維護性。
這些是C++20引入的一些主要變量類型和功能。這些功能進一步增強了語言的表達力和性能,并提供了更多的靈活性和控制。
Arduino
#include <avr/pgmspace.h> 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轉換為浮點數類型。
-
常量和常量表達式
- 常量:使用const關鍵字定義常量,其值在程序運行期間不可改變。例如,const int kConstantValue = 42;
- 常量表達式:使用const和字面值初始化器定義常量表達式。常量表達式必須是可以在編譯時計算出結果的表達式,不能包含變量或函數調用。例如,const int kConstantExpression = 4 * 7;是常量表達式,而const int kVariableExpression = k + 1;不是常量表達式,因為k的值在編譯時無法確定。
這些是在Arduino IDE中常用的C++變量類型和相關概念。了解這些變量類型和概念對于編寫Arduino程序非常重要。
ROS1
AI生成是否可行???
#include <ros/ros.h>
#include <std_msgs/String.h> 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++變量類型包括以下幾種:
- 基本類型:與標準C++相同,包括int、float、double、char等。
- 智能指針類型:ROS1 Noetic主要使用
std::shared_ptr
和std::unique_ptr
兩種智能指針類型,用于自動管理資源的生命周期。 - 回調函數類型:ROS1 Noetic提供了ROS1特定的回調函數類型,如
boost::function
和boost::slot
,用于實現事件驅動的回調機制。 - 命名空間:ROS1 Noetic使用了多個命名空間,如
ros
、std_msgs
、sensor_msgs
等,用于組織和管理ROS相關的代碼和消息類型。 - 消息類型:ROS1 Noetic使用特定的消息類型,如
std_msgs::String
、sensor_msgs::Image
等,用于在ROS系統中進行節點之間的通信。這些消息類型通常定義在ROS1的消息規范中。 - 服務類型:ROS1 Noetic使用特定的服務類型,如
ros::ServiceServer
和ros::ServiceResponse
,用于在ROS系統中實現服務調用。這些服務類型定義在ROS1的服務規范中。 - 動作類型:ROS1 Noetic使用特定的動作類型,如
actionlib::SimpleActionClient
和actionlib::SimpleGoal
,用于在ROS系統中實現復雜的行為控制。這些動作類型定義在ROS1的動作規范中。
除了上述變量類型外,ROS1 Noetic還提供了許多其他的工具和庫,用于實現機器人控制、傳感器數據處理、可視化等功能。