diff --git a/404.html b/404.html index dd961f6..c045463 100644 --- a/404.html +++ b/404.html @@ -20,7 +20,7 @@
- + \ No newline at end of file diff --git a/assets/16.B2zelVpk.svg b/assets/16.B2zelVpk.svg deleted file mode 100644 index 9069c99..0000000 --- a/assets/16.B2zelVpk.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
地址(001)
地址(002)
地址(003)
地址(004)
地址(009)
地址(010)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
内存条
地址(005)
地址(006)
地址(007)
地址(008)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
存储单元
\ No newline at end of file diff --git a/assets/16.g66usGgc.svg b/assets/16.g66usGgc.svg new file mode 100644 index 0000000..a94581d --- /dev/null +++ b/assets/16.g66usGgc.svg @@ -0,0 +1,4 @@ + + + +
地址(000)
地址(001)
地址(002)
地址(003)
地址(008)
地址(009)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
内存条
地址(004)
地址(005)
地址(006)
地址(007)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
地址(...)
存储单元
\ No newline at end of file diff --git a/assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.js b/assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.js similarity index 99% rename from assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.js rename to assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.js index bb00dfa..ea933a2 100644 --- a/assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.js +++ b/assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.L8V3GBrc.png",p="/c/assets/2.nqdAY_P3.png",t="/c/assets/3.CceY8r_n.png",h="/c/assets/4.DHaUgOwj.png",k="/c/assets/5.CXGaq_zh.png",e="/c/assets/6.BrZYAEEl.png",r="/c/assets/7.DpCroFHv.png",d="/c/assets/8.Cr7P0Gji.png",E="/c/assets/9.NlBmD7pA.png",c="/c/assets/10.ZiBq6Pno.png",g="/c/assets/11.DAgmsf-w.png",F="/c/assets/12.B2iC37fw.png",y="/c/assets/14.BlE3ZFud.png",o="/c/assets/15.CBpay1zM.svg",u="/c/assets/16.B2zelVpk.svg",b="/c/assets/17.BW4hoq9o.svg",C="/c/assets/2.CdvhiwcU.png",m="/c/assets/3.D74t3-Xt.png",B="/c/assets/20.DdAZIfeP.png",A="/c/assets/21.B4Zfj2jX.png",D="/c/assets/22.IfpA0D5n.png",v="/c/assets/23.CfIzYazX.png",q="/c/assets/24.eHnZcbpI.png",f="/c/assets/25.BNoKlM4o.png",_="/c/assets/26.CMVtwrqr.png",x="/c/assets/27.CN19KJG7.png",z="/c/assets/28.BIhiJHjz.png",P="/c/assets/29.A_E4n4g8.png",w="/c/assets/30.Bv4qFbwF.png",I="/c/assets/31.IKaazo2J.png",N="/c/assets/32.CGTVELeO.png",T="/c/assets/33.Bz4_lEH0.gif",L="/c/assets/34.CcDWE4nn.png",O="/c/assets/35.B7y2_JVX.gif",S="/c/assets/36.Btcc3rs2.gif",U="/c/assets/37.CR4ARW8y.png",M="/c/assets/36.Btcc3rs2.gif",R="/c/assets/39.DOX3ymYP.gif",X="/c/assets/40.Cie9_tkP.gif",G="/c/assets/41.DLjH9Ges.png",is=JSON.parse('{"title":"第一章:数据类型(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/03_xdx/index.md","filePath":"notes/01_c-basic/03_xdx/index.md","lastUpdated":1723877358000}'),J={name:"notes/01_c-basic/03_xdx/index.md"},j=n('

第一章:数据类型(⭐)

1.1 概述

NOTE

普通变量和指针变量的相同点:

普通变量和指针变量的不同点:

NOTE

1.2 整数类型

1.2.1 概述

类型存储空间(内存空间)取值范围
unsigned short (无符号短整型)2 字节0 ~ 65,535 (2^16 - 1)
[signed] short(有符号短整型,默认)2 字节-32,768 (- 2^15) ~ 32,767 (2^15 -1)
类型存储空间(内存空间)取值范围
unsigned int(无符号整型)4 字节(通常)0 ~ 4294967295 (0 ~2^32 -1)
[signed] int(有符号整型,默认)4 字节(通常)-2147483648(- 2^31) ~ 2147483647 (2^31-1)
类型存储空间(内存空间)取值范围
unsigned long(无符号长整型)4 字节(通常)0 ~2^32 -1
[signed] long(有符号长整型,默认)4 字节(通常)- 2^31 ~ 2^31-1
类型存储空间(内存空间)取值范围
unsigned long long(无符号长整型)8 字节(通常)0 ~2^64 -1
[signed] long long(有符号长整型,默认)8 字节(通常)- 2^63 ~ 2^63-1

IMPORTANT

IMPORTANT

1.2.2 短整型(了解)

c
unsigned short x = 10 ; // 无符号短整型
c
short x = -10; // 有符号短整型

NOTE

c
#include <stdio.h>
+import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.L8V3GBrc.png",p="/c/assets/2.nqdAY_P3.png",t="/c/assets/3.CceY8r_n.png",h="/c/assets/4.DHaUgOwj.png",k="/c/assets/5.CXGaq_zh.png",e="/c/assets/6.BrZYAEEl.png",r="/c/assets/7.DpCroFHv.png",d="/c/assets/8.Cr7P0Gji.png",E="/c/assets/9.NlBmD7pA.png",c="/c/assets/10.ZiBq6Pno.png",g="/c/assets/11.DAgmsf-w.png",F="/c/assets/12.B2iC37fw.png",y="/c/assets/14.BlE3ZFud.png",o="/c/assets/15.CBpay1zM.svg",u="/c/assets/16.g66usGgc.svg",b="/c/assets/17.BW4hoq9o.svg",C="/c/assets/2.CdvhiwcU.png",m="/c/assets/3.D74t3-Xt.png",B="/c/assets/20.DdAZIfeP.png",A="/c/assets/21.B4Zfj2jX.png",D="/c/assets/22.IfpA0D5n.png",v="/c/assets/23.CfIzYazX.png",q="/c/assets/24.eHnZcbpI.png",f="/c/assets/25.BNoKlM4o.png",_="/c/assets/26.CMVtwrqr.png",x="/c/assets/27.CN19KJG7.png",z="/c/assets/28.BIhiJHjz.png",P="/c/assets/29.A_E4n4g8.png",w="/c/assets/30.Bv4qFbwF.png",I="/c/assets/31.IKaazo2J.png",N="/c/assets/32.CGTVELeO.png",T="/c/assets/33.Bz4_lEH0.gif",L="/c/assets/34.CcDWE4nn.png",O="/c/assets/35.B7y2_JVX.gif",S="/c/assets/36.Btcc3rs2.gif",U="/c/assets/37.CR4ARW8y.png",M="/c/assets/36.Btcc3rs2.gif",R="/c/assets/39.DOX3ymYP.gif",X="/c/assets/40.Cie9_tkP.gif",G="/c/assets/41.DLjH9Ges.png",is=JSON.parse('{"title":"第一章:数据类型(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/03_xdx/index.md","filePath":"notes/01_c-basic/03_xdx/index.md","lastUpdated":1723877358000}'),J={name:"notes/01_c-basic/03_xdx/index.md"},j=n('

第一章:数据类型(⭐)

1.1 概述

  • 根据变量存储不同,我们可以将变量分为两类:

    • 普通变量:变量所对应的内存中存储的是普通值
    • 指针变量:变量所对应的内存中存储的是另一个变量的地址
  • 如下图所示:

NOTE

普通变量和指针变量的相同点:

  • 普通变量有内存空间,指针变量也有内存空间。
  • 普通变量有内存地址,指针变量也有内存地址。
  • 普通变量所对应的内存空间中有值,指针变量所对应的内存空间中也有值。

普通变量和指针变量的不同点:

  • 普通变量所对应的内存空间存储的是普通的值,如:整数、小数、字符等;指针变量所对应的内存空间存储的是另外一个变量的地址。
  • 普通变量有普通变量的运算方式,而指针变量有指针变量的运算方式(后续讲解)。
  • 那么,在 C 语言中变量的数据类型就可以这么划分,如下所示:

NOTE

  • 根据普通变量存储的类型不同,可以将普通变量类型划分为基本数据类型(整型、字符类型、浮点类型、布尔类型)和复合数据类型(数组类型、结构体类型、共用体类型、枚举类型)。
  • 根据指针变量指向空间存储的类型不同,可以将指针类型分为基本数据类型指针复合数据类型指针函数指针数组指针等,例如:如果指针所指向的空间保存的是 int 类型,那么该指针就是 int 类型的指针。

1.2 整数类型

1.2.1 概述

  • 整数类型简称整型,用于存储整数值,如:12、20、50 等。
  • 根据所占内存空间大小的不同,可以将整数类型划分为:
  • ① 短整型:
类型存储空间(内存空间)取值范围
unsigned short (无符号短整型)2 字节0 ~ 65,535 (2^16 - 1)
[signed] short(有符号短整型,默认)2 字节-32,768 (- 2^15) ~ 32,767 (2^15 -1)
  • ② 整型:
类型存储空间(内存空间)取值范围
unsigned int(无符号整型)4 字节(通常)0 ~ 4294967295 (0 ~2^32 -1)
[signed] int(有符号整型,默认)4 字节(通常)-2147483648(- 2^31) ~ 2147483647 (2^31-1)
  • ③ 长整型:
类型存储空间(内存空间)取值范围
unsigned long(无符号长整型)4 字节(通常)0 ~2^32 -1
[signed] long(有符号长整型,默认)4 字节(通常)- 2^31 ~ 2^31-1
  • ④ 长长整型:
类型存储空间(内存空间)取值范围
unsigned long long(无符号长整型)8 字节(通常)0 ~2^64 -1
[signed] long long(有符号长整型,默认)8 字节(通常)- 2^63 ~ 2^63-1

IMPORTANT

  • ① 数据类型在内存中占用的存储单元(字节数),就称为该数据类型的长度(步长),如:short 占用 2 个字节的内存,就称 short 的长度(步长)是 2。

  • ② C 语言并没有严格规定各种整数数据类型在内存中所占存储单元的长度,只做了宽泛的限制:

    • short 至少占用 2 个字节的存储单元。
    • int 建议为一个机器字长(指计算机的处理器在一次操作中能够处理的二进制数据的位数,机器字长是处理器的“字”长度,它决定了处理器在一个时钟周期内能够处理的数据量,如:早期的计算机的处理器通常是 8 位的机器字长,意味着处理器一次只能处理 8 位(二进制)数据;之后的计算机的处理器有 16 位的机器字长,意味着处理器一次可以处理 16 位的数据;再之后计算机的处理器有 32 位或 64 位的机器字长,意味着处理器一次可以处理 32 位或 64位的数据)。即:32 位环境下 int 占用 4 个字节的存储单元,64 位环境下 int 占用 8 个字节的存储单元。
    • short 的长度(步长)不能大于 int,long 的长度(步长)不能小于 int,long long 不能小于 long。
  • ③ 那么,各种整数数据类型在内存中所占存储单元的长度的公式就是 2 ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long),具体的存储空间由编译系统自行决定。其中,sizeof 是测量类型或变量、常量长度的运算符

IMPORTANT

  • ① 之所以这么规定,是为了可以让 C 语言长久使用,因为目前主流的 CPU 都是 64 位,但是在 C 语言刚刚出现的时候,CPU 还是以 8 位和 16 位为主。如果当时就将整型定死为 8 位或 16 位,那么现在我们肯定不会再学习 C 语言了。
  • ② 整型分为有符号 signed 和无符号 unsigned 两种,默认是 signed。
  • ③ 在实际开发中,最常用的整数类型就是 int 类型了,如果取值范围不够,就使用 long 或 long long 。
  • ④ C 语言中的格式占位符非常多,只需要大致了解即可;因为,我们在实际开发中,一般都会使用 C++ 或 Rust 以及其它的高级编程语言,如:Java 等,早已经解决了必须通过格式占位符来才能将变量进行输入和输出。

1.2.2 短整型(了解)

  • 语法:
c
unsigned short x = 10 ; // 无符号短整型
c
short x = -10; // 有符号短整型

NOTE

  • ① 有符号表示的是正数、负数和 0 ,即有正负号。无符号表示的是 0 和正数,即正整数,没有符号。
  • ② 在 printf无符号短整型(unsigned short)格式占位符%hu有符号短整型(signed short)格式占位符%hd
  • ③ 可以通过 sizeof 运算符获取无符号短整型(unsigned short)有符号短整型(signed short)存储空间(所占内存空间)
  • ③ 可以通过 #include <limits.h> 来获取 无符号短整型(unsigned short)有符号短整型(signed short)取值范围
  • 示例:定义和打印短整型变量
c
#include <stdio.h>
 
 int main() {
 
@@ -791,4 +791,4 @@ import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l
     printf("result = %d\\n", result); // result = 110
 
     return 0;
-}

2.8 运算符优先级

  • C 语言中运算符的优先级,如下所示:
优先级运算符名称或含义结合方向
1[]数组下标➡️(从左到右)
()圆括号
.成员选择(对象)
->成员选择(指针)
2-负号运算符⬅️(从右到左)
(类型)强制类型转换
++自增运算符
--自减运算符
*取值运算符
&取地址运算符
!逻辑非运算符
~按位取反运算符
sizeof长度运算符
3/➡️(从左到右)
*
%余数(取模)
4+➡️(从左到右)
-
5<<左移➡️(从左到右)
>>右移
6>大于➡️(从左到右)
>=大于等于
<小于
<=小于等于
7==等于➡️(从左到右)
!=不等于
8&按位与➡️(从左到右)
9^按位异或➡️(从左到右)
10|按位或➡️(从左到右)
11&&逻辑与➡️(从左到右)
12||逻辑或➡️(从左到右)
13?:条件运算符⬅️(从右到左)
14=赋值运算符⬅️(从右到左)
/=除后赋值
*=乘后赋值
%=取模后赋值
+=加后赋值
-=减后赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
|=按位或后赋值
15,逗号运算符➡️(从左到右)

WARNING

  • ① 不要过多的依赖运算符的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用小括号来控制表达式的执行顺序。
  • ② 不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。
  • ③ 运算符优先级不用刻意地去记忆,总体上:一元运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符。

第三章:附录

3.1 字符集和字符集编码

3.3.1 概述

  • 字符集和字符集编码(简称编码)计算机系统中处理文本数据的两个基本概念,它们密切相关但又有区别。
  • 字符集(Character Set)是一组字符的集合,其中每个字符都被分配了一个唯一的编号(通常是数字)。字符可以是字母、数字、符号、控制代码(如换行符)等。字符集定义了可以表示的字符的范围,但它并不直接定义如何将这些字符存储在计算机中。

NOTE

ASCII(美国信息交换标准代码)是最早期和最简单的字符集之一,它只包括了英文字母、数字和一些特殊字符,共 128 个字符。每个字符都分配给了一个从 0 到 127 的数字。

  • 字符集编码(Character Encoding,简称编码)是一种方案或方法,它定义了如何将字符集中的字符转换为计算机存储和传输的数据(通常是一串二进制数字)。简而言之,编码是字符到二进制数据之间的映射规则。

NOTE

ASCII 编码方案定义了如何将 ASCII 字符集中的每个字符表示为 7 位的二进制数字。例如:大写字母'A'在 ASCII 编码中表示为二进制的1000001,十进制的 65

  • 字符集字符集编码之间的关系如下:

  • Linux 中安装帮助手册:

3.3.2 ASCII 编码

  • 冯·诺依曼体系结构中,我们知道,计算机中所有的数据指令都是以二进制的形式表示的;所以,计算机中对于文本数据的数据也是以二进制来存储的,那么对应的流程如下:

  • 我们知道,计算机是上个世纪 60 年代在美国研制成功的,为了实现字符和二进制的转换,美国就制定了一套字符编码,即英语字符和二进制位之间的关系,即 ASCII (American Standard Code for Information Interchange)编码:
    • ASCII 编码只包括了英文字符、数字和一些特殊字符,一共 128 个字符,并且每个字符都分配了唯一的数字,范围是 0 - 127。
    • ASCII 编码中的每个字符都使用 7 位的二进制数字表示;但是,计算机中的存储的最小单位是 1 B = 8 位,那么最高位统一规定为 0 。

NOTE

  • ① 其实,早期是没有字符集的概念的,只是后来为了解决乱码问题,而产生了字符集的概念。
  • ② 对于英文体系来说,a-zA-Z0-9以及一些特殊字符一共 128 就可以满足实际存储需求;所以,在也是为什么 ASCII 码使用 7 位二进制(2^7 = 128 )来存储的。
  • 在操作系统中,就内置了对应的编码表,Linux 也不例外;可以使用如下的命令查看:
shell
man ascii

  • 其对应的 ASCII 编码表,如下所示:

  • 但是,随着计算机的发展,计算机开始了东征之路,由美国传播到东方:

  • 先是传播到了欧洲,欧洲在兼容 ASCII 编码的基础上,推出了 ISO8859-1 编码,即:
    • ISO8859-1 编码包括基本的拉丁字母表、数字、标点符号,以及西欧语言中特有的一些字符,如:法语中的 è、德语中的 ü 等。
    • ISO 8859-1 为每个字符分配一个单字节(8 位)编码,意味着它可以表示最多 256 (2^8)个不同的字符(编号从 0 到 255)。
    • ISO 8859-1 的前 128 个字符与 ASCII 编码完全一致,这使得 ASCII 编码的文本可以无缝转换为 ISO 8859-1 编码。

  • 计算机继续传播到了亚洲,亚洲(双字节)各个国家分别给出了自己国家对应的字符集编码,如:
    • 日本推出了 Shift-JIS 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:
        • 第一个字节:129 - 159 和 224 - 239 。
        • 第二个字节:64 - 126 和 128 - 252 。
    • 韩国推出了 EUC-KR 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:从 41281 - 65278。
    • 中国推出了 GBK 编码:
      • 单字节 ASCII 范围:0 - 127。
      • 双字节范围:33088 - 65278 。

NOTE

  • ① 通过上面日本、韩国、中国的编码十进制范围,我们可以看到,虽然这些编码系统在技术上的编码范围存在重叠(特别是在高位字节区域),但因为它们各自支持的字符集完全不同,所以实际上它们并不直接冲突。
  • ② 但是,如果一个中国人通过 GBK 编码写的文章,通过邮件发送给韩国人,因为韩国和中国在字符集编码上的高位字节有重叠部分,必然会造成歧义。

3.3.3 Unicode 编码

  • 在 Unicode 之前,世界上存在着数百种不同的编码系统,每一种编码系统都是为了支持特定语言或一组语言的字符集。这些编码系统,包括:ASCII、ISO 8859 系列、GBK、Shift-JIS、EUC-KR 等,它们各自有不同的字符范围和编码方式。这种多样性虽然在局部范围内解决了字符表示的问题,但也带来了以下几个方面的挑战:

    • 编码冲突:由于不同的编码系统可以为相同的字节值分配不同的字符,因此在不同编码之间转换文本时,如果没有正确处理编码信息,就很容易产生乱码。这种编码冲突在尝试处理多种语言的文本时尤为突出。
    • 编码的复杂性:随着全球化的发展,软件和系统需要支持越来越多的语言,这就要求开发者和系统同时处理多种不同的编码系统。这不仅增加了开发和维护的复杂性,而且也增加了出错的风险。
    • 资源限制:在早期计算机技术中,内存和存储资源相对有限。不同的编码标准要求系统存储多套字符集数据,这无疑增加了对有限资源的消耗。
    • ……
  • 针对上述的种种问题,为了推行全球化,Unicode 应运而生,Unicode 的核心规则和设计原则是建立一个全球统一的字符集,使得世界上所有的文字和符号都能被唯一地识别和使用,无论使用者位于何地或使用何种语言。这套规则包括了字符的编码、表示、处理和转换机制,旨在确保不同系统和软件间能够无缝交换和处理文本数据。

    • 通用字符集 (UCS):Unicode 为每一个字符分配一个唯一的编号(称为“码点”)。这些码点被组织在一个统一的字符集中,官方称之为 “通用字符集”(Universal Character Set,UCS)。码点通常表示为 U+ 后跟一个十六进制数,例如:U+0041 代表大写的英文字母 “A”
    • 编码平面和区段:Unicode 码点被划分为多个 “平面(Planes)”,每个平面包含 65536(16^4)个码点。目前,Unicode定义了 17 个平面(从 0 到16),每个平面被分配了一个编号,从 “基本多文种平面(BMP)” 的 0 开始,到 16 号平面结束。这意味着 Unicode 理论上可以支持超过 110万(17*65536)个码点。
  • Unicode 仅仅只是字符集,给每个字符设置了唯一的数字编号而已,却没有给出这些数字编号实际如何存储,可以通过如下命令查看:

  • 为了在计算机系统中表示 Unicode 字符,定义了几种编码方案,这些方案包括 UTF-8、UTF-16 和 UTF-32 等。
    • UTF-8:使用 1 - 4 个字节表示每个 Unicode 字符,兼容 ASCII,是网络上最常用的编码。
    • UTF-16:使用 2 - 4 个字节表示每个 Unicode 字符,适合于需要经常处理基本多文种平面之外字符的应用。
    • UTF-32:使用固定的 4 个字节表示每个 Unicode 字符,简化了字符处理,但增加了存储空间的需求。
  • Unicode 字符集和对应的UTF-8 字符编码之间的关系,如下所示:

',348),H=[j];function V(Z,K,W,Y,$,Q){return a(),i("div",null,H)}const as=s(J,[["render",V]]);export{is as __pageData,as as default}; +}

2.8 运算符优先级

优先级运算符名称或含义结合方向
1[]数组下标➡️(从左到右)
()圆括号
.成员选择(对象)
->成员选择(指针)
2-负号运算符⬅️(从右到左)
(类型)强制类型转换
++自增运算符
--自减运算符
*取值运算符
&取地址运算符
!逻辑非运算符
~按位取反运算符
sizeof长度运算符
3/➡️(从左到右)
*
%余数(取模)
4+➡️(从左到右)
-
5<<左移➡️(从左到右)
>>右移
6>大于➡️(从左到右)
>=大于等于
<小于
<=小于等于
7==等于➡️(从左到右)
!=不等于
8&按位与➡️(从左到右)
9^按位异或➡️(从左到右)
10|按位或➡️(从左到右)
11&&逻辑与➡️(从左到右)
12||逻辑或➡️(从左到右)
13?:条件运算符⬅️(从右到左)
14=赋值运算符⬅️(从右到左)
/=除后赋值
*=乘后赋值
%=取模后赋值
+=加后赋值
-=减后赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
|=按位或后赋值
15,逗号运算符➡️(从左到右)

WARNING

第三章:附录

3.1 字符集和字符集编码

3.3.1 概述

NOTE

ASCII(美国信息交换标准代码)是最早期和最简单的字符集之一,它只包括了英文字母、数字和一些特殊字符,共 128 个字符。每个字符都分配给了一个从 0 到 127 的数字。

NOTE

ASCII 编码方案定义了如何将 ASCII 字符集中的每个字符表示为 7 位的二进制数字。例如:大写字母'A'在 ASCII 编码中表示为二进制的1000001,十进制的 65

3.3.2 ASCII 编码

NOTE

shell
man ascii

NOTE

3.3.3 Unicode 编码

',348),H=[j];function Z(K,V,W,Y,$,Q){return a(),i("div",null,H)}const as=s(J,[["render",Z]]);export{is as __pageData,as as default}; diff --git a/assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.lean.js b/assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.lean.js similarity index 84% rename from assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.lean.js rename to assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.lean.js index cac4791..fdfbc19 100644 --- a/assets/notes_01_c-basic_03_xdx_index.md.JfplZlc6.lean.js +++ b/assets/notes_01_c-basic_03_xdx_index.md.YSIkpKqs.lean.js @@ -1 +1 @@ -import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.L8V3GBrc.png",p="/c/assets/2.nqdAY_P3.png",t="/c/assets/3.CceY8r_n.png",h="/c/assets/4.DHaUgOwj.png",k="/c/assets/5.CXGaq_zh.png",e="/c/assets/6.BrZYAEEl.png",r="/c/assets/7.DpCroFHv.png",d="/c/assets/8.Cr7P0Gji.png",E="/c/assets/9.NlBmD7pA.png",c="/c/assets/10.ZiBq6Pno.png",g="/c/assets/11.DAgmsf-w.png",F="/c/assets/12.B2iC37fw.png",y="/c/assets/14.BlE3ZFud.png",o="/c/assets/15.CBpay1zM.svg",u="/c/assets/16.B2zelVpk.svg",b="/c/assets/17.BW4hoq9o.svg",C="/c/assets/2.CdvhiwcU.png",m="/c/assets/3.D74t3-Xt.png",B="/c/assets/20.DdAZIfeP.png",A="/c/assets/21.B4Zfj2jX.png",D="/c/assets/22.IfpA0D5n.png",v="/c/assets/23.CfIzYazX.png",q="/c/assets/24.eHnZcbpI.png",f="/c/assets/25.BNoKlM4o.png",_="/c/assets/26.CMVtwrqr.png",x="/c/assets/27.CN19KJG7.png",z="/c/assets/28.BIhiJHjz.png",P="/c/assets/29.A_E4n4g8.png",w="/c/assets/30.Bv4qFbwF.png",I="/c/assets/31.IKaazo2J.png",N="/c/assets/32.CGTVELeO.png",T="/c/assets/33.Bz4_lEH0.gif",L="/c/assets/34.CcDWE4nn.png",O="/c/assets/35.B7y2_JVX.gif",S="/c/assets/36.Btcc3rs2.gif",U="/c/assets/37.CR4ARW8y.png",M="/c/assets/36.Btcc3rs2.gif",R="/c/assets/39.DOX3ymYP.gif",X="/c/assets/40.Cie9_tkP.gif",G="/c/assets/41.DLjH9Ges.png",is=JSON.parse('{"title":"第一章:数据类型(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/03_xdx/index.md","filePath":"notes/01_c-basic/03_xdx/index.md","lastUpdated":1723877358000}'),J={name:"notes/01_c-basic/03_xdx/index.md"},j=n("",348),H=[j];function V(Z,K,W,Y,$,Q){return a(),i("div",null,H)}const as=s(J,[["render",V]]);export{is as __pageData,as as default}; +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.CZRoMP2i.js";const l="/c/assets/1.L8V3GBrc.png",p="/c/assets/2.nqdAY_P3.png",t="/c/assets/3.CceY8r_n.png",h="/c/assets/4.DHaUgOwj.png",k="/c/assets/5.CXGaq_zh.png",e="/c/assets/6.BrZYAEEl.png",r="/c/assets/7.DpCroFHv.png",d="/c/assets/8.Cr7P0Gji.png",E="/c/assets/9.NlBmD7pA.png",c="/c/assets/10.ZiBq6Pno.png",g="/c/assets/11.DAgmsf-w.png",F="/c/assets/12.B2iC37fw.png",y="/c/assets/14.BlE3ZFud.png",o="/c/assets/15.CBpay1zM.svg",u="/c/assets/16.g66usGgc.svg",b="/c/assets/17.BW4hoq9o.svg",C="/c/assets/2.CdvhiwcU.png",m="/c/assets/3.D74t3-Xt.png",B="/c/assets/20.DdAZIfeP.png",A="/c/assets/21.B4Zfj2jX.png",D="/c/assets/22.IfpA0D5n.png",v="/c/assets/23.CfIzYazX.png",q="/c/assets/24.eHnZcbpI.png",f="/c/assets/25.BNoKlM4o.png",_="/c/assets/26.CMVtwrqr.png",x="/c/assets/27.CN19KJG7.png",z="/c/assets/28.BIhiJHjz.png",P="/c/assets/29.A_E4n4g8.png",w="/c/assets/30.Bv4qFbwF.png",I="/c/assets/31.IKaazo2J.png",N="/c/assets/32.CGTVELeO.png",T="/c/assets/33.Bz4_lEH0.gif",L="/c/assets/34.CcDWE4nn.png",O="/c/assets/35.B7y2_JVX.gif",S="/c/assets/36.Btcc3rs2.gif",U="/c/assets/37.CR4ARW8y.png",M="/c/assets/36.Btcc3rs2.gif",R="/c/assets/39.DOX3ymYP.gif",X="/c/assets/40.Cie9_tkP.gif",G="/c/assets/41.DLjH9Ges.png",is=JSON.parse('{"title":"第一章:数据类型(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/03_xdx/index.md","filePath":"notes/01_c-basic/03_xdx/index.md","lastUpdated":1723877358000}'),J={name:"notes/01_c-basic/03_xdx/index.md"},j=n("",348),H=[j];function Z(K,V,W,Y,$,Q){return a(),i("div",null,H)}const as=s(J,[["render",Z]]);export{is as __pageData,as as default}; diff --git a/hashmap.json b/hashmap.json index 2dfbbaa..a870e14 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"index.md":"BbViQGn7","notes_01_c-basic_00_xdx_index.md":"B6_MBRcO","notes_01_c-basic_01_xdx_index.md":"H45ZmOuP","notes_01_c-basic_02_xdx_index.md":"KklrqQnl","notes_01_c-basic_03_xdx_index.md":"JfplZlc6","notes_01_c-basic_04_xdx_index.md":"DHqdsloC","notes_01_c-basic_05_xdx_index.md":"g04V1nBy","notes_01_c-basic_06_xdx_index.md":"Dgj5flCZ","notes_04_linux_01_xdx_index.md":"mme5Yndw","notes_about_index.md":"M_a2B8fl","notes_index.md":"bgNns6d1"} +{"index.md":"BbViQGn7","notes_01_c-basic_00_xdx_index.md":"B6_MBRcO","notes_01_c-basic_01_xdx_index.md":"H45ZmOuP","notes_01_c-basic_02_xdx_index.md":"KklrqQnl","notes_01_c-basic_03_xdx_index.md":"YSIkpKqs","notes_01_c-basic_04_xdx_index.md":"DHqdsloC","notes_01_c-basic_05_xdx_index.md":"g04V1nBy","notes_01_c-basic_06_xdx_index.md":"Dgj5flCZ","notes_04_linux_01_xdx_index.md":"mme5Yndw","notes_about_index.md":"M_a2B8fl","notes_index.md":"bgNns6d1"} diff --git a/index.html b/index.html index f22abbd..3902b67 100644 --- a/index.html +++ b/index.html @@ -23,7 +23,7 @@
Skip to content

许大仙同学

『这个世纪疯狂,没人性,腐败;你却一直清醒,温柔,一尘不染。』

许大仙

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/01_c-basic/00_xdx/index.html b/notes/01_c-basic/00_xdx/index.html index 46c70e8..ebb1ee7 100644 --- a/notes/01_c-basic/00_xdx/index.html +++ b/notes/01_c-basic/00_xdx/index.html @@ -69,7 +69,7 @@ }

