【C++】数据类型与操作实践:详细解析与优化


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目一:三个数的反序输出
    • 1.1 题目描述与代码实现
      • 代码实现:
    • 1.2 代码解析与细节说明
    • 1.3 使用 `int` 类型的合理性分析
    • 1.4 其他数据类型的考虑
    • 1.5 代码优化建议
  • 💯题目二:数据类型的存储大小
    • 2.1 题目描述与代码实现
      • 代码实现:
    • 2.2 代码解析与存储大小分析
    • 2.3 变量未赋值的优化
    • 2.4 使用字符 `' '` 还是字符串 `" "`
    • 2.5 进一步优化代码
  • 💯C++ 基础概念的拓展与总结
    • 3.1 数据类型的选择
    • 3.2 `sizeof` 运算符的深度应用
    • 3.3 输入输出优化的高级思考
  • 💯小结


在这里插入图片描述


💯前言

  • 在编程学习的高级阶段中,理解和精通数据类型输入输出机制的底层实现至关重要,尤其是在高效编程和复杂项目中,这些基础知识的掌握将极大地影响代码的质量和性能。本次我们对若干典型的 C++ 题目进行了深入分析,涉及了 intshort 类型的内存占用与行为,以及多变量操作、反序输出等相关内容。本文旨在对代码编写、优化思路、内存管理等方面提供深入的讨论和讲解,以助力高层次程序设计的理解。
    C++ 参考手册
    在这里插入图片描述

💯题目一:三个数的反序输出

在这里插入图片描述


1.1 题目描述与代码实现

在这里插入图片描述
在第一道题目中,我们需要输入三个整数 a a a b b b c c c,并以反序的形式输出。题目设定的整数范围如下:

  • 0 ≤ a , b , c ≤ 2 31 − 1 0 \leq a, b, c \leq 2^{31} - 1 0a,b,c2311

这意味着输入的整数可能达到非常大的数值,但仍然在有符号 32 位整数的表示范围内。因此,使用 int 类型是非常合适的,以下是基本的代码实现:

题目描述:
输入三个数,反序输出这三个数。

输入描述:
输入三个整数 a, b, c,以空格隔开, 0 ≤ a , b , c ≤ 2 31 − 1 0 \leq a, b, c \leq 2^{31} - 1 0a,b,c2311

输出描述:
输出一行,三个整数,空格隔开,按反序输出。

示例:
输入:

2 6 9

输出:

9 6 2

代码实现:

#include <iostream>
using namespace std;

int main() {
    int a, b, c;  // 定义三个整型变量 a, b, c
    cin >> a >> b >> c;  // 从标准输入读取三个整数
    cout << c << " " << b << " " << a << endl;  // 以反序输出三个变量
    return 0;
}

在这里插入图片描述


1.2 代码解析与细节说明

在这里插入图片描述

  • 输入部分
    使用 cin 来读取输入的三个整数,用户可以通过空格或换行符分隔这些输入。

  • 输出部分
    使用 cout 以反序输出这三个整数,整数之间以空格分隔。

当我们输入 2 6 9 时,输出结果是 9 6 2,这符合题目的要求,即按输入的反序进行输出。


1.3 使用 int 类型的合理性分析

题目中给定的整数范围上限为 2 31 − 1 2^{31} - 1 2311,这恰好与 C++ 中的 int 类型的范围一致。具体分析如下:

  • int 类型的取值范围:现代编译器中,int 类型通常是一个 32 位的有符号整数,其取值范围为:

    − 2 31 到 2 31 − 1 -2^{31} { 到 } 2^{31}-1 2312311,即 − 2 , 147 , 483 , 648 到 2 , 147 , 483 , 647 -2,147,483,648 { 到 } 2,147,483,647 2,147,483,6482,147,483,647

    因此,题目所给的范围从 0 到 2 31 − 1 2^{31} - 1 2311 完全位于 int 的范围内,因此选择 int 类型是合理且高效的。
    在这里插入图片描述


1.4 其他数据类型的考虑

  • unsigned int:如果明确知道输入的数值总是非负的,那么可以选择 unsigned int,其取值范围为 0 , 2 32 − 1 0, 2^{32} - 1 0,2321,可以进一步扩大数值上限。
  • long long:若需表示超过 int 的取值范围(例如处理更大的整数),可以使用 long long 类型。然而在本题中,使用 long long 不仅不必要,还会增加内存占用及计算成本。
    在这里插入图片描述

1.5 代码优化建议

