rust abc(3): 布尔和字符类型的使用并与C/C++对比

news/2024/11/30 7:56:30/

文章目录

    • 1. 目的
    • 2. 布尔类型
      • 2.1 只能赋值为小写的 true, false
      • 2.2 不能把数字赋值给bool类型变量
      • 2.3 正确写法汇总
    • 3. 字符类型
      • 3.1 UTF-8 编码
      • 3.2 字符的意思是单个字符,多个字符不能用单引号
    • 4. 总结

在这里插入图片描述

1. 目的

继续熟悉 rust 语言的基本数据类型, 感受 rust 编译期类型检查的严格, 并和 C/C++ 做简单对比。

2. 布尔类型

2.1 只能赋值为小写的 true, false

rust 语言的 bool 类型只有 truefalse 两种取值。

换言之, 赋值为大写开头、全大写的 True, False, TRUE, FALSE, 都不被识别,编译阶段就会报错:

t1.rs:

fn main() {let a = true;let b = false;let c = True;let d = False;let e = TRUE;let f = FALSE;println!("a {}", a);println!("b {}", b);println!("c {}", c);println!("d {}", d);println!("e {}", e);println!("f {}", f);
}
(base) zz@Legion-R7000P% rustc t1.rs 
error[E0425]: cannot find value `True` in this scope--> t1.rs:4:13|
4 |     let c = True;|             ^^^^ not found in this scope|
help: you may want to use a bool value instead|
4 |     let c = true;|             ~~~~error[E0425]: cannot find value `False` in this scope--> t1.rs:5:13|
5 |     let d = False;|             ^^^^^ not found in this scope|
help: you may want to use a bool value instead|
5 |     let d = false;|             ~~~~~error[E0425]: cannot find value `TRUE` in this scope--> t1.rs:6:13|
6 |     let e = TRUE;|             ^^^^ not found in this scope|
help: you may want to use a bool value instead|
6 |     let e = true;|             ~~~~error[E0425]: cannot find value `FALSE` in this scope--> t1.rs:7:13|
7 |     let f = FALSE;|             ^^^^^ not found in this scope|
help: you may want to use a bool value instead|
7 |     let f = false;|             ~~~~~error: aborting due to 4 previous errors

2.2 不能把数字赋值给bool类型变量

t2.rs:

fn main() {let a:bool = 1;let b:bool = 0;
}

如果是来自 C/C++ 的环境, 很容易觉得奇怪,为啥不能把整数类型窄化到 bool 类型。然而 rust 就是这么的严格, 编译阶段就不让你这么写,避免潜在的坑。

看看编译报错:

(base) zz@Legion-R7000P% rustc t2.rs 
error[E0308]: mismatched types--> t2.rs:2:18|
2 |     let a:bool = 1;|           ----   ^ expected `bool`, found integer|           ||           expected due to thiserror[E0308]: mismatched types--> t2.rs:3:18|
3 |     let b:bool = 0;|           ----   ^ expected `bool`, found integer|           ||           expected due to thiserror: aborting due to 2 previous errorsFor more information about this error, try `rustc --explain E0308`.

2.3 正确写法汇总

fn main() {let a = true;let b = false;let c:bool = true;let d:bool = false;let e:bool = a;let f:bool = b;
}

3. 字符类型

3.1 UTF-8 编码

rust 语言的字符使用 UTF-8 编码, 意味着既可以赋值为英文字符、数字、下划线、英文标点, 也可以用中文, 甚至 emoji。

fn main() {let a = 'a';let b = '~';let c = '"';let d = '润';let e = '😀';println!("a {}", a);println!("b {}", b);println!("c {}", c);println!("d {}", d);println!("e {}", e);
}

运行:

zz@Legion-R7000P% rustc c1.rs
zz@Legion-R7000P% ./c1 
a a
b ~
c "
d 润
e 😀

3.2 字符的意思是单个字符,多个字符不能用单引号

这一点和C/C++的概念上是一贯相承的,只不过C/C++中如果你给多个字符用单引号包起来,编译阶段并不是报错。

在这里插入图片描述

c2.rs:

fn main() {let a = '你好';let b = 'hi';
}
error: character literal may only contain one codepoint--> c2.rs:2:13|
2 |     let a = '你好';|             ^^^^^^|
help: if you meant to write a `str` literal, use double quotes|
2 |     let a = "你好";|             ~~~~~~error: character literal may only contain one codepoint--> c2.rs:3:13|
3 |     let b = 'hi';|             ^^^^|
help: if you meant to write a `str` literal, use double quotes|
3 |     let b = "hi";|             ~~~~error: aborting due to 2 previous errors