NOTE

编译器就是运行在操作系统之上的程序,其作用就是用来将程序员编写的源代码转换为计算机能够识别的二进制指令。

NOTE

总结:无论我们学习任何一门编程语言,想要将程序运行起来,都必须做如下的两件事情:

2.3 计算机语言简史

2.3.1 机器语言(相当于人类的石器时代)

txt
0000,0000,000000010000 代表 LOAD A, 16
 0000,0001,000000000001 代表 LOAD B, 1
 0001,0001,000000010000 代表 STORE B, 16

WARNING

2.3.2 汇编语言(相当于人类的青铜&铁器时代)

WARNING

2.3.3 高级语言(相当于人类的信息时代)

NOTE

IMPORTANT

C 语言出现的时候,已经度过了编程语言的拓荒年代,具备了现代编程语言的特性,但是这个时候还没有出现“软件危机”,人们没有动力去开发更加高级的语言,所以也没有太复杂的编程思想;而之后出现的“面向对象”的编程思想解决了一部分在“软件危机”上的窘境。

2.3.4 总结

类别特征优点缺点示例
机器语言直接由计算机执行的二进制代码执行速度快编写困难,可读性差,与具体硬件强绑定二进制代码
汇编语言用助记符代替二进制代码的低级语言相对机器语言更易编写和理解,允许直接控制硬件资源依然需要了解硬件,不够抽象,与具体硬件或平台相关MOV,ADD 等助记符
高级语言接近人类语言,提供了更高层次的抽象易于编写和维护,可移植性好,支持多种编程范式需要通过编译器或解释器转换为机器语言,可能存在一定的性能损失C,Java, Python 等