尽管代码已较为简洁,但依然可以进一步优化:

  1. 使用 \n 替代 endl,因为 endl 不仅进行换行,还会刷新输出缓冲区。在频繁的输出操作中,这种刷新可能导致性能的下降,而 \n 仅执行换行操作。
  2. 若需要更健壮的输入处理,可以添加输入校验逻辑,以确保输入符合预期,例如防止非整型输入导致程序崩溃。不过在本题场景下,这类校验并非必需。

在这里插入图片描述


💯题目二:数据类型的存储大小

在这里插入图片描述


2.1 题目描述与代码实现

第二道题目要求分别定义一个 int 类型和一个 short 类型的变量,并输出它们的存储大小(单位为字节)。实现这一需求可以利用 C++ 中的 sizeof 运算符。
在这里插入图片描述
题目描述:
定义两个变量,分别是 intshort 类型,输出它们的存储大小(单位:字节)。

输入描述:
无。

输出描述:
一行,两个整数,分别是两个变量的存储空间大小,用一个空格隔开。

示例:
输入:
无。

输出:

4 2

代码实现:

在这里插入图片描述

#include <iostream>
using namespace std;

int main() {
    int a;               // 定义 int 类型变量 a
    short b;             // 定义 short 类型变量 b
    cout << sizeof(a) << " " << sizeof(b) << endl; // 输出它们的存储大小
    return 0;
}

2.2 代码解析与存储大小分析

  1. sizeof 运算符

    • sizeof 是一个关键字,用于获取变量或类型的存储大小,单位是字节。
    • 在代码中,sizeof(a) 返回 int 类型的大小,sizeof(b) 返回 short 类型的大小。
  2. 存储大小的常见取值
    在大多数现代计算机系统中:

    • int 通常为 4 字节(32 位),其取值范围为 − 2 31 , 2 31 − 1 -2^{31}, 2^{31}-1 231,2311
    • short 通常为 2 字节(16 位),其取值范围为 − 2 15 , 2 15 − 1 -2^{15}, 2^{15}-1 215,2151

    因此,通常的输出结果是 4 2,但这也可能随编译器或系统架构的不同而有所变化,例如在某些特定的嵌入式系统中。
    在这里插入图片描述


2.3 变量未赋值的优化

在上述代码中,我们定义了变量 ab,但并未赋初值。实际上,sizeof 只关心变量的类型而不是它的值,因此未赋值不会对结果产生影响。这种做法使代码更加简洁和高效。
在这里插入图片描述
例如:

#include <iostream>
using namespace std;

int main() {
    int a;    // 定义一个 int 类型变量 a(未赋值)
    short b;  // 定义一个 short 类型变量 b(未赋值)
    cout << sizeof(a) << ' ' << sizeof(b) << endl;  // 输出变量的存储大小
    return 0;
}

2.4 使用字符 ' ' 还是字符串 " "

在输出两个变量大小时,使用空格作为分隔符可以选择字符 ' ' 或字符串 " "

  • 使用字符 ' '
    • 更加节省内存,因为字符 ' ' 只占用 1 个字节。
    • 更加直观且简洁,适合单字符分隔符的场景。
  • 使用字符串 " "
    • 更加灵活,适合需要复杂分隔符或包含多个字符的情况,但相比字符占用更多的内存。

在本题的代码中,两者的效果完全相同,因此使用字符 ' ' 显得更加高效和合理。
在这里插入图片描述


2.5 进一步优化代码

为了使代码更加清晰,我们可以直接在 sizeof 运算符中传递类型,而不需要定义变量。例如:
在这里插入图片描述

#include <iostream>
using namespace std;

int main() {
    cout << sizeof(int) << ' ' << sizeof(short) << endl;
    return 0;
}

这样可以减少不必要的变量定义,使代码更加精炼,突出关注点在于类型的大小。


💯C++ 基础概念的拓展与总结

在这里插入图片描述


3.1 数据类型的选择

在程序设计中选择合适的数据类型是非常关键的,涉及内存的利用效率、程序的执行效率以及代码的可读性。

  • int vs short
    • int 常用于一般的整数运算,其性能和数值范围在大多数场景中表现良好。
    • short 更适合数值范围较小但需要节省内存的场景,尤其在嵌入式设备中使用广泛。
  • long long:当处理比 int 更大的数值(超过 32 位)时,long long 提供了 64 位的精度和数值范围。
  • unsigned 修饰符:如果可以确定数值不会为负,那么 unsigned 可以用来扩展数值的正值上限,适用于数组下标、计数器等场景。

在实际应用中,数据类型选择不仅影响代码的可读性和正确性,还会对程序的内存使用和性能产生深远影响。例如,在内存受限的场合(如嵌入式开发)中,合理选择较小的数据类型可以节约大量资源;而在涉及大量计算时,选择合适的类型则可以显著提升程序的运行速度。
在这里插入图片描述