作为对比,我们用C++写一写,单引号包裹多个字符赋值到变量:
c2.cpp

int main() {char a = '你好';char b = 'hi';return 0;
}

编译, 发现仅仅是报告警告:

zz@Legion-R7000P% g++ c2.cpp
c2.cpp:2:14: warning: character constant too long for its type2 |     char a = '你好';|              ^~~~~~
c2.cpp:3:14: warning: multi-character character constant [-Wmultichar]3 |     char b = 'hi';|              ^~~~
c2.cpp: In function ‘int main()’:
c2.cpp:2:14: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘-1595562563’ to ‘'\37777777675'[-Woverflow]2 |     char a = '你好';|              ^~~~~~
c2.cpp:3:14: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘26729’ to ‘'i'[-Woverflow]3 |     char b = 'hi';|              ^~~~

4. 总结

Rust 的数据类型, 乍一看是用 let 赋值, 似乎是和 javascript 学的, 颇有一种“自由定义类型”的感觉。

然而, 你可以指定数据类型,如 let a:bool = true, 它会“傻傻的”按你指定的类型做编译期的类型检查。

你即便不指定数据类型, 但等号右侧的值如果是瞎写, 例如 True False 这样不存在的关键字, 又或者把 >=2 个字符塞到单引号里的“胡搞行为”, rust 编译器都会一一识别并且准确报告, 相比之下 C/C++ 编译器让人觉得“很坑”: 都识别出来问题了, 就是不报告为错误。从这一点来说, rust 很安全, 习惯了“自由自在”写C/C++代码的人也许会觉得“很难受”, 而踩过“自由C/C++”代码坑的人会觉得 rust 真好。

实际上, C/C++ 把一些编译选项做人为修改, 把一些重要的 warning 强行设置为 error, 那么某种程度上就享受到了 rust 语言的那种编译期安全检查的优点, 这并不难做到, 只要使用 overlook 就可以做到:

include(overlook.cmake)

欢迎尝试。


http://www.ppmy.cn/news/575964.html

相关文章

刷机一直请求shsh_爱思助手刷机时提示请求SHSH失败的解决技巧

有那么一部份多朋友还不熟悉红米爱思助手怎么会刷机时提示请求SHSH失败的操作,下面小编就讲解爱思助手刷机时提示请求SHSH失败的解决技巧,希望对你们有所帮助哦。 爱思助手刷机时提示请求SHSH失败的解决技巧 问题:iPhoneXS Max系统想刷机到iO…

【MySQL实战】笔记

1、MySQL的基本架构组成 MySQL的基本架构组成包括以下几个部分: 连接器(Connection Manager):负责与客户端建立连接,并处理客户端发送的请求。连接器会验证客户端的身份、分配线程和缓存等资源,并将请求转…

基于前后端交互的论坛系统(课设高分必过)

目录 前言概述 一.前期准备 项目演示 用户注册 用户登录 主页面 发帖页面 个人信息及修改 用户主帖 站内信 需求分析 技术选型 二.建表分析 三.环境搭建 技术环境的检查与安装 检查JDK ​编辑 检查数据库 检查Maven 检查git ​编辑 项目启动的通用配置 新…

JAVA中XML读写

XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平台(比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等)也都把支持XML开发作为宣传口号之一 。由于笔者所从事的电子政务开发较早的引入了XML,所以尝到了许…

Python奇技淫巧

本文用作记录,在使用python过程中遇到的一些奇技淫巧,有些代码是本人所写,有些则是python内置函数,有些则取之互联网。在此记录,只为备份以及遗忘时方便查找。 本文将会持续更新,内容仅限记录一些常用好用却…

2-css-1

一 CSS 初体验 CSS 定义:层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种样式表语言,用来描述HTML文档的呈现(美化内容) CSS 书写在什么位置? title 标签下方哪个标签里面…

关于单片机内部的ROM、RAM、Falsh的解释

最近很多人问我:单片机内部什么是ROM、什么是Falsh,我们下载到单片机内部的程序存储在哪里…… 那么今天我就来讲讲我的理解: ROM(Read Only Memory):即是只读存储器,单片机的二进制可执行文件…

RT-thread应用讲解——FLASH分区

RT-thread应用讲解——FLASH分区 目录 RT-thread应用讲解——FLASH分区前言一、挂载FLASH二、ENV配置1、打开on-chip flash2、打开FAL软件包3、重新生成工程 三、分区处理1、定义flash设备表2、定义flash分区表3、FAL初始化 四、运行测试1、指定待操作的Flash设备或Flash分区2、…