Rust 初体验3

“开胃”代码

fn main() {let (a, mut b): (bool,bool) = (true, false);// a = true,不可变; b = false,可变println!("a = {:?}, b = {:?}", a, b);b = true;assert_eq!(a, b);
}

Rust语法和C语言有很大不同,特别是在变量声明、打印输出和错误处理等方面。

  1. fn main() {...}:这是Rust程序的主函数,类似于C语言中的int main() {...}。 但是 fn 不是数据类型,而是函数类型。

  2. let (a, mut b): (bool,bool) = (true, false);:这里定义了两个布尔变量a和b,其中a是不可变的(immutable),而b是可变的(mutable)。这与C语言中的定义方式不同,C语言通常使用const关键字来定义常量,而变量则不需要特殊声明。

  3. println!("a = {:?}, b = {:?}", a, b);:这是一个宏调用,用于打印变量a和b的值。在C语言中,通常使用printf函数来实现类似的功能。

  4. b = true;:这行代码将变量b的值改为true。在C语言中,可以直接使用赋值运算符=来改变变量的值。

  5. assert_eq!(a, b);:这是一个断言宏,用于检查两个表达式是否相等。如果不相等,程序会在这里停止执行并报告错误。在C语言中,通常需要自己编写比较和错误处理的代码。

const

Rust语言和C语言都支持常量(const)的概念,但它们在定义、使用和内存存储方面存在一些差异。

1.定义方式

  • C语言中的const变量需要在声明时指定类型和初始值,例如const int x = 10;

  • Rust语言中的const常量在定义时不需要显式指定类型,而是通过初始值自动推断类型,例如const X: i32 = 10;

2.可变性

  • C语言中的const变量的值,在程序运行过程中不能被修改,但它们所指向的对象(如果是指针类型的const变量)是可以被修改的。

  • Rust语言中的const常量的值,在编译时就已经确定,并且在运行过程中不能被修改。Rust还提供了不可变变量(let)的概念,用于在运行时绑定一个不可变的值。

3.作用域

  • C语言中的const变量的作用域取决于其声明的位置。全局const变量在整个程序中可见,而局部const变量的作用域仅限于函数内部。

  • Rust语言中的const常量具有静态作用域,即它们在程序的整个生命周期内都是可见的,类似于C语言中的全局const变量。

4.内存存储

  • C语言中的const变量通常保存在程序的只读内存区域(ROM)中,具体的存储位置取决于变量的类型和编译器的实现。

  • Rust语言中的const常量的值在编译时就已经被确定,并且被直接嵌入到生成的可执行文件中。这意味着Rust的const常量不需要额外的内存分配,可以提高程序的性能。

Rust的const常量在编译时确定,并且具有静态作用域,而C语言的const变量在运行时确定,并且作用域取决于其声明的位置。

此外,Rust的const常量的值被直接嵌入到生成的可执行文件中,而C语言的const变量的值通常保存在程序的只读内存区域中。

Rust 常量

在Rust中,常量和变量有以下差异:

第一,常量不允许使用 mut。常量不仅仅默认不可变,而且自始至终不可变。

第二,常量使用 const 关键字而不是 let 关键字来声明,并且值的类型必须标注。

第三,常量可以在任何作用域中声明,包括全局作用域。

const MAX_POINTS: u32 = 100_000;

Rust 常量的命名约定是字母全部大写,使用下划线分隔单词,对数字字面量插入下划线,可提高可读性。

变量遮蔽(shadowing)

在 Rust 中,如果一个块作用域中的变量与外层作用域中的变量同名,那么在块内,外层作用域中的变量将被隐藏。

例如,在下面的代码中,变量 x 在外层作用域中被声明,但在内层作用域中被重新声明。在内部作用域中,变量 x 的值是 5,而不是外层作用域中的 10。

fn main() {let x = 5;{let x = x + 1;println!("The value of x in the inner scope is: {}", x);}println!("The value of x in the outer scope is: {}", x);
}

Rust中的变量遮蔽,与C语言中的变量隐藏,都是为了解决同名变量之间的冲突问题。

两者的差别在于:

  • 作用域:Rust中的变量遮蔽发生在同一作用域内,而C语言中的变量隐藏通常发生在嵌套的作用域之间。

  • 可见性:在Rust中,被遮蔽的变量在当前作用域内不再可见,而在C语言中,内部作用域的变量会隐藏外部作用域的同名变量,但外部作用域的变量在内部作用域之外仍然可见。

  • 目的:Rust中的变量遮蔽旨在提高代码的可读性和可维护性,避免在代码的不同部分意外地使用相同的变量名;而C语言中的变量隐藏允许在不同的作用域中使用相同的变量名,而不会相互干扰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/674605.shtml

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

相关文章

PAT-Apat甲级题1009(python和c++实现)

PTA | 1009 Product of Polynomials 1009 Product of Polynomials 作者 CHEN, Yue 单位 浙江大学 This time, you are supposed to find AB where A and B are two polynomials. Input Specification: Each input file contains one test case. Each case occupies 2 lin…

dockerfile 详细讲解

当编写 Dockerfile 时,你需要考虑你的应用程序所需的环境和依赖项,并将其描述为一系列指令。下面是一个简单的示例,演示如何编写一个用于部署基于 Node.js 的网站的 Dockerfile: Dockerfile # 使用官方 Node.js 镜像作为基础镜像…

力扣:47. 全排列 II

回溯解法思路: 1.先写一个集合来接收全部的全排列,再写一个集合来接受单个的全排列。在声明一个int【】数组来用于去重用的标记nums数组中什么元素用了的标记。同时排列一下nums数组方便去除重复的全排列。 2.调用回溯函数,终止条件为li2集…

