cisen / blog

Time waits for no one.
133 stars 20 forks source link

c++转rust #1135

Open cisen opened 2 years ago

cisen commented 2 years ago

https://zhuanlan.zhihu.com/p/75385189

char = i8, int = i32, unsign int = u32, long int = i64, float = f32, double = f64, nsigned int = char = &str std:pair = tuple `const char a; (a++)`, a是一个指针,a值是一个地址,a获取a指针指向的值,a代表第一个char字符的地址,*(a++) 代表访问第二个字符

cisen commented 2 years ago

https://zhuanlan.zhihu.com/p/75385189

Hello, World C++

#include <iostream>
int main(int argc, char* argc[]) {
    std::cout<<"Hello, world"<<std::endl;
    return 0;
}

Rust

fn main() {
    println!("Hello, world");
}

从第一个例子可以看到Rust的语法习惯对于从类C语言转过来的开发者还是很友好的。代码块仍然是大括号包围的,语句仍然是分号结尾的,当然主函数还是叫做main。

变量 C++

int number = 0;
const int const_number = -100;
number = const_number;

Rust

let mut number = 0;
let const_number = -100;
number = const_number;

这里可以看到,在Rust中,变量默认是不可变的,除非加了mut关键字。

基本数据类型 C++

bool boolean = true;
std::uint8_t u8 = 0;
std::int16_t i16 = 0;
std::size_t size = 0;
float real = 0;
double precise_real = 0;
char character = 'A';
const char* c_string = "Hello, world";
std::string string = "Hello, world";

Rust

let boolean: bool = true;
let uint8: u8 = 0;
let int16: i16 = 0;
let size: usize = 0;
let real: f32 = 0;
let precise_real: f64 = 0;
let character: char = ' ';
let str_ref: &str = "Hello, world  ";
let string: String = "Hello, world  ".to_owned();

这里可以看到Rust的数据类型系统跟C++还是有很大的不同:

数值类型都是定长的类型,这样开发者在开发的时候可以明确的知道它在内存中占用的大小,以及它们的取值范围,避免犯错; 字符类型是4字节的Unicode字面量(Scalar Value),可以完整的涵盖Unicode的所有字符集,所以可以看到我可以把emoji 赋值给一个字符变量; 和C++的const char*类似的是&str类型,str类型实际上是无法在程序中定义的(因为它的长度是动态的),你只能使用它的引用类型(&str);它指向一个以UTF8编码存储的字符串(这样比较节约内存,又能完整覆盖unicode编码),但操作的时候,又是以char类型进行操作的,避免用户手工处理UTF8的过程中出现错误。(说句题外话,Rust的字符串库是所有语言中,对Unicode规范支持的最完善的,没有之一)。 Rust中的String类型实际上是std::string::String类型,它与C++的std::string类似,内部存储了字符串的拷贝,因此提供了操作字符串的内容,比如修改字符串等等。同样的,它内部的存储模式是UTF8,但操作的时候是以character为单位来操作的

cisen commented 2 years ago

指针

void 指针是一种特殊的指针类型,可用于存放任意对象的地址,但是丢失了类型信息。如果想要完整的提取指向的数据,程序员就必须对这个指针做出正确的类型转换,然后再解指针。因为,编译器不允许直接对void类型的指针做解指针操作(提示非法的间接寻址)。