IMPORTANT

第三章:初识 C 语言

3.1 C 语言究竟是一门怎样的编程语言?

NOTE

许多著名编程语言的创造者和计算机科学领域的大佬都有学习和使用过 C 语言,如:詹姆斯·高斯林(James Gosling,Java 之父),比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup,C++ 之父),吉多·范罗苏姆(Guido van Rossum,Python 之父),林纳斯·托瓦兹(Linus Torvalds,Linux 之父)等。

IMPORTANT

这些底层知识,包括不限于:数据结构和算法、计算机组成原理、操作系统、计算机网络、设计模式以及编译原理(了解即可):

NOTE

很多人之所以觉得 C 语言难,就是因为栽倒在 C 语言的指针那边(相对比其他的现代化编程语言而言,C 语言的指针确实足够底层和麻烦,需要掌握的细节很多);但是,一旦有所突破,学习之路就会一马平川。

3.2 C 语言的由来

NOTE

C 语言最初是作为 Unix 系统的开发工具而发明的,它的初衷非常简单,就是被设计成一种非常高效的、可以操作硬件的系统级编程语言,然后帮助团队开发 Unix 操作系统。

3.3 为什么要学习 C 语言?

NOTE

NOTE

3.4 计算机语言排行榜

3.5 C 语言到底能做什么?

