【C++】赋值运算与变量交换的深入探讨

news2025/1/11 18:49:45

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯赋值操作符与连续赋值
  • 💯常见复合赋值符及其功能
  • 💯位操作符中的复合赋值符
  • 💯题目一:账户余额练习
    • 题目描述
    • 代码实现
    • 运行结果
    • 分析
  • 💯题目二:交换两个变量的值
    • 题目描述
    • 方法 1:使用第三个变量
    • 方法 2:不使用第三个变量(加减法)
    • 方法 3:使用位运算符(异或运算)
    • 方法 4:使用标准库函数 `std::swap`
  • 💯代码优化与可读性
    • 总结
  • 💯小结


在这里插入图片描述


💯前言

  • 在学习 C++ 语言 的过程中,赋值操作符复合赋值符 以及 变量交换 是基础中的核心概念,但也是理解编程逻辑和代码效率优化的重要环节。本文通过深入解析 赋值操作符变量交换 的实现方法、优化思路及扩展应用,帮助读者全面理解其机制和作用。
    C++ 参考手册
    在这里插入图片描述

💯赋值操作符与连续赋值

在这里插入图片描述
在 C++ 中,赋值操作符 = 用于将右侧的值赋给左侧的变量,这与数学中的等号有所不同。在编程中,赋值是一种动作,赋值的执行顺序是 从右到左 进行的,这意味着首先计算右侧表达式的值,然后将结果赋给左侧变量。

例如,以下代码演示了连续赋值的过程:

int a, b, c;
a = b = c = 3;

执行过程

  • 首先执行 c = 3,将值 3 赋给 c
  • 接着执行 b = c,将 c 的值赋给 b,此时 b 也为 3
  • 最后执行 a = b,将 b 的值赋给 a,最终 a 的值为 3

这种从右到左的赋值特性对于理解复杂表达式的计算顺序至关重要。

赋值操作符 是编程中的基础核心环节,理解其工作原理对于编写高效且易读的代码至关重要。在实际编程中,赋值操作符 的使用贯穿于 变量初始化值的更新 以及 表达式计算 等几乎所有的代码逻辑。熟悉赋值操作的执行方式不仅能帮助编程者编写出更优雅的代码,还能更好地理解编译器在代码优化过程中的行为。


💯常见复合赋值符及其功能

在这里插入图片描述
C++ 提供了一些复合赋值符,旨在简化代码的书写。这些复合赋值符包括 +=-=*=/= 等,它们将算术操作与赋值结合在一起,减少了代码的冗余,提高了可读性和效率。

复合赋值符示例一般写法作用
+=a += 10a = a + 10a 增加 10 并重新赋值给 a
-=a -= 10a = a - 10a 减去 10 并重新赋值给 a
*=a *= 10a = a * 10a 乘以 10 并重新赋值给 a
/=a /= 10a = a / 10a 除以 10 并重新赋值给 a
%=a %= 10a = a % 10a 除以 10 的余数赋值给 a

复合赋值符的使用使得代码更简洁和易读,但在某些情况下,过度的简化可能会导致代码的可理解性下降。特别是对于复杂逻辑,应根据代码的复杂度和读者的知识水平来平衡代码的简洁性与可读性。


💯位操作符中的复合赋值符

在这里插入图片描述
除了常见的 算术操作符C++ 还支持将 复合赋值符位操作符 结合使用。这些操作符在对 二进制数据 进行操作时非常有用,例如在 硬件编程性能优化资源受限 的场景中,位操作能够带来显著的效率提升。

复合赋值符示例一般写法作用
>>=a >>= 1a = a >> 1a 右移 1 位,并重新赋值给 a
<<=a <<= 1a = a << 1a 左移 1 位,并重新赋值给 a
&=a &= 10a = a & 10a10 进行按位与运算,并赋值给 a
|=a |= 10a = a | 10a10 进行按位或运算,并赋值给 a
^=a ^= 10a = a ^ 10a10 进行按位异或运算,并赋值给 a

对于需要直接控制 硬件低层次编程,或者在需要对 内存性能 进行严格优化的场景中,位操作符 的高效性使其成为一种不可或缺的工具。熟练掌握这些操作符能够帮助程序员编写更高效的低级代码。


💯题目一:账户余额练习