3.2 sizeof 运算符的深度应用

  • sizeof 是 C/C++ 中非常重要的运算符,尤其在需要动态管理内存和跨平台编程时,sizeof 能帮助开发者更好地理解和管理内存。
  • 在复杂的数据结构如 structclass 中,使用 sizeof 可以方便地确定结构体的内存布局和大小,从而对内存对齐、数据结构的设计做出优化。
  • sizeof 还可以用于检查编译环境中不同数据类型的大小,以确保程序具有良好的可移植性,避免因平台差异导致的内存溢出或数据丢失。

3.3 输入输出优化的高级思考

  • 使用 \n 替代 endl:在 C++ 中,endl 既执行换行又刷新输出缓冲区,在频繁输出时可能显著降低性能。而 \n 仅仅是换行符,不涉及缓冲区的刷新,因而性能更高。对于不需要立即看到输出的场景,优先选择 \n 会提升整体效率。
  • 选择合适的分隔符:在处理大量数据输出时,分隔符的选择直接影响到输出的可读性和性能。字符 ' ' 通常是最节省资源的选择,而复杂输出中使用字符串 " " 则可以提高灵活性。
    在这里插入图片描述

💯小结

  • 在这里插入图片描述
    本文深入探讨了 C++数据类型的选择与优化,以及如何通过代码实践来掌握这些概念。通过对两个具体题目的详细分析,我们讨论了如何选择合适的数据类型,以及如何使用 sizeof 运算符来获取类型的存储大小。此外,我们还提出了一些代码优化的建议,从而使代码更加简洁、性能更佳。

  • 掌握数据类型的选择和优化,是编写高效、可维护代码的基础。在实际的软件开发中,数据类型的选择不仅影响程序的内存占用和运行效率,也对后续的可扩展性可靠性产生重要影响。希望本文的内容能够帮助你在理解 C++ 的数据类型与代码优化方面迈上一个新的台阶。

  • C++ 的学习与实践过程中,掌握好每一个细节都是成为高级开发者的必经之路。每一个细微的优化和改进,都会在复杂的软件系统中累积成显著的性能提升。无论是选择适当的数据类型,还是精简代码的输入输出操作,这些都需要不断的实践与总结。希望各位读者能在 C++ 的学习之路上不断探索,逐步提升自己的编程能力,最终成为能够编写出高效优雅代码的开发者。


在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python图像彩色数字化

效果展示&#xff1a; 目录结构&#xff1a; alphabets.py GENERAL {"simple": "%#*-:. ","complex": "$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. " } # Full list could be found here…

【Linux】TCP网络编程

目录 V1_Echo_Server V2_Echo_Server多进程版本 V3_Echo_Server多线程版本 V3-1_多线程远程命令执行 V4_Echo_Server线程池版本 V1_Echo_Server TcpServer的上层调用如下&#xff0c;和UdpServer几乎一样&#xff1a; 而在InitServer中&#xff0c;大部分也和UDP那里一样&…

如何选择适合的网站关键词?

在做谷歌SEO时&#xff0c;选对关键词是成功的一半。很多人以为找到搜索量大的词就可以了&#xff0c;但实际上&#xff0c;关键词选择并不只是看流量高低&#xff0c;更重要的是与你的用户需求是否匹配。要想精准定位用户&#xff0c;首先需要了解你的目标受众是谁&#xff0c…

AI-agent矩阵营销:让品牌传播无处不在

矩阵营销是一种通过多平台联动构建品牌影响力的策略&#xff0c;而 AI-agent 技术让这一策略变得更加智能化。AI社媒引流王凭借其矩阵管理功能&#xff0c;帮助品牌在多个平台上实现深度覆盖与精准传播。 1. 矩阵营销的优势 品牌触达更广&#xff1a;多平台联动可以覆盖不同用…

Vue教程|搭建vue项目|Vue-CLI新版脚手架

一、安装Node环境 安装Node及Npm环境 Node下载地址:Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/ 安装完成后,检查安装是否成功,并检查版本,命令如下: node -v npm -v mac@Macd…

简单好用的折线图绘制!

折线图的概念及作用&#xff1a; 折线图&#xff08;Line Chart&#xff09;是一种常见的图表类型&#xff0c;用于展示数据的变化趋势或时间序列数据。它通过一系列的数据点&#xff08;通常表示为坐标系中的点&#xff09;与这些点之间的线段相连&#xff0c;直观地展示变量…

模型 布鲁姆法则

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。分层提升思维力。 1 布鲁姆法则的应用 1.1 布鲁姆法则在产品开发流程中的应用 背景&#xff1a; 在产品开发领域&#xff0c;创新和效率是关键。布鲁姆法则可以帮助产品经理和设计师系统地提升产品开…