3.5.1 概述

专用型编程语言描述
SQL专门用于数据库查询和管理,尽管可以嵌入其他编程语言中,但其主要应用是数据库操作。
R主要用于统计分析和数据可视化,广泛应用于数据科学和研究领域。
MATLAB主要用于数值计算、算法开发和数据可视化,广泛应用于工程和科学领域。
VHDL/Verilog用于硬件描述和数字电路设计,主要应用于电子工程领域。
通用型编程语言描述
Python广泛应用于Web开发、数据科学、自动化脚本、人工智能等。
Java用于企业级应用、移动应用开发(Android)、Web 开发等。
C++可用于系统编程、游戏开发、嵌入式系统等多个领域。
JavaScript最初用于 Web 前端开发,现在也广泛用于服务器端(Node.js)、桌面应用开发(Electron)等。

NOTE

C 语言是一门通用型的编程语言,并没有针对某个领域进行优化。但是,C 语言也有很多常见的应用领域。

3.5.2 C 语言的常见应用领域

IMPORTANT

虽然 C 语言的开发场景貌似看起来很多;但是,使用 C 语言的场景几乎就是:底层/系统开发 + 关键组件/模块的开发 + 贴近硬件的开发,这些开发场景非常关注运行效率,或者响应时间,或者硬件资源。