在这里插入图片描述
为了进一步理解赋值操作符的使用,我们可以通过一个简单的账户余额练习来实际操作变量的赋值和更新。


题目描述

在这里插入图片描述
假设小明的账户初始余额为 100 元,经过以下几个操作:

  • 存入 10 元。
  • 花费 20 元购物。
  • 将账户中剩余的钱全部取出。

要求:在每次操作后输出账户的余额。


代码实现

#include <iostream>
using namespace std;

int main() {
    int balance = 100; // 初始化账户余额为100元
    cout << "初始余额: " << balance << endl;

    balance += 10; // 存入10元
    cout << "存入10元后余额: " << balance << endl;

    balance -= 20; // 花费20元
    cout << "花费20元后余额: " << balance << endl;

    balance = 0; // 取出所有余额
    cout << "取出所有余额后账户余额: " << balance << endl;

    return 0;
}

在这里插入图片描述


运行结果

初始余额: 100
存入10元后余额: 110
花费20元后余额: 90
取出所有余额后账户余额: 0

在这里插入图片描述


分析

在这里插入图片描述

  • 存款操作:通过 balance += 10 增加余额,使用 复合赋值符 简化了代码的书写。
  • 消费操作:通过 balance -= 20 减少余额,同样使用了 复合赋值符,使得代码更加紧凑。
  • 取出余额操作:直接将 balance 设为 0,表达直观且符合逻辑。

这个练习展示了如何通过 赋值复合赋值符变量 进行更新,并在每一步操作后输出结果。通过这样的实践,我们不仅能掌握如何操作变量,还能理解每个操作的具体意义。


💯题目二:交换两个变量的值

  • 在编程中,交换两个变量的值 是一个非常经典的课题。这个问题可以通过多种方法来实现,以下介绍几种常见的方法,并分析其优缺点。
    交换值
    在这里插入图片描述

题目描述

输入两个整数 ab,交换 ab 的值,使 a 的值等于原来的 bb 的值等于原来的 a

输入样例:

2 3

输出样例:

3 2

在这里插入图片描述


方法 1:使用第三个变量

#include <iostream>
using namespace std;

int main()
{
	int a, b, c;
	cin >> a >> b;
	c = a;
	a = b;
	b = c;
	cout << a << " " << b << endl;
	return 0;
 } 

在这里插入图片描述

优点

  • 逻辑简单,易于理解,适合初学者。
  • 没有溢出风险,适用于各种数据类型。

缺点

  • 需要额外的存储空间来保存临时变量。

方法 2:不使用第三个变量(加减法)

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    a = a + b;
    b = a - b;
    a = a - b;
    cout << a << " " << b << endl;
    return 0;
}

在这里插入图片描述

优点

  • 不需要额外的存储空间,节省内存。

缺点

  • 如果 ab 的值过大,可能会导致整数溢出,存在一定的风险。

方法 3:使用位运算符(异或运算)

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    cout << a << " " << b << endl;
    return 0;
}

在这里插入图片描述

优点

  • 不需要额外的变量,且没有溢出风险,运算效率较高。

缺点

  • 对于初学者来说不太直观,仅适用于整数类型,理解难度较大。

方法 4:使用标准库函数 std::swap

C++ 标准库提供了一个 std::swap 函数,可以直接用于交换两个变量的值。

#include <iostream>
#include <utility> // 引入头文件
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    swap(a, b); // 使用标准库函数交换
    cout << a << " " << b << endl;
    return 0;
}

在这里插入图片描述

优点

  • 简洁且直观,代码量少,适合各种数据类型。
  • 由标准库实现,安全可靠。

缺点

  • 需要引入额外的头文件。

💯代码优化与可读性

🌴 小提示:使用 复合赋值操作符 能够让代码更加简洁,但要注意,过度追求代码简洁可能会牺牲 可读性,特别是在 团队合作 中,代码的 可读性 至关重要。

在编程中,代码的 可读性效率 同等重要。虽然 复合赋值符 能够减少代码的冗余,但在某些情况下,过于简洁的代码可能不易于他人理解,特别是 初学者

例如:

money += 10; // 简洁,但可能不够直观。

可以将其分解为:

money = money + 10; // 更加显而易见,尤其适合初学者。

