基础

整数类型

这些类型里面除了只有 signed 和 int 的都可以省略 signed / int
例如 short, short int, signed short, signed short int 表示一个类型

类型占用字节数取值范围
signed char1-128 到 127
unsigned char10 到 255
short, short int, signed short, signed short int2-32768 到 32767
unsigned short, unsigned short int20 到 65535
int, signed, signed int4-2147483648 到 2147483647
unsigned, unsigned int40 到 4294967295
long, long int, signed long, signed long int4与 int 或 long long 相同
unsigned long, unsigned long int4与 unsigned 或 unsigned long long 相同
long long, long long int, signed long long, signed long long int8-9223372036854775808 到 9223372036854775807
unsigned long long, unsigned long long int80 到 18446744073709551615

浮点类型

类型占用字节数取值范围
float41.175494351e-38 到 3.402823466e+38
double82.2250738585072014e-308 到 1.7976931348623157e+308
long double123.36210314311209350626267781732175260e-4932 到 1.18973149535723176508575932662800702e+4932

无效浮点数信息

在 C++中,浮点数类型的值可以是无效的,具体取决于浮点数类型的规范。以下是一些常见的无效浮点数值:

在 C++ 标准库中,可以使用 std::numeric_limits<T> 类模板来获取特定浮点数类型 T 的限制信息,例如 std::numeric_limits<double>::quiet_NaN() 就可以得到 double 类型的 NaN。

无效浮点数操作

操作结果
±value/0±Infinity
±Infinity ± value±Infinity
±Infinity * value±Infinity
±Infinity / value±Infinity
0 / 0NaN
±Infinity / ±InfinityNaN
Infinity - InfinityNaN
Infinity * 0NaN

数字字面量

类型示例
int42, -123
unsigned int42u, 123U
long123456L, -123L
unsigned long123456ul, 123ul
long long123456789LL, -123LL
unsigned long long123456789ull, 123ull
float3.14f, -2.5F
double3.14, -2.5
long double3.14L, -2.5L

进制表示方式

进制表示方式示例
二进制以 0b 或 0B 开头0b110
八进制以 0 开头017
10 进制直接输入数字123
16 进制以 0x 或 0X 开头0x1A

sizeof 运算符

  1. sizeof(type):获取类型 type 的大小,返回 size_t 类型的值。
  2. sizeof expression:获取表达式 expression 的大小,返回 size_t 类型的值。
  3. sizeof...:获取模板参数包中元素的个数,返回 size_t 类型的值。这个用法通常用于可变参数模板。
c++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 获取类型的大小
std::cout << "sizeof(int): " << sizeof(int) << '\n';

// 获取表达式的大小
int arr[] = {1, 2, 3};
std::cout << "sizeof(arr): " << sizeof(arr) << '\n';

// 获取模板参数包中元素的个数
template<typename... Ts>
void foo(Ts... args) {
  std::cout << "sizeof...(args): " << sizeof...(args) << '\n';
}
foo(1, 'a', 3.14);  // 输出 "sizeof...(args): 3"

数值的上下限

std::numeric_limits<T> 类模板提供了获取数值类型 T 的上下限的方法

c++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 在整数类型中 min 和 lowest 都是相同的,都是最小值
// 获取 int 类型的上限
std::numeric_limits<int>::max();
// 获取 int 类型的下限
std::numeric_limits<int>::min();
// 以下方法也可以获取下限
std::numeric_limits<int>::lowest();

// 在浮点数类型中,min 和 lowest 不同,min 得到的是最小的正整数,lowest 得到的才是最小的值
// 获取 float 类型的上限(3.40282e+38)
std::numeric_limits<float>::max();
// 获取 float 类型的最小的正整数(1.17549e-38)
std::numeric_limits<float>::min();
// 获取 float 类型的下限(-3.40282e+38)
std::numeric_limits<float>::lowest();

char 、 wchar_t 、 char8_t 、 char16_t 、 char32_t

以上几种都是原生字符类型,用于表示数字、字母、符号等字符。

  1. char:

    • 占用一个字节(8 位)
    • 用于表示单个 8 位字符,即 ASCII 码表中的字符,范围是 0~127
    • 在 C++ 中使用最为广泛,可以用于表示 ANSI 编码和 UTF-8 编码的字符,建议在表示 ASCII 字符时使用。
  2. wchar_t:

    • 在不同平台上占用的字节数不同,通常为 2 个字节(16 位)或 4 个字节(32 位)
    • 用于表示单个 Unicode 字符,范围是所有 Unicode 字符
    • 在处理 Unicode 字符或多语言环境下有更好的应用场景,建议在需要处理 Unicode 字符时使用。
    • 在些跨平台代码是不建议使用,因为不同平台上的 wchar_t 占用的字节数不同。
  3. char8_t:

    • 占用一个字节(8 位)
    • 用于表示单个 8 位字符,范围是所有 Unicode 字符中的 ASCII 码表部分,即 0~127
    • 用于表示 UTF-8 编码的字符,建议在需要处理 UTF-8 编码的字符时使用。
  4. char16_t:

    • 占用两个字节(16 位)
    • 用于表示单个 Unicode 字符,范围是所有 Unicode 字符
    • 用于表示 UTF-16 编码的字符,建议在需要处理 UTF-16 编码的字符时使用。
  5. char32_t:

    • 占用四个字节(32 位)
    • 用于表示单个 Unicode 字符,范围是所有 Unicode 字符
    • 用于表示 UTF-32 编码的字符,建议在需要处理 UTF-32 编码的字符时使用。

变量初始化赋值

在 C++中初始化赋值有三种方式

c++
1
2
3
4
int i = 0;  // 赋值表示法
int j(0);   // 函数表示法
int k{0};   // 花括号表示法
int l{};    // 这里是默认赋值为0

显示类型转换

类型转换方式示例建议使用方式
C 风格类型转换(float) x不建议使用
静态/强制类型转换static_cast<float>(x)建议使用
重新解释类型的转换reinterpret_cast<float>(x)转换指针类型时建议使用
旧式的类型转换float(x)不建议使用

格式化字符串 std::format

std::format 是 C++20 中的新特性,它提供了一种新的字符串格式化方式。该特性可以用来将多种类型的值格式化为字符串,并且支持多种格式控制符,可以更加灵活地控制输出格式。
这里列出格式说明符的一般形式:{[arg_id][:[[fill]align][sign]["#"]["0"][width]["." precision]["L"][type]]}

常用转义字符

转义字符含义
\n换行符(windows 中是\r\n)
\r回车符
\t垂直制表符
\v水平制表符
\反斜杠
'单引号
"双引号

常用预处理指令

预处理指令含义
#if用于条件编译,如果条件为真,则编译后面的代码,否则跳过后面的代码
#ifdef用于条件编译,如果宏定义了,则编译后面的代码,否则跳过后面的代码
#ifndef用于条件编译,如果宏没有定义,则编译后面的代码,否则跳过后面的代码
#else用于条件编译,如果条件为假,则编译后面的代码,否则跳过后面的代码
#endif用于条件编译,结束条件编译,与 #if 配对使用
#define用于定义宏,可以用于条件编译,也可以用于替换代码中的字符串
#undef用于取消宏定义,与 #define 配对使用
#error用于输出错误信息,编译时会报错
#line用于指定行号,与 #file 配对使用
#file用于指定文件名,与 #line 配对使用
#pragma用于指定编译器的行为,如指定编译器忽略警告