3.6 不学 C 语言,行吗?

NOTE

IMPORTANT

3.7 C 语言的版本选择

3.7.1 概述

3.7.2 版本 1(K&R C)

NOTE

由于 C 语言还没有成文的语法标准,这本书就成了公认标准,以两位作者的姓氏首字母作为版本简称 “K&R C”。

3.7.3 版本 2(ANSI C,又称 C89 或 C90)

NOTE

目前常用的编译器,如:MSVC(Microsoft Visual C++)、GCC、LLVM Clang 等,都能很好地支持 ANSI C 的内容。

3.7.4 版本 3(C99)

NOTE

这个时候的 C 语言编译器基本已经成熟,各个组织对 C99 的支持所表现出来的兴趣不同:

最终导致不同的编译器在部分语法上存在差异。典型的例子就是:ANSI C 规定,只能用常量表示数组的长度,而 C99 取消了这个限制,数组的长度也可以用变量表示(可变长度数组)。对于 C99 的这个新改动,GCC 和 Clang 是支持的,而 MSVC 却不支持。

3.7.5 版本 4(C11)

NOTE

3.7.6 版本 5(C17)

3.7.7 版本 6(C23)

第四章:C 语言的学习技巧

4.1 如何学习 C 语言?

IMPORTANT

IMPORTANT

现代化的高级编程语言的流行程度,除了和编程语言的设计是否优秀有关,最主要的原因就是生态

遗憾的是,C 语言的标准库非常简单,只有输入输出文件操作日期时间字符串处理内存管理,对于网络编程GUI数据库并发需要大量的第三方库操作系统的功能来扩展 C 语言的功能(Java 语言、Go 语言等其他的现代化高级编程语言,都是直接将这些常见的开发场景内置到标准库中,开箱即用,极大的降低了软件开发的难度)。C 语言的第三方库也不是很多(和其它现代化高级编程语言相比,并且大多数的第三方库都是底层库,支持应用开发的库寥寥无几,只有一个 GTK 库能够开发出桌面软件来,而没有与网站开发和 APP 开发相关的库),社区也不是很活跃(和其它现代化高级编程语言相比),更别提缺少自己的包管理器。

IMPORTANT

IMPORTANT

不过,现在 C 语言社区也开始诞生了一些包管理器,如:Conan 和 vcpkg ;也有自己的项目构建工具,如:cmake 、xmake 等。

NOTE

JavaScript 的作者 Brendan Eich(布兰登·艾奇) 曾经这么说:“与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物(致敬 C 语言)。十八世纪英国文学家约翰逊博士说得好:"它的优秀之处并非原创,它的原创之处并不优秀。"”

4.2 项目构建工具和包管理器

4.2.1 概述

4.2.2 项目构建工具

4.2.3 包管理器

4.2.3 注意事项

NOTE

4.3 C 语言为什么没有应用层开发的库?

第五章:附录

5.1 嵌入式领域中的 C 语言

5.1.1 概述

5.1.2 C51(8051 系列微控制器)

NOTE

总结:C51 微控制器适用于资源受限、需要低成本的简单控制系统,非常适合使用 C 语言来进行开发!!!

5.1.3 STM32(STM32 系列微控制器)

NOTE

总结:STM32 微控制器在物联网、消费电子、医疗设备和工业控制等领域表现出色,非常适合使用 C 语言来进行开发,因为 C 语言允许直接进行硬件控制并支持复杂的应用开发。

5.1.3 ARM 架构(特别是 ARM Cortex 系列)

NOTE

总结:ARM Cortex 系列适用于从实时系统到高级嵌入式操作系统的各类应用,支持从低功耗控制到高性能计算的多种需求,非常适合使用 C 语言来进行开发,因为 C 语言不仅用于控制硬件,还广泛应用于操作系统和应用程序的开发。

5.2 C 和 C++ 的关系

NOTE

C++ 是 C 语言的继承者和扩展,它保留了 C 语言的优势,并引入了更多现代编程语言的特性,使得它在更广泛的应用领域中得到应用。

- + \ No newline at end of file diff --git a/notes/01_c-basic/01_xdx/index.html b/notes/01_c-basic/01_xdx/index.html index 0230175..806a27c 100644 --- a/notes/01_c-basic/01_xdx/index.html +++ b/notes/01_c-basic/01_xdx/index.html @@ -307,7 +307,7 @@ --depth 1 \ --single-branch --branch=linux-msft-wsl-${KERNEL_VERSION} \ https://github.com/microsoft/WSL2-Linux-Kernel.git

shell
cd WSL2-Linux-Kernel
shell
make -j $(nproc) KCONFIG_CONFIG=Microsoft/config-wsl

shell
cd tools/perf
shell
make clean && make

shell
cp perf /usr/bin/

8.4.3 整合

8.5 Win 中文乱码问题

NOTE

8.6 CLion 中自动导入头文件

NOTE

- + \ No newline at end of file diff --git a/notes/01_c-basic/02_xdx/index.html b/notes/01_c-basic/02_xdx/index.html index 9e232f5..a30348b 100644 --- a/notes/01_c-basic/02_xdx/index.html +++ b/notes/01_c-basic/02_xdx/index.html @@ -262,7 +262,7 @@ return 0; }

3.3 进制的运算规则

3.3.1 概述

3.3.2 二进制的运算