在编写代码时,尤其是在团队协作中,编写易于理解的代码往往比追求简洁更为重要,确保代码的可维护性和可读性至关重要。
在这里插入图片描述


总结

  • 对于 初学者,尽量将每一步的逻辑详细展现,以便更好地理解 代码执行 的过程。
  • 对于 团队协作,应遵循 代码规范,确保代码具有良好的 可读性一致性

💯小结

  • 在这里插入图片描述
    赋值运算符 是编程中最基础的操作之一,理解其原理有助于更好地掌握 变量的控制代码逻辑
  • 复合赋值符 能够让代码更为 简洁,但应在 简洁性可读性 之间找到平衡点。
  • 变量交换 是一个经典的编程练习,通过多种实现方式,展示了编程中灵活使用 不同工具 的能力。

无论是 赋值操作 还是 变量交换,这些都是编程的基础操作,掌握这些知识将为更深入的编程学习打下坚实的基础。对于每一位程序员而言,熟练掌握这些基本概念是迈向高级编程的重要一步。通过不断的 练习 与应用,程序员们能够在复杂的编程场景中游刃有余。希望这篇文章能帮助你更好地理解 C++ 中的这些基础概念,使你在编程的道路上更进一步,最终掌握更为复杂和高级的编程技巧,成长为一名优秀的开发者。

学习编程的过程不仅是知识的积累,更是对 思维方法 的不断反思和改进。今天你可能在为 赋值变量交换 的概念而苦恼,但在不久的将来,你会发现这些基础概念是解决复杂问题的关键所在。每一个编程概念的掌握,都是你成长的阶梯。继续努力,相信你一定能够在编程的世界中走得更加长远而深远!


在这里插入图片描述


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

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

相关文章

HarmonyOS:使用HTTP访问网络