Matplotlib绘制炫酷散点图:从二维到三维,再到散点图矩阵的完整指南与实战【第58篇—python:Matplotlib绘制炫酷散点图】

文章目录 Matplotlib绘制炫酷散点图:二维、三维和散点图矩阵的参数说明与实战引言二维散点图三维散点图散点图矩阵二维散点图进阶:辅助线、注释和子图三维散点图进阶:动画效果和交互性散点图矩阵进阶:调整样式和添加密度图总结与展…

低代码平台痛点

1、数据查询性能一直是低代码平台的痛点 原来的平台,数据查询时,直接查数据库,现在低代码平台需要先经过元数据解析后,才知道如何查数据库,因此增加了查询的耗时,针对不同的低码平台设计,影响的…

stable_diffusion提示词编写笔记(1)

stable_diffusion提示词编写笔记(1) start 总结一下AI绘画学到的知识。 一.提示词分两种: 1.正向提示词; 2.反向提示词; 一个对应你希望图形包含的内容提示词,一个对应你不希望图形出现的内容提示词。 二.如何书写提示词 1.内…

记一次VulnStack渗透

信息收集 netdiscover的主机发现部分不再详解,通过访问端口得知20001-2003端口都为web端口,所以优先考虑从此方向下手 外网渗透 GetShell Struct漏洞 访问2001端口后,插件Wappalyzer爬取得知这是一个基于Struct的web站点,直接…

gtkmm4 应用程序使用 CSS 样式

文章目录 前言css选择器css文件示例源代码效果 前言 程序样式和代码逻辑分离开 使代码逻辑更可观 css选择器 Cambalache提供了两种css-classes 相当于css里的类名:class“类名”css-name 相当于css里的标签名:spin div p 啥的 如上我设置了这个按钮控件的类名为testButton 标…

【Java】万万没想到,又被问ThreadLocal了

我待ThreadLocal如初恋,ThreadLocal虐我千百遍。但这一次,要彻底搞懂ThreadLocal 回顾一下面试名场面: 面试官:Handler如何做到与线程绑定的? 我:每个Handler只有一个相关联的Looper,线程绑定…

如何开始深度学习,从实践开始

将“如何开始深度学习”这个问题喂给ChatGPT和文心一言,会给出很有专业水准的答案,比如: 要开始深度学习,你可以遵循以下步骤: 学习Python编程语言的基础知识,因为它在深度学习框架中经常被使用。 熟悉线性…

自然人如何代开发票

1:登录国家税务总局深圳市电子税务局 地址:国家税务总局深圳市电子税务局 2:个人所得税APP 扫描登录 或 身份证登录 3:选择 自然人代开增值税电子普通发票 4:申请代开 5:人脸识别 6:画框的…

509. 斐波那契数

Problem: 509. 斐波那契数 文章目录 思路解题方法复杂度Code解法一 (暴力搜索)解法二 (记忆化搜索)解法三(动态规划)解法四(动态规划(空间O(1))) 思路 斐波那…

【每日一题】LeetCode——链表的中间结点

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

【Python4Delphi】学习笔记(一):介绍篇

一、前言: 1. python语言简介: 众所周知,python是目前非常流行的编程语言之一,自20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。 由于Python语言的简洁性、易读性以及可扩展性…

苏宁易购移动端首页(rem布局)

技术选型 方案∶采取单独制作移动页面方案技术:布局采取rem适配布局( less rem &#xff0b;媒体查询)设计图:设计图采用750px设计尺寸 设置视口标签以及引入初始化样式 <meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalable…

Qt网络编程-写一个简单的网络调试助手

环境 Windows&#xff1a;Qt5.15.2&#xff08;VS2022&#xff09; Linux&#xff1a;Qt5.12.12&#xff08;gcc) 源代码 TCP服务器 头文件&#xff1a; #ifndef TCPSERVERWIDGET_H #define TCPSERVERWIDGET_H #include <QWidget> namespace Ui { class TCPServerW…

2024.1.30力扣每日一题——使循环数组所有元素相等的最少秒数

2024.1.30 题目来源我的题解方法一 暴力模拟&#xff08;无法通过&#xff09;方法二 哈希表数学 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2808 我的题解 方法一 暴力模拟&#xff08;无法通过&#xff09; 直接暴力枚举。记录每一个元素所在的位置&#xff0c;然…

注意啦,MySQL8.0最新版是没有utf8选项,但是有utf8mb3和utf8mb4选项

今天在安装完MySQL最新版&#xff08;8.0.36&#xff09;&#xff0c;然后用navicat连接数据&#xff0c;创建数据库的时候&#xff0c;发现: MySQL最新版是没有utf8选项&#xff0c;但是有utf8mb3和utf8mb4选项 然后就只能卸载掉最新版&#xff0c;安装了8.0.28. &#xff08…

一文学会Axios的使用

异步请求 同步发送请求过程如下 浏览器页面在发送请求给服务器&#xff0c;在服务器处理请求的过程中&#xff0c;浏览器页面不能做其他的操作。只能等到服务器响应结束后才能&#xff0c;浏览器页面才能继续做其他的操作。 异步发送请求过程如下浏览器页面发送请求给服务器&…

C语言常见面试题:变量名可以包含哪些字符?变量名有哪些命名规则?

C语言常见面试题之变量名可以包含哪些字符&#xff1f;变量名有哪些命名规则呢&#xff1f; 在C语言中&#xff0c;变量名可以包含字母、数字和下划线&#xff0c;但是有些字符是不能用的。以下是一些关于变量名的规则和限制&#xff1a; 变量名的命名规则&#xff1a; 变量名…