3.3.3 八进制的运算

3.3.4 十六进制的运算

3.4 进制的转换

3.4.1 概述

3.4.2 二进制和十进制的转换

3.4.2.1 二进制转换为十进制

NOTE

3.4.2.2 十进制转换二进制

NOTE

3.4.3 二进制转八进制

3.4.4 二进制转十六进制

3.5 原码、反码和补码

3.5.1 概述

IMPORTANT

这里讨论的适用于符号位的整数,如:int 等;而不适用于无符号位的整数,即:unsinged int 等。

IMPORTANT

这里讨论的适用于符号位的整数,如:int 等;而不适用于无符号位的整数,即:unsinged int 等。

3.5.2 原码

十进制数原码(8位二进制数)
+10000 0001
十进制数原码(8位二进制数)
-11000 0001

IMPORTANT

总结:

3.5.3 反码

十进制数原码(8位二进制数)反码(8位二进制数)
+10000 00010000 0001
十进制数原码(8位二进制数)反码(8位二进制数)
-11000 00011111 1110

IMPORTANT

总结:

3.5.4 补码

十进制数原码(8位二进制数)反码(8位二进制数)补码(8位二进制数)
+10000 00010000 00010000 0001
十进制数原码(8位二进制数)反码(8位二进制数)补码(8位二进制数)
-11000 00011111 11101111 1111

IMPORTANT

总结:

3.5.5 总结

3.6 计算机底层为什么使用补码?

3.7 补码到底是如何简化硬件电路的?

NOTE

直接使用原码表示整数,让符号位也参与运算,那么对于减法来说,结果显然是不正确的。

NOTE

直接使用反码表示整数,让符号位也参与运算,对于 6 +(-18)来说,结果貌似正确。

NOTE

IMPORTANT

总结:采用补码的形式正好将相差的 1纠正过来,也没有影响到小数减大数,这个“补丁”非常巧妙。

补码这种天才般的设计,一举达成了之前加法运算和减法运算提到的两个目标,简化了硬件电路。

- + \ No newline at end of file diff --git a/notes/01_c-basic/03_xdx/index.html b/notes/01_c-basic/03_xdx/index.html index 56ee9ef..7bf3ef3 100644 --- a/notes/01_c-basic/03_xdx/index.html +++ b/notes/01_c-basic/03_xdx/index.html @@ -12,7 +12,7 @@ - + @@ -591,7 +591,7 @@ printf("num3=%d \n", num3); return 0; -}

1.7 再谈数据类型

NOTE

这些存储单元中,存储的都是 0 和 1 这样的数据,因为计算机只能识别二进制数。

NOTE

之所以,要给每个存储单元加上内存地址,就是为了加快数据的存取速度,可以类比生活中的字典以及快递单号

c
int num = 10;

NOTE

上述的代码其实透露了三个重要的信息:

NOTE

IMPORTANT

第二章:运算符(⭐)

2.1 概述

NOTE

掌握一个运算符,需要关注以下几个方面:

2.2 算术运算符

运算符描述操作数个数组成的表达式的值副作用
+正号1操作数本身
-负号1操作数符号取反
+加号2两个操作数之和
-减号2两个操作数之差
*乘号2两个操作数之积
/除号2两个操作数之商
%取模(取余)2两个操作数相除的余数
++自增1操作数自增前或自增后的值
--自减1操作数自减前或自减后的值

NOTE

自增和自减:

c
#include <stdio.h>
+}

1.7 再谈数据类型

NOTE

这些存储单元中,存储的都是 0 和 1 这样的数据,因为计算机只能识别二进制数。

NOTE

之所以,要给每个存储单元加上内存地址,就是为了加快数据的存取速度,可以类比生活中的字典以及快递单号

c
int num = 10;

NOTE

上述的代码其实透露了三个重要的信息:

NOTE

IMPORTANT

第二章:运算符(⭐)

2.1 概述

NOTE

掌握一个运算符,需要关注以下几个方面:

2.2 算术运算符

运算符描述操作数个数组成的表达式的值副作用
+正号1操作数本身
-负号1操作数符号取反
+加号2两个操作数之和
-减号2两个操作数之差
*乘号2两个操作数之积
/除号2两个操作数之商
%取模(取余)2两个操作数相除的余数
++自增1操作数自增前或自增后的值
--自减1操作数自减前或自减后的值

NOTE

自增和自减:

c
#include <stdio.h>
 
 int main() {
 
@@ -816,7 +816,7 @@
 
     return 0;
 }

2.8 运算符优先级

优先级运算符名称或含义结合方向
1[]数组下标➡️(从左到右)
()圆括号
.成员选择(对象)
->成员选择(指针)
2-负号运算符⬅️(从右到左)
(类型)强制类型转换
++自增运算符
--自减运算符
*取值运算符
&取地址运算符
!逻辑非运算符
~按位取反运算符
sizeof长度运算符
3/➡️(从左到右)
*
%余数(取模)
4+➡️(从左到右)
-
5<<左移➡️(从左到右)
>>右移
6>大于➡️(从左到右)
>=大于等于
<小于
<=小于等于
7==等于➡️(从左到右)
!=不等于
8&按位与➡️(从左到右)
9^按位异或➡️(从左到右)
10|按位或➡️(从左到右)
11&&逻辑与➡️(从左到右)
12||逻辑或➡️(从左到右)
13?:条件运算符⬅️(从右到左)
14=赋值运算符⬅️(从右到左)
/=除后赋值
*=乘后赋值
%=取模后赋值
+=加后赋值
-=减后赋值
<<=左移后赋值
>>=右移后赋值
&=按位与后赋值
^=按位异或后赋值
|=按位或后赋值
15,逗号运算符➡️(从左到右)

WARNING

第三章:附录

3.1 字符集和字符集编码

3.3.1 概述

NOTE

ASCII(美国信息交换标准代码)是最早期和最简单的字符集之一,它只包括了英文字母、数字和一些特殊字符,共 128 个字符。每个字符都分配给了一个从 0 到 127 的数字。

NOTE

ASCII 编码方案定义了如何将 ASCII 字符集中的每个字符表示为 7 位的二进制数字。例如:大写字母'A'在 ASCII 编码中表示为二进制的1000001,十进制的 65

3.3.2 ASCII 编码

NOTE

shell
man ascii

NOTE

3.3.3 Unicode 编码

- + \ No newline at end of file diff --git a/notes/01_c-basic/04_xdx/index.html b/notes/01_c-basic/04_xdx/index.html index 176d2e8..d659fec 100644 --- a/notes/01_c-basic/04_xdx/index.html +++ b/notes/01_c-basic/04_xdx/index.html @@ -774,7 +774,7 @@ return 0; } - + \ No newline at end of file diff --git a/notes/01_c-basic/05_xdx/index.html b/notes/01_c-basic/05_xdx/index.html index 0b4b4ed..16c3f8e 100644 --- a/notes/01_c-basic/05_xdx/index.html +++ b/notes/01_c-basic/05_xdx/index.html @@ -722,7 +722,7 @@ return 0; }

WARNING

在上述示例中,arr&arr 的值是一样的,但是对应的含义是不同的。

- + \ No newline at end of file diff --git a/notes/01_c-basic/06_xdx/index.html b/notes/01_c-basic/06_xdx/index.html index 079192d..983a4a3 100644 --- a/notes/01_c-basic/06_xdx/index.html +++ b/notes/01_c-basic/06_xdx/index.html @@ -103,7 +103,7 @@ printf("Address of array: %p\n", &arr); // 返回整个数组的地址 printf("Address of pointer: %p\n", &ptr); // 返回指针变量ptr的地址

综上所述,通过这些示例和解释,可以看出数组名虽然在某些场合下可以像指针一样使用,但它并不是一个真正的指针变量,而是一个常量,表示数组的首地址。

- + \ No newline at end of file diff --git a/notes/04_linux/01_xdx/index.html b/notes/04_linux/01_xdx/index.html index bbfe1f4..2ea6fec 100644 --- a/notes/04_linux/01_xdx/index.html +++ b/notes/04_linux/01_xdx/index.html @@ -23,7 +23,7 @@
Skip to content

第一章:Linux

