C++ 学习笔记一

news/2024/7/8 2:12:06 标签: c++, 学习, 笔记

C++ 学习笔记

  1. 使用空参数列表而不是void来指示函数没有参数。
  2. 现代机器上的内存通常被组织成字节大小的单元,每个内存字节都有一个唯一的地址。
  3. 为了确定特定机器上数据类型的大小,C++ 提供了一个名为sizeof的运算符。sizeof运算符是一个一元运算符,它接受类型或变量作为参数,并返回其大小(以字节为单位)。您还可以sizeof在变量名上使用运算符。
  4. C++ 有4 种主要基本整数类型
类型最小尺寸
short int16 bit
int32 bit
long int32 bit
long long int64bit
  1. signed short a;//定义有符号a,但其实多余,默认为有符号
  2. 当对两个整数进行除法运算(称为整数除法)时,C++ 总是产生整数结果。由于整数不能包含小数,因此小数部分将被直接丢弃(不进行四舍五入!)。
  3. 如果无符号值超出范围,则将其除以比该类型最大数字大一的数字,并且只保留余数。任何大于该类型可表示的最大数字的数字都会简单地“回绕”(有时称为“模回绕”)。
  4. 在保存数量(即使数量应该是非负的)和数学运算时,优先使用有符号数而不是无符号数。避免混合使用有符号数和无符号数。
  5. 固定宽度的整数(#include<cstdint>),保证在任何体系结构上具有相同的大小。
nametyperange
std::int8_t1 字节有符号-128 至 127 在许多系统上被视为有符号字符。请参阅下面的注释。
std::uint8_t1 字节无符号0 至 255 在许多系统上被视为无符号字符。请参阅下面的注释。
std::int16_t2字节有符号-32,768 至 32,767
std::uint16_t2字节无符号0 至 65,535
std::int32_t4字节有符号-2,147,483,648 至 2,147,483,647
std::uint32_t4 字节无符号0 至 4,294,967,295
std::int64_t8 字节有符号-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
  1. 如果您使用固定宽度的整数,在某些体系结构上,它可能比更宽的类型慢。例如,如果您需要一个保证为 32 位的整数,您可能会决定使用std::int32_t,但您的 CPU 在处理 64 位整数时实际上可能更快。但是,仅仅因为您的 CPU 可以更快地处理给定类型并不意味着您的程序总体上会更快——现代程序通常受内存使用量而不是 CPU 的限制,更大的内存占用可能会比更快的 CPU 处理加速您的程序更慢。
  2. 快速和最小整数
  • 快速类型:(std::int_fast#_t 和 std::uint_fast#_t)提供最快的有符号/无符号整数类型,宽度至少为 # 位(其中 # = 8、16、32 或 64)。例如,std::int_fast32_t将为您提供最快的有符号整数类型,宽度至少为 32 位。最快是指 CPU 可以最快处理的整数类型。
  • 最小类型:std::int_least#_t 和 std::uint_least#_t)提供宽度至少为 # 位(其中 # = 8、16、32 或 64)的最小有符号/无符号整数类型。例如,std::uint_least32_t将为您提供宽度至少为 32 位的最小无符号整数类型。
#include <cstdint> // for fast and least types
#include <iostream>

int main()
{
	std::cout << "least 8:  " << sizeof(std::int_least8_t) * 8 << " bits\n";
	std::cout << "least 16: " << sizeof(std::int_least16_t) * 8 << " bits\n";
	std::cout << "least 32: " << sizeof(std::int_least32_t) * 8 << " bits\n";
	std::cout << '\n';
	std::cout << "fast 8:  " << sizeof(std::int_fast8_t) * 8 << " bits\n";
	std::cout << "fast 16: " << sizeof(std::int_fast16_t) * 8 << " bits\n";
	std::cout << "fast 32: " << sizeof(std::int_fast32_t) * 8 << " bits\n";

	return 0;
}
  • 缺点
    首先,实际上使用它们的程序员并不多,而且不熟悉可能会导致错误。其次,快速类型可能会导致内存浪费,因为它们的实际大小可能大于其名称所指示的大小。更严重的是,由于快速/最小整数的大小可能会有所不同,因此您的程序可能会在它们解析为不同大小的体系结构上表现出不同的行为。
  1. 科学计数法
  • 由于在 C++ 中输入或显示指数可能很困难,我们使用字母“e”(有时为“E”)来表示等式的“乘以 10 的幂”部分。例如,1.2 x 10⁴将写为1.2e4,而5.9722 x 10²⁴将写为5.9722e24。

  • 对于小于 1 的数,指数可以为负数。该数5e-2相当于5 * 10⁻²,即5 / 10²,或0.05。电子的质量为9.1093837e-31 kg。

  1. 有效数字
  • 有效数字(e 之前的部分)中的数字称为有效数字(或有效数字)。有效数字越多,数字越精确。3.14159可以写为3.14159e0。由于有效数字有 6 个数字,因此该数字有 6 个有效数字。
  1. 浮点数
  • 浮点数据类型始终是有符号的(可以保存正值和负值)。
类型typical size
float4 bytes
double8bytes
long double8,12,16bytes
  • 使用浮点文字时,始终至少包含一位小数(即使小数为 0)。这有助于编译器理解该数字是浮点数,而不是整数。
int a { 5 };      // 5 means integer
double b { 5.0 }; // 5.0是一个浮点字面值(默认情况下没有后缀意味着双精度类型)
float c { 5.0f }; // 5.0是浮点文字,后缀f表示浮点类型

int d { 0 }       // 0 is an integer
double e { 0.0 }  // 0.0 is a double

示例

#include <iostream>

int main()
{
	std::cout << 5.0 << '\n';
	std::cout << 6.7f << '\n';
	std::cout << 9876543.21 << '\n';

	return 0;
}


输出结果

5
6.7
9.87654e+06

  • 输出浮点数时,std::cout默认精度为 6 , 也就是说,它假定所有浮点变量都只有 6 位数字(浮点数的最小精度),因此它将截断此后的任何内容。
  • 浮点数有两种特殊类别。第一种是Inf,表示无穷大。Inf 可以是正数或负数。第二种是NaN,代表“非数字”。
  1. 布尔值
  • 布尔变量是只能具有两个可能值的变量:true和false。
bool b1 { true };
bool b2 { false };
b1 = false;
bool b3 {}; // default initialize to false
  • 布尔值实际上并不以单词“true”或“false”的形式存储在布尔变量中。相反,它们被存储为整数:true变为整数1,false变为整数0。同样,当布尔值被求值时,它们实际上并不是求值为“true”或“false”。它们求值为整数0(false)或1(true)。因为布尔值实际上存储的是整数,所以它们被认为是整数类型。
如果你希望 std::cout 打印“true”或“false”而不是 01,则可以使用std::boolalpha。
#include <iostream>

int main()
{
    std::cout << true << '\n';
    std::cout << false << '\n';

    std::cout << std::boolalpha; // print bools as true or false

    std::cout << true << '\n';
    std::cout << false << '\n';
    return 0;
}

您可以使用std::noboolalpha将其关闭。
为了允许std::cin接受“false”和“true”作为输入,必须启用std::boolalpha选项
  1. 当使用 std::cout 打印字符时,std::cout 将 char 变量输出为 ASCII 字符
  • 默认情况下,小数部分为 0 的浮点值打印时不带小数位(例如5.0打印为5)。
  • 某些类型转换始终是安全的(例如转换int为double),而其他类型转换可能会导致转换过程中值发生变化(例如转换double为int)。不安全的隐式转换通常会生成编译器警告,或者(在括号初始化的情况下)生成错误。这是括号初始化是首选初始化形式的主要原因之一。括号初始化将确保我们不会尝试使用在隐式类型转换时会丢失值的初始化器来初始化变量
  1. static_cast 运算符进行显式类型转换static_cast<新类型>(表达式)
  • 只要您看到 C++ 语法(不包括预处理器)使用尖括号 (<>),尖括号之间的内容很可能是类型。这通常是 C++ 处理需要参数化类型的代码的方式。
#include <iostream>

void print(int x)
{
	std::cout << x << '\n';
}

int main()
{
	print( static_cast<int>(5.5) ); // explicitly convert double value 5.5 to an int

	return 0;
}
-------------------------------------------
#include <iostream>

int main()
{
    char ch{ 97 }; // 97 is ASCII code for 'a'
    std::cout << ch << " has value " << static_cast<int>(ch) << '\n'; // print value of variable ch as an int

    return 0;
}
值得注意的是,static_cast的参数求值为表达式。当我们传入一个变量时,该变量将被求值以产生其值,然后该值将转换
为新类型。变量本身不会受到将其值转换为新类型的影响。在上述情况下,变量ch仍然是 char,即使我们将其值转换为
 ,它仍保持相同的值int

http://www.niftyadmin.cn/n/5536065.html

相关文章

【Linux】GNU是什么

GNU是一个自由软件项目&#xff0c;其全称是“GNUs Not Unix!”&#xff0c;由理查德斯托曼&#xff08;Richard Stallman&#xff09;于1983年发起。GNU项目的目标是创建一个完全自由的操作系统&#xff0c;包括一整套完全自由的软件工具&#xff0c;以取代Unix系统。这里的“…

BeanUtils拷贝List数据

工具类&#xff1a; package com.ssdl.baize.pub;import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; import org.springframework.beans.BeanUtils;public class BeanConvertUti…

顶级10大AI测试工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

WebRtc实现1V1音视频通话

WebRtc实现1V1音视频通话 简介应用场景共享桌面的基本原理传统共享桌面WebRTC 共享桌面 相关API基本使用调用本地摄像头播放约束设置 媒体协商过程协议协议的交换与传输 WebRTC 通信过程ICE Candidate&#xff08;ICE 候选者&#xff09; 1V1视频通话 简介 WebRTC&#xff0c;名…

浏览器向客户端提供文件下载(Java实现)

场景&#xff1a; 某一系统需上传黑白名单时&#xff0c;需向用户提供导入模板&#xff0c;这时候需要为客户端提供文件模板下载&#xff0c;用户按照该模板格式填写内容。 package com.wyw.learn.upOrdownload.service;import lombok.RequiredArgsConstructor; import org.spr…

Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件

就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子&#xff0c;用了4MB 的Flash&#xff0c;默认的Micropython 固件是2MB 的&#xff0c;所以只能自己编译固件。 编译环境 MSYS2 的安装方法、基本配置什么的我就不管了&#xff0c;到处都有文章介绍这个。只提一点…

品牌营销:白加黑经典案例分析,社交电商代运营公司,新零售全案策划

#白加黑营销 #品牌策划 #独特销售主张 #市场占领 品牌的核心目标是盈利&#xff0c;而品牌策划就是为了推动这一目标的实现&#xff0c;使整个过程更加顺利和成功。每一位企业家创建品牌的最终目的都是为了获取更多的利润。然而&#xff0c;理想与现实往往存在差距。在实际操作…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置&#xff08;transpose&#xff09;矩阵与向量的转化 线性代数-张量&#xff08;tensor…