内存基础
进制 在基数为 R 的进制中,包含 R 个数字符号, 分别是 0, 1, 2, …, R-1 一个整数n位、小数m位的R进制数字,可以表示为: (N)R=(Kn−1Kn−2...K0.K−1K−2...K−m)R(N)_{R} = (K_{n-1} K_{n-2} ... K_0.K_{-1}K_{-2}...K_{-m})_{R} (N)R=(Kn−1Kn−2...K0.K−1K−2...K−m)R 其中,KiK_iKi 是第 iii 位上的数字符号,满足 0≤Ki<R0 \leq K_i < R0≤Ki<R。 同时,也可以用连加符号来表示: (N)R=∑i=−mn−1KiRi(N)_{R} = \sum_{i=-m}^{n-1} K_i R^i (N)R=i=−m∑n−1KiRi 二进制 二进制是基数为 2 的进制系统,使用两个数字符号:0 和 1。每一位上的权重是 2 的幂次方。 如: (1101)2=1∗23+1∗22+0∗21+1∗20=8+4+0+1=(13)10(1101)_2 = 1 * 2^3 + 1 * 2^2 ...
标识符
标识符 标识符(identifier):在程序中用来充当变量、函数、类等的名字。 标识符的命名规则 1.标识符只能由字母、数字和下划线组成,并且必须以字母或下划线开头。 int myVariable = 10; // 正确,myVariable 以字母开头 int _myVariable = 20; // 正确,_myVariable 以下划线开头 int myVariable2 = 40; // 正确,可以包含数字 int 2myVariable = 30; // 错误,可以包含数字但不能以数字开头 int my-Variable = 40; // 错误,标识符中不能包含其它字符 2.标识符不能是 C++ 的关键字。 这里 C++ 的关键字不需要特殊记忆,因为在编程过程中会经常接触到它们,自然而然就会记住它们了。 int int = 10; // 错误,int 是 C++ 的关键字 int while = 20; // 错误,while 是 C++ 的关键字 int...
变量与常量
需要预先了解: 内存基础 变量 变量就是编程里用来存放数据的盒子。 ——豆包 变量有名字(变量名,是一个标识符),可以用于找到它 变量里能存储数据(数字、文字、真假值等) 变量里的数据可以修改 常见的变量类型 整型变量 修饰符signed和unsigend 默认为有符号(signed),表面变量可以表示正数、负数和0。 用unsigned修饰后,变量只能表示非负整数,即0和正数 常见整型变量空间占用: 数据类型 32位系统(x86) 64位系统(x64) int 4字节(32位) 8字节(64位) short/short int 2字节(16位) 2字节(16位) long/long int 4字节(32位) 8字节(64位) long long/long long int 8字节(64位) 8字节(64位) unsigned 类型 和对应的有符号类型相同 和对应的有符号类型相同 浮点型变量 float:单精度浮点型,占用4个字节(32位),大约能提供7位有效数字。 double:双精度浮点型,占用8个字节...
表达式与基础语句
需要预先学习: 变量与常量 基础表达式 表达式是由运算符和操作数组成的计算单元。最简单的表达式可以是一个变量或一个字面量(如 a、10),复杂的表达式则通过运算符将多个操作数组合起来(如 a + b * 2)。每个表达式在求值后都会产生一个结果值。 在 C++ 中,只要是能产生值的代码片段,都可以看作表达式。 算数表达式 算术表达式使用算术运算符对数值类型(如 int、float、double)的操作数进行计算。C++ 提供五种基本算术运算符: 运算符 含义 示例 + 加法 a + b - 减法 a - b * 乘法 a * b / 除法 a / b % 取模(取余) a % b int a = 10; int b = 3; int sum = a + b; // 13 int diff = a - b; // 7 int prod = a * b; // 30 int quot = a / b; // 3 int rem = a % b; // 1 溢出的问题 +、-、* 运算可能导致溢出—...
if 语句
需要预先学习: 表达式与基础语句 能作为条件的表达式 在 C++ 中,条件就是放在 if、while 等控制结构里用来决定程序走向的表达式。条件表达式的类型是 bool 类型,值只能是 true(真)或 false(假)。 bool flag = true; // flag 的值为 true if (flag) // flag 是 bool 类型,直接作为条件 { // 条件成立时执行 } 关系表达式 关系表达式使用关系运算符比较两个值的大小或相等关系,结果是 bool 类型。 运算符 含义 示例 结果 > 大于 a > b a 大于 b 则为 true < 小于 a < b a 小于 b 则为 true >= 大于等于 a >= b a 大于等于 b 则为 true <= 小于等于 a <= b a 小于等于 b 则为 true == 等于 a == b a 等于 b 则为 true != 不等于 ...
switch-case 语句
需要预先学习: if 语句 switch-case 语句 switch-case 语句是一种多分支选择结构,它根据一个整型表达式的值跳转到匹配的 case 标签处执行。基本语法如下: switch (表达式) { case 常量1: // 匹配常量1时执行的代码 break; case 常量2: // 匹配常量2时执行的代码 break; default: // 没有任何 case 匹配时执行的代码 break; } switch 后面括号中的表达式必须是整型(int、char、enum 等),case 后面必须是常量表达式。程序会拿表达式的值依次与每个 case 的值比较,找到匹配的就跳过去执行;如果没有任何匹配,就执行 default(如果有的话)。 break 的用法 break 语句用于跳出 switch 结构。如果没有 break,程序会继续执行下一个 case 中的代码——这个特性被称为"穿透"(fall-through)。 有 break 的情况(正常行为): i...
指针
需要预先了解: 内存基础 &取地址符 & 是取地址符,用于获取变量的内存地址。大多数的数据类型往往占用不止一个字节的空间, & 取到的就是其中第一个字节的地址。 #include <iostream> int main() { int a = 10; // 创建一个 int 类型的变量 a std::cout << "a 的地址: " << &a << std::endl; std::cout << "地址的大小: " << sizeof(&a) << " 个字节" << std::endl; return 0; } 编译并运行代码后,看到这样的输出: a 的地址: 0x378cfffe2c 地址的大小: 8 个字节 地址大小与 CPU 架构的关联 对于x86_32架构的CPU,其地址总线为32位,对应地址的大小是32个二进制位,也就是4个字节。 对于x86_64...
指针常量与常量指针
需要预先了解: 指针 变量与常量 常量指针:指向常量的指针。 1. 该指针指向常量,被其指向的内容不可修改。 int a = 10; const int *ptr = &a; *ptr = 20; // 错误操作,不可以修改常量指针指向的内容 即使常量指针指向的是变量,也不可以通过常量指针对其进行修改。 2. 该指针本身为变量,可以修改指针的指向。 int a = 10, b = 20; const int *ptr = &a; ptr = &b; // 正确,允许修改指针指向 指针常量:指针本身是常量,指向不可改变。 1. 该指针指向的是变量,可以修改指针指向的内容。 int a = 10; int *const ptr = &a; *ptr = 20; // 正确,允许修改指针常量所指向的内容 2. 该指针本身为常量,不可以修改指针的指向。 int a = 10, b = 20; int * const ptr = &a; ptr =...
引用与左右值
引用 引用(Reference) 是一个已存在变量的别名,它提供了一种更方便的方式来间接访问变量,语法为类型 &别名 = 变量名;: int num = 10; int& ref = num; // ref 是变量 num 的别名 引用的注意事项 1. 引用必须在定义的时候初始化。 int& ref; // 错误操作 2. 引用不能再绑定其它变量。 int num1 = 10, num2 = 20; int& ref = num1; ref = num2; // 这个操作是把 num2 的值赋给 num1,而不是让ref成为num2的引用 常引用 常引用(Const Reference) 是指向常量的引用,使用const关键字修饰,语法为const 类型 &常引用名 = 变量名/常量名。 int num = 10; const int& const_ref = num; 即使常引用指向的是变量,也不允许通过引用对其进行修改。 左值与右值 左值 左值(lvalue):具有持久内存地...
引用与指针的区别
需要预先学习: 指针 指针常量与常量指针 引用与左右值 语法层面 指针的值是地址,需要通过解引用操作符*来访问指针所指向的对象,而引用是一个已存在变量的别名,可以直接使用引用名来访问变量。 int num = 10; int* ptr = # int& ref = num; std::cout << *ptr << std::endl; std::cout << ref << std::endl; 资源持有层面 引用天然地不支持更换对象,而指针需要在*后加const修饰才能实现类似语义: int& ref = num; // ref 永远绑定 num ref = num2; // 这是把 num2 的值赋给 num,而不是让 ref 绑定 num2 // 相当于: int* const ptr = # // ptr 永远指向 num 内存层面 引用在一些实现中不占用额外的内存空间,而指针是一个变量,会占用一定的...