1.1 Linux 概述

  • Linux 是一种开源的操作系统,最初由芬兰的林纳斯·托瓦兹(Linus Torvalds)开发。它基于 UNIX 操作系统,并且具有高度的可定制性和灵活性。Linux 操作系统被广泛应用于服务器、嵌入式系统和个人计算机等领域。
  • 它具有稳定性、安全性和可靠性,并且支持多用户、多任务和多线程。Linux 拥有众多的发行版,如:Ubuntu、Red Hat、Debian 等,每个发行版都有自己的特点和优势。
  • 由于其开源性质,Linux 操作系统受到了全球开发者的广泛支持和贡献,成为了计算机行业中的重要组成部分。

1.2 Linux 的发展史

  • Linux 的发展历史可以分为以下几个阶段:

    • ① 初始阶段(1991 - 1994 年):林纳斯·托瓦兹在 1991 年发布了 Linux 内核的第一个版本,并将其开源。在接下来的几年里,Linux 逐渐吸引了一些开发者的关注和参与,开始逐步完善和扩展功能。
    • ② 发展阶段(1995 - 2000 年):在这个阶段,Linux 开始受到更多人的关注和认可。许多开发者和公司开始为 Linux 开发应用程序和驱动程序,为其增加更多的功能和兼容性。同时,一些发行版如:Red Hat、Debian 等也开始出现,为用户提供了更方便的安装和使用方式。
    • ③ 商业化阶段(2001 - 至今):随着 Linux 的成熟和广泛应用,越来越多的公司开始将 Linux 作为服务器和嵌入式设备的操作系统。一些大型科技公司,如:IBM、Oracle 等也开始投入大量资源支持 Linux 的发展。同时,一些商业化的 Linux 发行版,如:SUSE、Ubuntu 等也崭露头角,为企业和个人用户提供了更专业的支持和服务。
    • ④ 社区发展阶段:Linux 的发展一直依赖于全球开发者社区的贡献和支持。Linux 社区不断壮大,吸引了众多的开发者和爱好者参与其中。通过社区的力量,Linux 不断更新迭代,推出了许多新的版本和功能。
  • 总的来说,Linux 的发展历程是一个由个人项目逐渐发展为全球开源社区支持的过程。它的成功得益于开源模式的优势,以及全球开发者的共同努力和贡献。

1.3 Linux 的组成(⭐)

  • Linux 主要由以下几个组成部分构成:

    • Linux 内核:Linux 内核是整个操作系统的核心,负责管理硬件设备、内存管理、进程调度等核心功能。它是由林纳斯·托瓦兹及其他开发者编写和维护的。
    • Shell 解释器:Shell 解释器是用户与操作系统交互的接口,它接收用户输入的命令并将其解释执行。常见的 Shell 解释器有 Bash、Zsh 等,它们提供了命令行界面和脚本编程功能。
    • 外围的应用程序:命令、应用程序、图形化界面……
  • 其图示如下:

image-20240115214505877

  • 上述的组成部分共同构成了一个完整的 Linux 操作系统,为用户提供了丰富的功能和灵活性。

1.4 Linux 发行版本(⭐)

  • Linux 发行版本就是:Linux 内核 + 命令解释器 + 应用程序(桌面)
  • 主流的 Linux 发行版本如下:
