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

news2025/1/14 0:56:27

文章目录

    • 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 this

error[E0308]: mismatched types
 --> t2.rs:3:18
  |
3 |     let b:bool = 0;
  |           ----   ^ expected `bool`, found integer
  |           |
  |           expected due to this

error: aborting due to 2 previous errors

For 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 type
    2 |     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.coloradmin.cn/o/684651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis【实战篇】---- 短信登录

Redis【实战篇】---- 短信登录 1. 导入黑马点评项目1. 导入SQL2. 有关当前模型3. 导入后端项目4. 导入前端项目5. 运行前端项目 2. 基于Session实现登录流程3. 实现发送短信验证码功能4. 实现登录拦截功能5. 隐藏用户敏感信息6. session共享问题7. Redis代替session业务1. 设计…

Spark10-11

10. 广播变量 10.1 广播变量的使用场景 在很多计算场景,经常会遇到两个RDD进行JOIN,如果一个RDD对应的数据比较大,一个RDD对应的数据比较小,如果使用JOIN,那么会shuffle,导致效率变低。广播变量就是将相对…

【C/C++】使用类和对象 练习EasyX图形库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【关联式容器】之map和set

【关联式容器】之map和set 容器类型树形结构的关联式容器mapset&#xff0c;multiset&#xff0c;multimap的区别与联系 容器类型 在STL中&#xff0c;我们接触过许多容器&#xff0c;例如&#xff1a;vector&#xff0c;list&#xff0c;stack&#xff0c;queue&#xff0c;m…

conll2003数据集下载与预处理

CoNLL-2003 数据集包括 1,393 篇英文新闻文章和 909 篇德文新闻文章。我们将查看英文数据。 1. 下载CoNLL-2003数据集 https://data.deepai.org/conll2003.zip 下载后解压你会发现有如下文件。 打开train.txt文件&#xff0c; 你会发现如下内容。 CoNLL-2003 数据文件包含由单…

逍遥自在学C语言 | 指针陷阱-空指针与野指针

前言 在C语言中&#xff0c;指针是一种非常强大和灵活的工具&#xff0c;但同时也容易引发一些问题&#xff0c;其中包括空指针和野指针。 本文将带你了解这两个概念的含义、产生原因以及如何避免它们所导致的问题。 一、人物简介 第一位闪亮登场&#xff0c;有请今后会一直…

【玩转Docker小鲸鱼叭】理解DockerFile如此简单

DockerFile构建过程 DockerFile 是Docker的一个配置文件&#xff0c;本质上来说它只是一个文本文件&#xff0c;它是用来构建Docker镜像的。DockerFile配置文件中包含了一系列的指令和配置信息&#xff0c;用于描述如何构建镜像以及如何运行容器。通过编写 Dockerfile&#xf…

RISC-V处理器的设计与实现(二)—— CPU框架设计

前面我们选好了要实现的指令集&#xff0c;并且了解了每个指令的功能&#xff08;传送门&#xff1a;RISC-V处理器的设计与实现&#xff08;一&#xff09;—— 基本指令集_Patarw_Li的博客-CSDN博客&#xff09;&#xff0c;接下来我们就可以开始设计cpu了。当然我们不可能一上…

ChatGPT更新的使用指南,与其他类似的人工智能的软件和服务-更新版(2023-6-25)

文章目录 一、什么是ChatGPT二、如何使用三、如何使用ChatGPT帮助我们的工作和生活四、高阶用法1、角色扮演2、英语口语老师3、在搜索引擎中集成ChatGPT 五、常见问题五、其他类似的软件和服务 如果你还不知道如何注册和使用&#xff0c;可看末尾&#xff0c;手把手教你。 一、…

Linux线程同步

同步的几种方式&#xff1a;信号量&#xff0c;互斥锁&#xff0c;条件变量&#xff0c;读写锁 同步&#xff1a;对程序的执行过程进行控制&#xff0c;保证对临界资源的访问同一时刻只能有一个进程或线程访问。 2.1信号量 存在P操作&#xff1a;获取资源&#xff0c;信号量…