如何通过实验室Lims系统解决效率和数据管理难题?

您的实验室是否还在为这些问题而苦恼呢&#xff1f; 提升企业业务效率&#xff1f; 质量可追溯、数据合规性&#xff1f; 提升客户服务质量&#xff1f; 如何让管理经验和检测数据有效积累? 实验室Lims系统功能 1、业务管理 2、检验管理 3、财务管理 4、客户管理 5、…

【目标跟踪】Anti-UAV数据集详细介绍

Anti-UAV数据集是在2021年公开的专用于无人机跟踪的数据集&#xff0c;该数据集采用RGB-T图像对的形式来克服单个类型视频的缺点&#xff0c;包含了318个视频对&#xff0c;并提出了相应的评估标准&#xff08;the state accurancy, SA)。 文章链接&#xff1a;https://arxiv.…

PyG教程:MessagePassing基类

PyG教程&#xff1a;MessagePassing基类 一、引言二、如何自定义消息传递网络1.构造函数2.propagate函数3.message函数4.aggregate函数5.update函数 三、代码实战1.图数据定义2.实现GNN的消息传递过程3.完整代码4.完整代码的精简版本 四、总结1.MessagePassing各个函数的执行顺…

Win10 系统下使用研华XNavi安装板卡驱动失败

配置&#xff1a;主板 AIMB-705G2&#xff0c;CPU i5-6500&#xff0c;系统 Windows10_64bit_Pro_22H2&#xff0c; 测试&#xff1a; 1、多次安装驱动。FAIL 2、尝试在其他电脑上移植板卡驱动并且使用数字签名安装。FAIL 3、系统更新到WIN10最新版本。FAIL 4、杀毒软件卸…

用三维模型的顶点法向量计算法线贴图

法线贴图的核心概念是在不增加额外多边形数目的情况下&#xff0c;通过模拟细节来改善光照效果。具体流程包括&#xff1a; 法线的计算与存储&#xff1a;通过法线映射将三维法线向量转化为法线贴图的 RGB 值。渲染中的使用&#xff1a;在片段着色器中使用法线贴图来替代原有的…

idea编译与maven编译的问题

先说下idea编译按钮的位置 编译运行时&#xff0c;会在idea底部出现Build面板 比较&#xff1a; idea编译器编译整个项目 maven编译器根据pom.xml的配置&#xff0c;可实现灵活编译 两套编译会遇到的问题&#xff1a; maven 编译成功 &#xff0c;但idea编译失败&#xff…

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…

《String类》

目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法&#xff1a;按照字典序比较 4.1.3 int compareTo(Strin…

OpenSSH-9.9p1 OpenSSL-3.4.0 升级步骤详细

前言 收到漏洞扫描通知 OpenSSH 安全漏洞(CVE-2023-38408) OpenSSH 安全漏洞(CVE-2023-51385) OpenSSH 安全漏洞(CVE-2023-51384) OpenSSH 安全漏洞(CVE-2023-51767) OpenSSH 安全漏洞(CVE-2023-48795) OpenSSH&#xff08;OpenBSD SecureShell&#xff09;是加拿大OpenBSD计划…

【Stable Diffusion】安装教程

目录 一、python 安装教程 二、windows cuda安装教程 三、Stable Diffusion下载 四、Stable Diffusion部署&#xff08;重点&#xff09; 一、python 安装教程 &#xff08;1&#xff09;第一步下载 打开python下载页面&#xff0c;找到python3.10.9&#xff0c;点击右边…

Scala身份证上的秘密以及Map的遍历

object test {def main(args: Array[String]): Unit {val id "42032220080903332x"//1.生日是&#xff1f;//字符串截取val birthday id.substring(10,14) //不包括终点下标println(birthday)val year id.substring(6,10) //println(year)//性别&#xff1a;倒数第…

springboot 异步 @Async 的日常使用及失效场景

文章目录 springboot 异步 Async 的日常使用引言一、Async 使用位置二、Async 使用三、注解 Async 失效的情况&#xff08;1&#xff09;调用同一个类中的异步方法&#xff08;内部调用&#xff09;&#xff08;2&#xff09;未使用 EnableAsync 注解&#xff08;3&#xff09;…

Laravel8.5+微信小程序实现京东商城秒杀方案

一、商品秒杀涉及的知识点 鉴权策略封装掊口访问频次限制小程序设计页面防抖接口调用订单创建事务使用超卖防御 二、订单库存系统方案&#xff08;3种&#xff09; 下单减库存 优点是库存和订单的强一致性&#xff0c;商品不会卖超&#xff0c;但是可能导致恶意下单&#xff…