Linux 系统类别Linux 系统备注
Debian 系列Debian更新频率较低,较为稳定和安全,可以用于企业生产环境。
Ubuntu桌面美观,使用方便,开发使用。有桌面版和企业版本(服务器版本)。
Redhat 系列RedHat Enterprise Linux(RHEL红帽企业版本
CentOS基于 Red Hat Enterprise Linux(RHEL)源代码构建的免费开源操作系统。它提供了企业级的稳定性和安全性,广泛用于服务器环境。
FedoraFedora 是由 Red Hat 赞助的社区驱动的 Linux 发行版,注重最新的软件和技术。它提供了一个先进的桌面环境和开发者工具。
Rocky Linux用来替代 CentOS 系统的,也是基于 Red Hat Enterprise Linux(RHEL)源代码构建的免费开源操作系统。
Alma Linux用来替代 CentOS 系统的,也是基于 Red Hat Enterprise Linux(RHEL)源代码构建的免费开源操作系统。
其它系列SUSE、OpenSUSEOpenSUSE 是一个用户友好且功能强大的 Linux 发行版,具有稳定性和灵活性。它提供了多种桌面环境和服务器选项。
  • 当然,除了以上几个主流的 Linux 发行版,还有许多其他的发行版,如:Arch Linux、Gentoo、Mageia 等,它们各自有着不同的特点和适用场景。
  • 选择适合自己需求的发行版是根据个人或组织的需求和偏好来决定的。

1.5 Linux 版本选择(⭐)

  • 推荐选择 LTS 版稳定版

WARNING

  • LTS 是 "Long-Term Support" 的缩写,意为长期支持。在软件开发领域,LTS 通常用来描述某个版本或发行版的长期支持周期。
  • 对于 Linux 发行版或其他软件,LTS 版本通常会提供更长时间的支持和维护,以确保稳定性和安全性。这意味着在 LTS 版本的支持周期内,开发者会持续提供安全补丁、错误修复和其他重要更新,以保持系统的稳定性和可靠性。
  • LTS 版本通常适用于企业和组织等需要长期稳定性和可靠性的环境。相比于非 LTS 版本,LTS 版本的更新频率较低,更注重于提供长期支持和维护。
  • 本次选择:
系统版本说明
UbuntuLTS 18.04 、LTS 20.04 等
AlmaLinux9.1、9.2、9.3 等

第二章:工作和学习环境部署(⭐)

2.1 服务器

  • 服务器是一种专门用于提供服务的计算机系统。它通常具有更高的性能、可靠性和稳定性,以满足处理大量请求和提供持续服务的需求。
  • 服务器的主要功能是接收来自客户端的请求,并提供相应的服务或资源。这些服务可以包括:网站托管、数据库管理、文件存储、电子邮件、应用程序运行等。服务器通过网络与客户端进行通信,处理请求并返回相应的数据或结果。
  • 服务器通常采用高性能的硬件配置,如:多核处理器、大容量内存、高速存储设备等,以确保能够处理大量的并发请求。它们还通常具有冗余的设计,包括冗余电源、冗余网络连接和冗余存储等,以提高可靠性和可用性。
  • 服务器可以是物理服务器,即实际的硬件设备,也可以是虚拟服务器,即在物理服务器上通过虚拟化技术创建的虚拟机。无论是物理服务器还是虚拟服务器,它们都扮演着提供服务和资源的角色。
  • 在企业和组织中,服务器通常由专门的 IT 团队进行管理和维护。他们负责服务器的配置、安全性、性能优化、备份和恢复等工作,以确保服务器的稳定运行和数据的安全性。

TIP

实际工作的时候,Linux 系统会运行在服务器上。

2.2 虚拟机概述

  • 虚拟机(Virtual Machine,简称 VM)是一种软件实现的计算机系统,它在物理计算机上模拟出一个完整的计算环境。虚拟机可以在同一台物理计算机上同时运行多个独立的操作系统和应用程序。

2

  • 虚拟机的工作原理是通过虚拟化技术将物理计算机的硬件资源(如:处理器、内存、存储等)进行抽象和分配,为每个虚拟机提供一部分资源。每个虚拟机都被视为一个独立的计算机系统,可以运行自己的操作系统和应用程序。
  • 虚拟机的优势在于它可以提供隔离性灵活性。通过虚拟机,可以在同一台物理计算机上同时运行多个操作系统,实现资源的共享和最大化利用。同时,虚拟机还可以提供快速部署、快速备份和恢复等功能,方便管理和维护。
  • 常见的虚拟机软件,包括:VMware、VirtualBox、KVM 等。它们提供了虚拟化平台和管理工具,使用户可以轻松创建、配置和管理虚拟机。虚拟机广泛应用于开发和测试环境、服务器虚拟化、云计算等领域。

WARNING

虚拟机软件虚拟机的概念不同:

  • 虚拟机软件是用来模拟硬件一个软件,如:VMware 等。
  • ② 而虚拟机是通过虚拟机软件模拟出来的计算机硬件,其实是文件的集合,相当于一台没有安装 Windows 操作系统的裸机
  • ③ 在现实交谈的时候,我们有时候会模糊虚拟机软件虚拟机的概念,甚至会使用虚拟机来代替虚拟机软件;此时,就需要根据上下文环境(语境)来判断到底说的是虚拟机软件还是虚拟机了。

2.3 安装虚拟机软件

2.3.1 前提条件

  • 需要在 BIOS 中开启虚拟化功能。

image-20240117085245337

2.3.2 安装步骤

  • ① 双击打开 VMware 安装程序 。

双击打开VMware安装程序.png

  • ② 进行下一步安装:

VMware进行下一步安装.png

  • ③ 同意许可协议,单击下一步:

VMware同意许可协议,单击下一步.png

  • ④ 根据需要决定是否需要更改软件的安装位置(建议放置于除 C 盘以外任意盘符下):

VMware更改安装位置.png

VMware更改安装位置成功.png

  • ⑤ 更改成功后,单击确定,下一步继续安装:

VMware更改成功后,单击确定,下一步继续安装.png

  • ⑥ 用户体验设置,如下图所示,单击下一步继续安装:

VMware用户体验设置,如下图所示,单击下一步继续安装.png

  • ⑦ 快捷方式设置,单击下一步继续安装:

VMware快捷方式设置,单击下一步继续安装.png

  • ⑧ 单击安装按钮:

VMware单击安装按钮.png

  • ⑨ VMware 输入许可证:

VMware单击许可证.png

VMware输入许可证.png

  • ⑩ 安装结束后,单击完成按钮:

VMware安装结束后,单击完成按钮.png

  • ⑪ 检查虚拟机软件是否安装了虚拟网卡:

查看VMware安装的虚拟网卡.png

查看VMware安装的虚拟网卡1.png

查看VMware安装的虚拟网卡2.png

2.3.2 配置网络

  • ① 打开 VMware 虚拟机软件:

image-20240116202917529

  • ② 编辑 → 虚拟网络编辑器:

image-20240116202955131

  • ③ Vmnet8 → 更改设置:

image-20240116203207282

  • ④ 更改子网 IP 地址为 :192.168.10.0 ,其目的是为了将 IP 固定。

image-20240116203357894

  • ⑤ DHCP 设置:

image-20240116203529749

image-20240116203627959

  • ⑤ 通过 cmd ,输入 ipconfig 命令,查看是否配置成功:

2.4 创建虚拟机

2.4.1 概述

  • 创建虚拟机,本质上就类似购买一台没有安装操作系统的裸机

2.4.2 创建虚拟机

  • ① 文件 → 新建虚拟机:

image-20240117090352182

  • ② 选择自定义类型的配置:

image-20240117090443216

  • ③ 虚拟机硬件兼容性:下一步即可。

image-20240117090529266

  • ④ 选择稍后安装操作系统

image-20240117090636337

  • ⑤ 选择虚拟机将安装的操作系统:

image-20240117090805295

  • ⑥ 设置虚拟机的名称安装位置

image-20240117090944676

WARNING

一个虚拟机一个安装目录(文件夹),防止引起文件的冲突。

  • ⑦ 虚拟机中处理器的配置:下一步即可。

image-20240117091051284

  • ⑧ 设置虚拟机的内存:至少 2048 MB以上。

image-20240117091202131

  • ⑨ 设置虚拟机的网络类型:下一步即可。

image-20240117091257738

  • ⑩ 设置 I/O 控制器类型:下一步即可。

image-20240117091402913

  • ⑪ 选择磁盘类型:下一步即可。

image-20240117091540264

  • ⑫ 选择磁盘:下一步即可。

image-20240117091640870

  • ⑬ 选择磁盘容量:调整为 40 GB。

image-20240117091832846

  • ⑭ 指定磁盘文件:下一步即可。

image-20240117091907233

  • ⑮ 创建虚拟机完毕:

image-20240117092013264

  • ⑯ 查看是否创建虚拟机成功:

image-20240117092101810

2.4.3 虚拟机归类(分类)

  • 实际情况下,我们可能会创建很多虚拟机,VMware 提供了文件夹的功能来管理虚拟机;其步骤如下所示:
  • ① 鼠标右键 → 创建文件夹:

image-20240117092324545

  • ② 修改文件夹的名称:

image-20240117092600931

image-20240117092643086

image-20240117092720769

  • ③ 将刚才创建的虚拟机到该文件夹下:

2.4.4 设置 CD/DVD

  • 以前,我们在一台裸机上安装操作系统的时候,需要通过 DVD 或 U 盘将操作系统的 ISO 镜像文件,安装到裸机上;
  • 同理,在使用虚拟机软件的时候,也需要此类步骤;其步骤如下:
  • ① 编辑虚拟机设置:

image-20240117093143947

  • ② 选择硬盘上的 ISO 镜像文件:

image-20240117093354461

  • ③ 查看是否配置成功:

image-20240117093435976

2.5 安装 Linux

  • 开启此虚拟机

image-20240117093516070

  • 鼠标点击进去之后,通过键盘上的方向键来选择:

image-20240117093610205

  • 注意⚠️:键盘上的方向键在这里

image-20240117093918602

  • ③ 设置操作系统的语言环境为中文

image-20240117094530342

  • ④ 设置系统安装目的地

  • ⑤ 设置软件选择:默认即可

  • ⑥ 设置 root 的密码:123456即可

WARNING

学习阶段无所谓设置什么密码,但是生产环境,必须复杂并且经常更换!!!

  • ⑦ 配置网络和主机名

image-20240224223931266

image-20240224224038036

image-20240224224138061

image-20240224224209724

image-20240224224245924

image-20240224224344051

  • ⑧ 查看配置网络和主机名是否成功:

image-20240224224420273

  • ⑨ 点击开始安装:漫长的等待……

  • ⑩ 安装完成之后,会提示重启系统,那就重启吧:

2.6 远程连接 Linux

2.6.1 查看 Linux 的 IP 地址

  • 通过 ifconfig 命令来查看 Linux 的 IP 地址:
shell
ifconfig

image-20240117101543732

2.6.2 远程连接 Linux

  • 可以通过 xshell 之类的远程连接工具来连接 Linux ,其步骤如下:
  • ① 新建会话:

image-20240117101749340

  • ② 输入 Linux 的 IP 地址:

image-20240117101906927

  • ③ 输入用户名和密码:

image-20240117102005340

  • ④ 接收和保存远程 Linux 的密钥:

image-20240117102123845

  • ⑤ 查看是否登录成功:

image-20240117102159684

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/about/index.html b/notes/about/index.html index 4044d2c..c4b4310 100644 --- a/notes/about/index.html +++ b/notes/about/index.html @@ -23,7 +23,7 @@
Skip to content

后端技术栈

Spring  Spring Boot  MySQL  MariaDB  PostgreSQL  Oracle  Microsoft SQL Server  Redis  MongoDB  RabbitMQ  Solr  ElasticSearch  Logstash  Kibana  Kafka  Consul  Tomcat  JUnit5  Liquibase  Maven  Gradle  Spring Security  Hibernate  JSON  JWT  Java  Python  Android  Go  GraphQL 

前端技术栈

Vue3  TypeScript  Ant Design  Node.js  Vite  Webpack  NPM  Axios  ESLint  jQuery  BootStrap  ECharts  JavaScript  HTML5  CSS3  Tailwind CSS  Less 

DevOps

Git  GitHub  Gitee  gitlab  GitHub Actions  Jenkins  SonarQube  Docker  Harbor  Kubernetes  CentOS  Ubuntu 

运维技术栈

阿里云  Nginx  VMware  Prometheus  Grafana  Ansible  Lua 

测试技术栈

Postman  JMeter 

开发工具

Intellij IDEA  Eclipse  WebStorm  PyCharm  Android Studio  VSCode 

其他

Markdown  WordPress  GitHub Pages  Adobe Photoshop 

Released under the MIT License.

- + \ No newline at end of file diff --git a/notes/index.html b/notes/index.html index af826bb..6c7cfb6 100644 --- a/notes/index.html +++ b/notes/index.html @@ -23,7 +23,7 @@
Skip to content

c/c++ 学科


Released under the MIT License.

- + \ No newline at end of file