58.最后一个单词的长度

LeetCode-58.最后一个单词的长度 1、题目描述2、解题思路3、代码实现4、解题记录 1、题目描述 题目描述&#xff1a; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任…

通讯录获取APP程序分析

前言 APP非法获取用户通讯录等隐私信息 我用技术分析APP是如何获取信息的 如果你不幸中招了&#xff0c;可以参考下方链接(有偿) 我的方法是替换掉通讯录数据&#xff0c;替换不成功包退&#xff01; 每日16:00-06:00在线&#xff0c;5分钟受理&#xff0c;2~3小时完成 点下面…

下载安装mysql与设置密码详细步骤(压缩包版本)

目录 一、前言 二、操作步骤 &#xff08;一&#xff09;下载与解压缩 &#xff08;二&#xff09;配置环境变量 &#xff08;三&#xff09;安装MySQL服务 &#xff08;四&#xff09;设置ini文件和data文件 &#xff08;五&#xff09;启动MySQL服务和设置密码 三、…

【C++ 程序设计】第 5 章:类的继承与派生

目录 一、类的继承与类的派生 &#xff08;1&#xff09;继承的概念 &#xff08;2&#xff09;派生类的定义与大小 ① 派生类的定义 ② 派生类的大小 &#xff08;3&#xff09;继承关系的特殊性 &#xff08;4&#xff09;有继承关系的类之间的访问 &#xff08;5&am…

多线程单例模式

1、单例模式 顾名思义&#xff0c;单例模式能保证某个类在程序中只存在唯一一份示例&#xff0c;而不会创建出多个实例。就像java的JDBC编程只需要创建一个单例类DataSourece从这个DataSorce中获取数据库连接。没必要创建多个对象。 单例模式具体实现方式分为“饿汉”和“懒汉…

java编译与反编译

参考&#xff1a; Idea 使用技巧记录_source code recreated from a .class file by intell_hresh的博客-CSDN博客 深入理解Java Class文件格式&#xff08;一&#xff09;_昨夜星辰_zhangjg的博客-CSDN博客 实践详解javap命令&#xff08;反编译字节码&#xff09;_天然玩家…

【运筹优化】元启发式算法详解:迭代局部搜索算法(Iterated Local Search,ILS)+ 案例讲解代码实现

文章目录 一、介绍二、迭代局部搜索2.1 总体框架2.2 随机重启2.3 在 S* 中搜索2.4 ILS 三、获得高性能3.1 初始解决方案3.2 Perturbation3.2.1 扰动强度3.2.2 自适应扰动3.2.3 更复杂的扰动方案3.2.4 Speed 3.3 接受准则3.4 Local Search3.5 ILS 的全局优化 四、ILS 的精选应用…

Windows PE怎么修复系统?使用轻松备份解决!

​什么是Windows PE? Windows预先安装环境&#xff08;英语&#xff1a;Microsoft Windows Preinstallation Environment&#xff09;&#xff0c;简称Windows PE或WinPE&#xff0c;是Microsoft Windows的轻量版本&#xff0c;主要提供个人电脑开发商&#xff08;主要为OEM厂…

electron+vue3全家桶+vite项目搭建【20】窗口事件广播,通用事件封装

引入 electron中的渲染进程与主进程之间的数据交互需要利用ipc通信&#xff0c;互相订阅/通知来实现&#xff0c;我们不妨封装一个通用事件广播&#xff0c;利用自定义的事件名称来让主进程遍历窗口挨个推送对应内容&#xff0c;来实现事件的广播。 demo项目地址 实现思路 …

【计算机视觉】MaskFormer:将语义分割和实例分割作为同一任务进行训练

文章目录 一、导读二、逐像素分类和掩码分类的区别2.1 逐像素分类2.2 掩码分类2.3 区别 三、DETR四、MaskFormer五、MaskFormer用于语义和实例分割六、总结 一、导读 目标检测和实例分割是计算机视觉的基本任务&#xff0c;在从自动驾驶到医学成像的无数应用中发挥着关键作用。…