HTTP 一、导入http模块 module.json5里添加网络权限 导入http模块 二、创建http请求 创建http请求 import { http } from kit.NetworkKitfunction getNetData() {// 创建数据请求对象let httpRequest http.createHttp() }三、发起请求 请求方法 四、请求示例 GET请求 PO…

KernelShark在ubuntu24.04.01的编译

KernelShark在ubuntu24.04.01的编译 写在前面具体过程装ubuntu24.04.01安装depends下载代码如何编译cmake 输出make 输出 如何安装 初步启动Add the User to the perf Group 简单的使用trace-cmd抓包 来看我的文章&#xff0c;必有所得。 平凡中&#xff0c;总有我帮您踩过的坑…

【48】Android通过libjpeg-turbo库实现图片压缩

&#xff08;1&#xff09;公司为节约图片占用服务器存储资源成本&#xff0c;需要对Android手机客户端所传递到云存储服务器中的图片进行压缩&#xff0c;在不影响图片失真程度的情况下&#xff0c;最大限度的压缩图片以节省图片所占用的存储空间。 &#xff08;2&#xff09;…

vue.js学习(day 18)

实例&#xff1a;面经基础版 (功能)组件缓存 keep-alive 小结 main.js import Vue from vue import App from ./App.vue import router from ./routerVue.config.productionTip falsenew Vue({ //注入,将路由对象注入到new Vue实例中&#xff0c;建立关联render: h > …

Android 使用 Canvas 和 Paint 实现圆形图片

学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …

鸿蒙DevEco Profiler无法识别设备

一、问题 DevEco Studio运行项目处可以识别到设备信息&#xff0c;但是Profiler工具无法识别 二、背景知识 注意 DevEco Profiler工具不支持模拟器进行调优。macOS 12及以上系统版本支持使用DevEco Profiler工具。 知识来源&#xff1a;文档中心 三、解决方案 重启DevEco …

微信小程序版小米商城的搭建流程详解!

很多初学微信小程序语法的同学&#xff0c;可能不知道如何布局和搭建一个项目&#xff0c;下面我将讲解初学者如何搭建项目和注意事项。 目录 一、 app.json的配置 二、引入vant 三、主页banner携带参数跳转 四、点击商品项跳转详情页 一、 app.json的配置 {"pages&q…

第30天:安全开发-JS 应用NodeJS 指南原型链污染Express 框架功能实现审计0

时间轴&#xff1a; 演示案例&#xff1a; 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF 题目&源码审计 开发指南-NodeJS-安全 SecGuide 项目、 环境搭建-NodeJ…

LongVU:用于长视频语言理解的空间时间自适应压缩

晚上闲暇时间看到一种用于长视频语言理解的空间时间自适应压缩机制的研究工作LongVU&#xff0c;主要内容包括&#xff1a; 背景与挑战&#xff1a;多模态大语言模型&#xff08;MLLMs&#xff09;在视频理解和分析方面取得了进展&#xff0c;但处理长视频仍受限于LLM的上下文长…

Observability:用 OpenTelemetry 自动检测 Python 应用程序

作者&#xff1a;来自 Elastic Bahubali Shetti 了解如何使用 OpenTelemetry 自动检测 Python 应用程序。使用 Docker 文件中的标准命令&#xff0c;可以快速检测应用程序&#xff0c;而无需在多个位置编写代码&#xff0c;从而实现快速更改、扩展和更轻松的管理。 更多阅读&a…

JVM, JRE 和 JDK

JRE: Java Runtime Environment, Java 运行环境. JDK: Java Development Kit, Java 开发工具包. JRE JVM 核心类库 运行工具 JDK JVM 核心类库 开发工具 JVM: Java Virtual Machine, Java 虚拟机. 核心类库: Java 已经写好的东西, 直接拿来用即可. 开发工具: 包括 …

Ubuntu 22.04.5 + kubeadm:Kubernetes v1.28.2集群部署企业实战

文章目录 Ubuntu 22.04.5 kubeadm&#xff1a;Kubernetes v1.28.2集群部署企业实战一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 安装依赖工具1.2.3 配置时间同步1.2.4 关闭swap分区1.2.5 停止和禁用防火墙1.2.6 配置内核转发及网桥过滤1.2.7 安装配置ipset及i…

Mac环境下brew安装LNMP

安装不同版本PHP 在Mac环境下同时运行多个版本的PHP&#xff0c;同Linux环境一样&#xff0c;都是将后台运行的php-fpm设置为不同的端口号&#xff0c;下面将已php7.2 和 php7.4为例 添加 tap 目的&#xff1a;homebrew仅保留最近的php版本&#xff0c;可能没有你需要的版本…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

解决LED显示屏水波纹的方法

在拍摄LED显示屏时&#xff0c;水波纹和扫描线的出现常常让人误以为是显示屏质量问题&#xff0c;但实际上这些现象往往与拍摄角度和焦距有关。本文将探讨水波纹的成因&#xff0c;并提供一些有效的解决方法。 1. 水波纹与扫描线现象的区别 水波纹通常呈现无规则的弧形扩散状态…

【MySQL — 数据库基础】深入理解数据库服务与数据库关系、MySQL连接创建、客户端工具及架构解析

目录 1. 数据库服务&#xff06;数据库&#xff06;表之间的关系 1.1 复习 my.ini 1.2 MYSQL服务基于mysqld启动而启动 1.3 数据库服务的具体含义 1.4 数据库服务&数据库&表之间的关系 2. 客户端工具 2.1 客户端连接MySQL服务器 2.2 客…

记录关于阿里云智能媒体预览pdf文件的问题

pdf仅支持预览&#xff0c;不支持编辑&#xff0c;需要将权限设置成只读。 readonly参数一定要传&#xff0c;不能不传&#xff01;&#xff01;&#xff01;&#xff01; readonly的设置一定要用示例提供的方法&#xff01;&#xff01;&#xff01;&#xff01; 用WebofficeP…

FlyHttp 的设计思想:前端 API 自动化构建工具

FlyHttp的相关文章&#xff1a; FlyHttp 的诞生&#xff1a;从认识各种网络请求开始 FlyHttp 的设计思想&#xff1a;前端 API 自动化构建工具 FlyHttp 的使用&#xff1a;如何高效使用 FlyHttp&#xff0c;支持 JS、TS 项目 FlyHttp 的最佳实践&#xff1a;加速项目级 API…

WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路

2024年11月30日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG&#xff08;武汉Linux用户组&#xff09;线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源&#xff0c;前期咱们已经阐述了如何在本地搭建&#xff08;Nacos集群搭建【Oracle作外部数据源】&#xff09;&#xff0c;本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…