From c5e36f9a958e6f045e35f81f32dab3bba24b480b Mon Sep 17 00:00:00 2001 From: Aurorxa Date: Mon, 26 Aug 2024 05:44:16 +0000 Subject: [PATCH] deploy: 704e2d01e963aad0ad10a6cb5afa7b77edab578a --- 404.html | 2 +- assets/14.DL02VQMp.png | Bin 17567 -> 0 bytes assets/14.Oc1zdsE_.svg | 4 ++++ ...otes_01_c-basic_02_xdx_index.md.BlXjkgNo.js} | 4 ++-- ...01_c-basic_02_xdx_index.md.BlXjkgNo.lean.js} | 2 +- hashmap.json | 2 +- index.html | 2 +- notes/01_c-basic/00_xdx/index.html | 2 +- notes/01_c-basic/01_xdx/index.html | 2 +- notes/01_c-basic/02_xdx/index.html | 8 ++++---- notes/01_c-basic/03_xdx/index.html | 2 +- notes/01_c-basic/04_xdx/index.html | 2 +- notes/01_c-basic/05_xdx/index.html | 2 +- notes/01_c-basic/06_xdx/index.html | 2 +- notes/04_linux/01_xdx/index.html | 2 +- notes/about/index.html | 2 +- notes/index.html | 2 +- 17 files changed, 23 insertions(+), 19 deletions(-) delete mode 100644 assets/14.DL02VQMp.png create mode 100644 assets/14.Oc1zdsE_.svg rename assets/{notes_01_c-basic_02_xdx_index.md.CARvBkVf.js => notes_01_c-basic_02_xdx_index.md.BlXjkgNo.js} (99%) rename assets/{notes_01_c-basic_02_xdx_index.md.CARvBkVf.lean.js => notes_01_c-basic_02_xdx_index.md.BlXjkgNo.lean.js} (85%) diff --git a/404.html b/404.html index ae0ce24..d97d976 100644 --- a/404.html +++ b/404.html @@ -20,7 +20,7 @@
- + \ No newline at end of file diff --git a/assets/14.DL02VQMp.png b/assets/14.DL02VQMp.png deleted file mode 100644 index 533be0f5acbba61003accd9d9b87cb410b2d8306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17567 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

dQWa{KH3#NuLas%4n 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 + + +
匹配
%d
匹配
%d
printf(   "我今年
岁,比上一年小
 岁"   ,
age
,
1
);
格式占位符
输出列表
格式化字符串
\ No newline at end of file diff --git a/assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.js b/assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.js similarity index 99% rename from assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.js rename to assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.js index 23e6d44..f25c540 100644 --- a/assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.js +++ b/assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.js @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.hMCIpNYY.js";const l="/c/assets/1.CXNJqOOc.png",e="/c/assets/2.E0LS08Y5.png",t="/c/assets/3.6recRAvz.jpeg",p="/c/assets/4.DcyDw4rB.jpg",h="/c/assets/5.q20QOAIA.png",d="/c/assets/6.CmrWpBzQ.png",k="/c/assets/7.CocAjZjO.png",c="/c/assets/8.CHZSlb-7.png",r="/c/assets/9.RD2M_pYn.png",o="/c/assets/10.CmNKK_Ug.png",u="/c/assets/11.CbGZ55Dj.png",E="/c/assets/12.DpTBR420.png",g="/c/assets/13.XcPl7d9s.png",b="/c/assets/14.DL02VQMp.png",y="/c/assets/15.Dr67r_Ws.png",F="/c/assets/16.C5XiXNVN.png",m="/c/assets/17.DO8XxSV6.jpg",C="/c/assets/18.CUXrdefp.jpeg",v="/c/assets/19.BHR3Faxy.svg",B="/c/assets/20.BPvPBGLi.svg",A="/c/assets/21.96eXHKhR.svg",D="/c/assets/22.DU0JSGBx.svg",_="/c/assets/23.DjDYOeB4.svg",q="/c/assets/24.CSyqvmqg.svg",f="/c/assets/25.uqLiL_yu.png",x="/c/assets/26.CVy9jq-k.svg",P="/c/assets/27.D0s35-Np.svg",T="/c/assets/28.CGctd5l_.svg",N="/c/assets/29.DQIGB6FY.svg",O="/c/assets/30.DBiJDp82.svg",z="/c/assets/31.r0a7UWIb.svg",M="/c/assets/32.-KoNS5D_.svg",w="/c/assets/33.9LAsi3gH.svg",I="/c/assets/34.CbxjdJlI.svg",S="/c/assets/35.DouEaZ2q.svg",U="/c/assets/36.BAASpiz6.svg",R="/c/assets/37.0G4aKrVO.svg",L="/c/assets/38.CSLcq3FJ.svg",j="/c/assets/39.8wVUSUxs.svg",X="/c/assets/40.B8T792CZ.svg",V="/c/assets/41.D7XSVA_S.svg",G="/c/assets/42.BeI_-jpB.svg",J="/c/assets/43.BnCPdx_j.svg",K="/c/assets/44.2VEmYYnq.svg",es=JSON.parse('{"title":"第一章:变量(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/02_xdx/index.md","filePath":"notes/01_c-basic/02_xdx/index.md","lastUpdated":1724640802000}'),Z={name:"notes/01_c-basic/02_xdx/index.md"},H=n('

第一章:变量(⭐)

1.1 程序中变化的数据

  • 在生活中,我们使用最多的不是固定的数据,而是会变化的数据:
    • ① 购物车商品的数量价格等。
    • ② 一首歌播放的时间进度条歌词的展示等。
    • ③ 微信聊天中消息条数时间语音的长度头像名称等。
    • ④ 游戏中技能的冷却时间血量蓝量buff 时间金币的数量等。
    • ……
  • 下图是一个购物车变化数据,即:

  • 那么,在实际开发中,我们就会使用变量保存操作这些变化数据

1.2 变量

  • 变量的定义:变量是程序中不可或缺的组成单位,最基本的存储单元。其实,变量就是一个存储数据的临时空间,可以向其中存储不同类型的数据,如:整数、小数、字符、字符串等,并且变量中的数据在程序运行的时候可以动态改变。

NOTE

  • 变量:用来存储数据容器
  • 数据:可以是一个用来计算的数字,如:上文购物车中的价格等;也可以是一句话中的关键词其它任意格式的数据
  • 变量的特别之处就在于它存放的数据是可以改变的。
  • 我们可以将变量想象为一个容器,盒子中装的就是我们想要的数据,并且我们需要盒子一个特别的名称;通过这个特别的名称,我们可以盒子添加数据移除数据,这个特别的名称就是变量名

NOTE

  • 变量是内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • ② 通过变量名,可以操作这块内存区域,向其中存储数据获取数据以及移除数据
  • ③ 变量的构成包含三个要素:数据类型变量名需要存储的数据
  • ④ 在生活中,我们会经常说:这件衣服的价格是 100(整型) 元,这双鞋子的价格是 250.5(小数,浮点类型) 元,今天天气真好(字符串类型)之类的话;在计算机科学中,这些都是数据,并且它们是有类型,即:数据类型。(数据类型用于定义变量所能存储的数据的种类以及可以对这些数据进行的操作的一种分类,每种数据类型都有特定的属性和用途,它们决定了变量在内存中如何表示和存储,以及变量可以执行哪些操作)

1.3 变量的声明和使用

  • ① 变量必须先声明,后使用。
  • ② 可以先声明变量再赋值,也可以在声明变量的同时进行赋值。
  • ③ 变量的值可以在同一类型范围内不断变化。

IMPORTANT

  • ① 在实际开发中,我们通常都会在声明变量的同时,给其赋值,这被称为初始化。
  • ② 如果不在声明变量的同时,进行初始化,默认情况下,系统会赋予的随机值,我们也称为垃圾值。
  • 示例:先声明,再使用
c
#include <stdio.h>
+import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.hMCIpNYY.js";const l="/c/assets/1.CXNJqOOc.png",e="/c/assets/2.E0LS08Y5.png",t="/c/assets/3.6recRAvz.jpeg",p="/c/assets/4.DcyDw4rB.jpg",h="/c/assets/5.q20QOAIA.png",d="/c/assets/6.CmrWpBzQ.png",k="/c/assets/7.CocAjZjO.png",c="/c/assets/8.CHZSlb-7.png",r="/c/assets/9.RD2M_pYn.png",o="/c/assets/10.CmNKK_Ug.png",u="/c/assets/11.CbGZ55Dj.png",E="/c/assets/12.DpTBR420.png",g="/c/assets/13.XcPl7d9s.png",b="/c/assets/14.Oc1zdsE_.svg",y="/c/assets/15.Dr67r_Ws.png",F="/c/assets/16.C5XiXNVN.png",m="/c/assets/17.DO8XxSV6.jpg",C="/c/assets/18.CUXrdefp.jpeg",v="/c/assets/19.BHR3Faxy.svg",B="/c/assets/20.BPvPBGLi.svg",A="/c/assets/21.96eXHKhR.svg",D="/c/assets/22.DU0JSGBx.svg",_="/c/assets/23.DjDYOeB4.svg",q="/c/assets/24.CSyqvmqg.svg",f="/c/assets/25.uqLiL_yu.png",x="/c/assets/26.CVy9jq-k.svg",P="/c/assets/27.D0s35-Np.svg",T="/c/assets/28.CGctd5l_.svg",N="/c/assets/29.DQIGB6FY.svg",O="/c/assets/30.DBiJDp82.svg",z="/c/assets/31.r0a7UWIb.svg",M="/c/assets/32.-KoNS5D_.svg",w="/c/assets/33.9LAsi3gH.svg",I="/c/assets/34.CbxjdJlI.svg",S="/c/assets/35.DouEaZ2q.svg",U="/c/assets/36.BAASpiz6.svg",R="/c/assets/37.0G4aKrVO.svg",L="/c/assets/38.CSLcq3FJ.svg",j="/c/assets/39.8wVUSUxs.svg",X="/c/assets/40.B8T792CZ.svg",V="/c/assets/41.D7XSVA_S.svg",G="/c/assets/42.BeI_-jpB.svg",J="/c/assets/43.BnCPdx_j.svg",K="/c/assets/44.2VEmYYnq.svg",es=JSON.parse('{"title":"第一章:变量(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/02_xdx/index.md","filePath":"notes/01_c-basic/02_xdx/index.md","lastUpdated":1724651019000}'),Z={name:"notes/01_c-basic/02_xdx/index.md"},H=n('

第一章:变量(⭐)

1.1 程序中变化的数据

  • 在生活中,我们使用最多的不是固定的数据,而是会变化的数据:
    • ① 购物车商品的数量价格等。
    • ② 一首歌播放的时间进度条歌词的展示等。
    • ③ 微信聊天中消息条数时间语音的长度头像名称等。
    • ④ 游戏中技能的冷却时间血量蓝量buff 时间金币的数量等。
    • ……
  • 下图是一个购物车变化数据,即:

  • 那么,在实际开发中,我们就会使用变量保存操作这些变化数据

1.2 变量

  • 变量的定义:变量是程序中不可或缺的组成单位,最基本的存储单元。其实,变量就是一个存储数据的临时空间,可以向其中存储不同类型的数据,如:整数、小数、字符、字符串等,并且变量中的数据在程序运行的时候可以动态改变。

NOTE

  • 变量:用来存储数据容器
  • 数据:可以是一个用来计算的数字,如:上文购物车中的价格等;也可以是一句话中的关键词其它任意格式的数据
  • 变量的特别之处就在于它存放的数据是可以改变的。
  • 我们可以将变量想象为一个容器,盒子中装的就是我们想要的数据,并且我们需要盒子一个特别的名称;通过这个特别的名称,我们可以盒子添加数据移除数据,这个特别的名称就是变量名

NOTE

  • 变量是内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化
  • ② 通过变量名,可以操作这块内存区域,向其中存储数据获取数据以及移除数据
  • ③ 变量的构成包含三个要素:数据类型变量名需要存储的数据
  • ④ 在生活中,我们会经常说:这件衣服的价格是 100(整型) 元,这双鞋子的价格是 250.5(小数,浮点类型) 元,今天天气真好(字符串类型)之类的话;在计算机科学中,这些都是数据,并且它们是有类型,即:数据类型。(数据类型用于定义变量所能存储的数据的种类以及可以对这些数据进行的操作的一种分类,每种数据类型都有特定的属性和用途,它们决定了变量在内存中如何表示和存储,以及变量可以执行哪些操作)

1.3 变量的声明和使用

  • ① 变量必须先声明,后使用。
  • ② 可以先声明变量再赋值,也可以在声明变量的同时进行赋值。
  • ③ 变量的值可以在同一类型范围内不断变化。

IMPORTANT

  • ① 在实际开发中,我们通常都会在声明变量的同时,给其赋值,这被称为初始化。
  • ② 如果不在声明变量的同时,进行初始化,默认情况下,系统会赋予的随机值,我们也称为垃圾值。
  • 示例:先声明,再使用
c
#include <stdio.h>
 
 int main() {
 
@@ -267,4 +267,4 @@ import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.hMCIpNYY.js";const l
     printf("b=%u\\n", num);            // b=4294967286
 
     return 0;
-}
  • 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数的规则来输出,无符号数也可以按照有符号数的规则来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。

IMPORTANT

  • ① 实际开发中,printf 函数中的常量、变量或表达式,需要和格式占位符一一对应;否则,将会出现数据错误的现象。
  • ② 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。但是,很多数据库是使用 C 语言开发的,如:MySQL 等,就提供了创建数据表的字段为无符号类型的功能,即:UNSIGNED(正整数) ,不要感觉困惑!!!
  • ③ 对于 1000 0000 …… 0000 0000 这个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 -2³¹,至于为什么,下节我们会详细分析。
`,305),Q=[H];function Y($,W,ss,is,as,ns){return a(),i("div",null,Q)}const ts=s(Z,[["render",Y]]);export{es as __pageData,ts as default}; +}
  • 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数的规则来输出,无符号数也可以按照有符号数的规则来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。

IMPORTANT

  • ① 实际开发中,printf 函数中的常量、变量或表达式,需要和格式占位符一一对应;否则,将会出现数据错误的现象。
  • ② 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。但是,很多数据库是使用 C 语言开发的,如:MySQL 等,就提供了创建数据表的字段为无符号类型的功能,即:UNSIGNED(正整数) ,不要感觉困惑!!!
  • ③ 对于 1000 0000 …… 0000 0000 这个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 -2³¹,至于为什么,下节我们会详细分析。
`,305),Y=[H];function Q($,W,ss,is,as,ns){return a(),i("div",null,Y)}const ts=s(Z,[["render",Q]]);export{es as __pageData,ts as default}; diff --git a/assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.lean.js b/assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.lean.js similarity index 85% rename from assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.lean.js rename to assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.lean.js index ae2b42f..42fb4fe 100644 --- a/assets/notes_01_c-basic_02_xdx_index.md.CARvBkVf.lean.js +++ b/assets/notes_01_c-basic_02_xdx_index.md.BlXjkgNo.lean.js @@ -1 +1 @@ -import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.hMCIpNYY.js";const l="/c/assets/1.CXNJqOOc.png",e="/c/assets/2.E0LS08Y5.png",t="/c/assets/3.6recRAvz.jpeg",p="/c/assets/4.DcyDw4rB.jpg",h="/c/assets/5.q20QOAIA.png",d="/c/assets/6.CmrWpBzQ.png",k="/c/assets/7.CocAjZjO.png",c="/c/assets/8.CHZSlb-7.png",r="/c/assets/9.RD2M_pYn.png",o="/c/assets/10.CmNKK_Ug.png",u="/c/assets/11.CbGZ55Dj.png",E="/c/assets/12.DpTBR420.png",g="/c/assets/13.XcPl7d9s.png",b="/c/assets/14.DL02VQMp.png",y="/c/assets/15.Dr67r_Ws.png",F="/c/assets/16.C5XiXNVN.png",m="/c/assets/17.DO8XxSV6.jpg",C="/c/assets/18.CUXrdefp.jpeg",v="/c/assets/19.BHR3Faxy.svg",B="/c/assets/20.BPvPBGLi.svg",A="/c/assets/21.96eXHKhR.svg",D="/c/assets/22.DU0JSGBx.svg",_="/c/assets/23.DjDYOeB4.svg",q="/c/assets/24.CSyqvmqg.svg",f="/c/assets/25.uqLiL_yu.png",x="/c/assets/26.CVy9jq-k.svg",P="/c/assets/27.D0s35-Np.svg",T="/c/assets/28.CGctd5l_.svg",N="/c/assets/29.DQIGB6FY.svg",O="/c/assets/30.DBiJDp82.svg",z="/c/assets/31.r0a7UWIb.svg",M="/c/assets/32.-KoNS5D_.svg",w="/c/assets/33.9LAsi3gH.svg",I="/c/assets/34.CbxjdJlI.svg",S="/c/assets/35.DouEaZ2q.svg",U="/c/assets/36.BAASpiz6.svg",R="/c/assets/37.0G4aKrVO.svg",L="/c/assets/38.CSLcq3FJ.svg",j="/c/assets/39.8wVUSUxs.svg",X="/c/assets/40.B8T792CZ.svg",V="/c/assets/41.D7XSVA_S.svg",G="/c/assets/42.BeI_-jpB.svg",J="/c/assets/43.BnCPdx_j.svg",K="/c/assets/44.2VEmYYnq.svg",es=JSON.parse('{"title":"第一章:变量(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/02_xdx/index.md","filePath":"notes/01_c-basic/02_xdx/index.md","lastUpdated":1724640802000}'),Z={name:"notes/01_c-basic/02_xdx/index.md"},H=n("",305),Q=[H];function Y($,W,ss,is,as,ns){return a(),i("div",null,Q)}const ts=s(Z,[["render",Y]]);export{es as __pageData,ts as default}; +import{_ as s,c as i,o as a,a6 as n}from"./chunks/framework.hMCIpNYY.js";const l="/c/assets/1.CXNJqOOc.png",e="/c/assets/2.E0LS08Y5.png",t="/c/assets/3.6recRAvz.jpeg",p="/c/assets/4.DcyDw4rB.jpg",h="/c/assets/5.q20QOAIA.png",d="/c/assets/6.CmrWpBzQ.png",k="/c/assets/7.CocAjZjO.png",c="/c/assets/8.CHZSlb-7.png",r="/c/assets/9.RD2M_pYn.png",o="/c/assets/10.CmNKK_Ug.png",u="/c/assets/11.CbGZ55Dj.png",E="/c/assets/12.DpTBR420.png",g="/c/assets/13.XcPl7d9s.png",b="/c/assets/14.Oc1zdsE_.svg",y="/c/assets/15.Dr67r_Ws.png",F="/c/assets/16.C5XiXNVN.png",m="/c/assets/17.DO8XxSV6.jpg",C="/c/assets/18.CUXrdefp.jpeg",v="/c/assets/19.BHR3Faxy.svg",B="/c/assets/20.BPvPBGLi.svg",A="/c/assets/21.96eXHKhR.svg",D="/c/assets/22.DU0JSGBx.svg",_="/c/assets/23.DjDYOeB4.svg",q="/c/assets/24.CSyqvmqg.svg",f="/c/assets/25.uqLiL_yu.png",x="/c/assets/26.CVy9jq-k.svg",P="/c/assets/27.D0s35-Np.svg",T="/c/assets/28.CGctd5l_.svg",N="/c/assets/29.DQIGB6FY.svg",O="/c/assets/30.DBiJDp82.svg",z="/c/assets/31.r0a7UWIb.svg",M="/c/assets/32.-KoNS5D_.svg",w="/c/assets/33.9LAsi3gH.svg",I="/c/assets/34.CbxjdJlI.svg",S="/c/assets/35.DouEaZ2q.svg",U="/c/assets/36.BAASpiz6.svg",R="/c/assets/37.0G4aKrVO.svg",L="/c/assets/38.CSLcq3FJ.svg",j="/c/assets/39.8wVUSUxs.svg",X="/c/assets/40.B8T792CZ.svg",V="/c/assets/41.D7XSVA_S.svg",G="/c/assets/42.BeI_-jpB.svg",J="/c/assets/43.BnCPdx_j.svg",K="/c/assets/44.2VEmYYnq.svg",es=JSON.parse('{"title":"第一章:变量(⭐)","description":"","frontmatter":{},"headers":[],"relativePath":"notes/01_c-basic/02_xdx/index.md","filePath":"notes/01_c-basic/02_xdx/index.md","lastUpdated":1724651019000}'),Z={name:"notes/01_c-basic/02_xdx/index.md"},H=n("",305),Y=[H];function Q($,W,ss,is,as,ns){return a(),i("div",null,Y)}const ts=s(Z,[["render",Q]]);export{es as __pageData,ts as default}; diff --git a/hashmap.json b/hashmap.json index cdfb7e7..1fbe42a 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"index.md":"Dga0tMF5","notes_01_c-basic_00_xdx_index.md":"BRC7slaL","notes_01_c-basic_01_xdx_index.md":"8ISV4iA7","notes_01_c-basic_02_xdx_index.md":"CARvBkVf","notes_01_c-basic_03_xdx_index.md":"DbyO5lfB","notes_01_c-basic_04_xdx_index.md":"DABEMZSO","notes_01_c-basic_05_xdx_index.md":"CGbN5wss","notes_01_c-basic_06_xdx_index.md":"CIGNaKYV","notes_04_linux_01_xdx_index.md":"C9IatKsj","notes_about_index.md":"DLuQgC_8","notes_index.md":"CeV-uJ5V"} +{"index.md":"Dga0tMF5","notes_01_c-basic_00_xdx_index.md":"BRC7slaL","notes_01_c-basic_01_xdx_index.md":"8ISV4iA7","notes_01_c-basic_02_xdx_index.md":"BlXjkgNo","notes_01_c-basic_03_xdx_index.md":"DbyO5lfB","notes_01_c-basic_04_xdx_index.md":"DABEMZSO","notes_01_c-basic_05_xdx_index.md":"CGbN5wss","notes_01_c-basic_06_xdx_index.md":"CIGNaKYV","notes_04_linux_01_xdx_index.md":"C9IatKsj","notes_about_index.md":"DLuQgC_8","notes_index.md":"CeV-uJ5V"} diff --git a/index.html b/index.html index 7bf876d..330d7f6 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 104fb12..1a0c225 100644 --- a/notes/01_c-basic/00_xdx/index.html +++ b/notes/01_c-basic/00_xdx/index.html @@ -72,7 +72,7 @@ }
  • 编程语言就是用于控制计算机,让其完成我们需要的功能。而我们学习编程语言,其实就是学习这些文字和符号编写的规则。
  • 因为 CPU 只能识别二进制的指令,而我们编写的程序叫做源代码,是人类能看懂;但是,计算机却不能识别。那么,我们就需要让计算机能识别我们编写的源程序,就需要将我们编写的源代码交给编译器程序,其会帮助我们将所编写的源代码转换为计算机能够识别的二进制指令。

NOTE

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

  • 如果我们用 Java 语言编写了程序(源代码),那么编写的程序也是不能直接运行的,需要通过 Java 语言的编译器将 Java 程序编译为计算机能够识别的二进制指令。
  • 如果我们用 Python 语言编写了程序(源代码),那么编写的程序也是不能直接运行的,需要通过 Python 语言的编译器将 Python 程序编译为计算机能够识别的二进制指令。
  • ……

NOTE

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

  • ① 学习该语言的文字和符号编写的规则,即:语法规则
  • ② 需要在操作系统上安装对应编程语言的编译器程序,将源程序编译为计算机能够识别的二进制指令。

2.3 计算机语言简史

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

  • 1946 年 2 月 14 日,世界上第一台计算机 ENIAC 诞生,使用的是最原始的穿透卡片

  • 这种卡片使用的是用二进制代码表示的语言,和人类语言差别极大,这种语言就称为机器语言,如:
txt
0000,0000,000000010000 代表 LOAD A, 16
 0000,0001,000000000001 代表 LOAD B, 1
 0001,0001,000000010000 代表 STORE B, 16
  • 这种语言本质上是计算机能识别的唯一语言,人类很难理解;换言之,当时的程序员 99.9% 都是异类!!!

WARNING

  • ① 不同类型(CPU 架构,如:x86_64、arm 等)的处理器有不同的机器语言指令集,指令集架构(ISA)决定了机器语言的具体形式。
  • ② 换言之,机器语言与特定硬件架构紧密相关,机器语言程序几乎没有可移植性。

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

  • 汇编语言使用助记符(如:MOV、ADD、SUB)代替二进制操作码,使程序更易于人类编写和理解;因此,汇编语言也被称为符号语言

  • 汇编语言的优点是能编写高效率的程序;但是,缺点和机器语言没什么不同,汇编语言同样依赖于具体的计算机架构(面向机器),程序不具备跨平台的可移植性。

WARNING

  • ① 汇编语言,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
  • ② 汇编语言是编程语言的拓荒年代,它非常底层,直接和计算机硬件打交道,开发效率低,学习成本高。

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

  • 高级语言是一种接近于人们使用习惯的程序设计语言。它允许程序员使用接近日常英语的指令来编写程序,程序中的符号和算式也和日常使用的数学公式差不多,接近于自然语言和数学语言,容易被人们掌握。

  • 高级语言独立于计算机硬件,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器解释器转换为机器语言,才能被计算机识别和执行。

NOTE

  • ① 普遍使用的高级编程语言,有:C、C++、Java、Python、C#、JavaScript、Go、SQL 等。
  • ② C 语言是“面向过程”的编程语言,已经脱离了计算机硬件,可以用来设计和开发中等规模的程序。
  • ③ Java、C++、Python、C# 等都是“面向对象”的编程语言(它们在“面向过程”的基础上又增加了很多概念),可以用来设计和开发中大型规模的程序。

IMPORTANT

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

2.3.4 总结

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

IMPORTANT

  • ① 使用机器语言进行编程,对于程序员来说,简直就是噩梦,尤其当功能比较多,程序比较大的时候,不但编写麻烦,需要频繁查询指令手册,而且排查错误非常麻烦,要直接面对一堆二进制数据,想想都令人崩溃(上古程序员,可能真的不是“人”,而是“异类”)。此外,使用二进制指令编程,步骤非常繁琐,要考虑各种边界情况和底层问题,开发效率十分低下。
  • ② 这就倒逼程序员开发出了编程语言,提供自己的生产力,如:汇编语言、C 语言、C++ 语言、Java 语言、Go 语言等等,都是在逐步提高开发效率。至此,编程终于不再是只有极客才能做的事情,不怎么了解计算机的初学者在经过一定时间的训练后也可以编写出有模有样的程序。
  • ③ 在实际开发中,随着计算机科学的发展,现代化的高级编程语言,如:C++ 语言、Java 语言、Go 语言等,因其强大的表达能力、良好的可移植性和易用性,成为了日常软件开发的主流选择。

第三章:初识 C 语言

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

  • 对于绝大多数程序员而言,C 语言是学习编程的第一门语言,很少有不了解 C 语言的程序员。

NOTE

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

  • C 语言除了能让我们了解编程的相关概念,带领我们走进编程的大门,还能让我们明白程序的运行原理,如:

    • ① 计算机的各个部件是如何协同工作的?
    • ② 程序在内存中是一种怎样的状态?
    • ③ 程序在计算机中到底是如何执行的,以及它的生命周期是什么?
    • ④ 操作系统和应用程序之间,又有着怎样的爱恨情仇?
    • ⑤ ...
  • 这些底层知识决定了我们的发展高度,也决定了我们的职业生涯。如果我们希望能在计算机行业中长远的发展,就必须学习这些相关的底层知识。

IMPORTANT

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

  • 数据结构和算法:主要研究数据的组织方式和处理方法,包括:线性表、树、图等数据结构,以及基本的算法思想和分析方法。

  • 计算机组成原理:主要研究计算机系统的硬件组成和工作原理,包括:数字电路、存储器、中央处理器等内容。

  • 操作系统:主要研究计算机系统的软件组成和工作原理,包括:进程/线程/并发(重点)、内存布局和内存管理(重点)、文件系统和磁盘 IO 等内容,以及基本的操作系统概念和设计思路。

  • 计算机网络:主要研究计算机之间的通信原理和协议,包括:网络体系结构(OSI 模型)、传输协议、网络安全等内容,以及基本的网络概念和技术。重点学习 TCP/IP 协议栈、socket 通信(三/四次握手、select、poll、epoll)、HTTPS/HTTP、长链接等内容。

  • 设计模式:是软件设计中常见问题的通用解决方案。不过,在 C 语言中通常是没有的,因为其是面向过程的编程语言,而 C++ 和 Java 等面向对象的编程语言是有设计模式的。

  • 编译原理:主要研究如何将高级编程语言转换为机器语言,有词法分析、语法分析、语义分析、中间代码生成、优化、代码生成等步骤,了解即可。

  • C 语言的概念少,词汇少,只包含了基本的编程元素,相对比较简单。对于初学者来说,学习 C 语言的时间短,成本小。

NOTE

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

3.2 C 语言的由来

  • 1969 年,美国贝尔实验室的肯·汤姆森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)一起开发了 Unix 操作系统。Unix 最初是使用汇编语言编写的,依赖于计算机硬件。为了程序的可读性可移植性,它们决定使用高级语言重写。但是。当时的高级语言无法满足他们的要求,肯·汤姆森就在 BCPL 语言的基础上发明了 B 语言。
  • 1972 年,丹尼斯·里奇(Dennis Ritchie)在 B 语言的基础上重新设计了一种新的语言,这种新语言取代了 B 语言,即 C 语言。

  • 1973 年,整个 Unix 系统都使用 C 语言重写(重构),大大增强了 Unix 在不同硬件平台的可移植性,这标志着 Unix 的初步成熟,也标志着 C 语言的初步成熟(因为 C 语言可以用于大型项目开发了)。

NOTE

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

  • 此后,这种语言快速流传,广泛用于各种操作系统和系统软件的开发,如:Unix、MS-DOS、Microsoft Windows 以及 Linux 等。

  • 1988 年,美国国家标准协会(ANSI)正式将 C 语言标准化,标志着 C 语言开始稳定和规范化。

3.3 为什么要学习 C 语言?

  • C 语言具有可移植好、跨平台的特点:用 C 语言编写的代码可以在不同的操作系统和硬件平台上编译和运行。

NOTE

  • ① C 语言的最原始的设计目的,就是为了将 Unix 操作系统移植到其他的计算机架构上,这使得它从一开始就非常注重可移植性。
  • ② 这边所说的 C 语言的可移植性,是和汇编语言相比的;如果 C 语言和现代化的高级编程语言相比,可移植性还是很差的,如:Java 的口号是“一次编译,到处运行”,Go 的口号是“一次编译,到处执行”。
  • C 语言在许多领域应用广泛
    • 操作系统:C 广泛用于开发操作系统,如:Unix、Linux 和 Windows。
    • 嵌入式系统:C 是一种用于开发嵌入式系统(如:微控制器、微处理器和其它电子设备)的流程语言。
    • 系统软件:C 用于开发设备驱动程序、编译器和汇编器等系统软件。
    • 网络:C 语言广泛用于开发网络应用程序,例如:Web 服务器、网络协议和网络驱动程序。
    • 数据库系统:C 用于开发数据库系统,例如:Oracle、MySQL 和 PostgreSQL 。
    • 游戏:由于 C 能够处理低级硬件交互,因此经常用于开发计算机游戏。
    • 人工智能:C 用于开发人工智能和机器学习的应用程序,例如:神经网络和深度学习算法。
    • 科学应用:C 用于开发科学应用程序,例如:仿真软件和数值分析工具。
    • 金融应用:C 用于开发股票市场分析和交易系统等金融应用。
  • ③ C 语言能够直接对硬件进行操作、管理内存以及和操作系统对话,这使得它是一种非常接近底层的语言,非常适合写需要和硬件交互、有极高性能要求的程序。

NOTE

  • C 语言毕竟诞生的时间非常早(20 世纪 70 年代),属于 70 后了,有点落后于现在的时代,虽然执行效率高(仅次于汇编语言),但是开发效率低。
  • 随着时间的推移,人们在 C 语言的基础上增加了面向对象的机制(软件危机),形成了一门新的编程语言,它的名字是 C++ 。
  • 但是,C++ 的特性实在是太多了(因为 C++ 兼容 C,并增加了很多自己独有的特性,可以是当今最复杂的编程语言,没有之一),于是人们在 C++ 的基础上,删减了一些非必要的特性,就形成了 Java 和 C# ,也可以认为 Java 和 C# 是 C++--。
  • 当然,近年来,Go 语言也很火,它的设计者之一就是 Unix 操作系统的的开发者肯·汤姆森(Ken Thompson),Go 诞生的背景据说是肯·汤姆森(Ken Thompson)在 C++ 委员会在为其演讲 C++ 新特性的时候,觉得 C++ 新特性太多太复杂,于是就开发了 Go 语言;所以,Go 语言中有很多 C 语言的身影。
  • 其实,在 C 语言之后的许多编程语言,或多或少都参考了 C 语言;所以,编程界流传了一句话:汇编生 C ,C 生万物。
  • 学习 C 语言有助于快速上手其他编程语言,如:C++(原先是 C 语言的一个扩展,在 C 语言的基础上嫁接了面向对象编程思想)、C#、Java 等,这些语言都继承或深受 C 语言的影响和启发。
  • ⑤ C 语言长盛不衰。C 语言至今,依然是最广泛使用、最流行的编程语言之一,包括很多大学将 C 语言作为计算机教学的入门语言,拥有庞大而活跃的用户社区,这意味着有许多资源和库可供开发人员使用。
  • ⑥ C 语言容易学习,适合入门。和 Java、C++、Python 等更加现代化的高级编程语言相比,C 语言涉及的概念少,附带的标准库小,整体比较简单,容易学习,非常适合初学者入门。

3.4 计算机语言排行榜

  • TIOBE 是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。

  • 计算机语言走势图:

3.5 C 语言到底能做什么?

3.5.1 概述

  • 我们知道,这个世界上的编程语言太多太多。其中,最流行的编程语言就是 TOBIE 榜单上的前 50 名。

  • 从应用的范围上来讲,编程语言大致可以分为以下两类,如下所示:

    • 通用型编程语言:这些语言设计的目的是能够用于开发多种类型的应用程序,不局限于某个特定领域。它们通常拥有丰富的库和框架支持,可以应用于系统编程、应用开发、Web开发、数据分析等多个领域。
    • 专用型编程语言:这些语言是为了解决特定领域的问题而设计的,通常在该领域中表现出色。虽然它们可以在一定程度上用于其他领域,但其核心设计和优化是针对某个特定应用场景的。
  • 常见的专用型编程语言,如下所示:

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

NOTE

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

3.5.2 C 语言的常见应用领域

  • C 语言的常见应用领域,如下所示:
    • ① 单片机或嵌入式开发:单片机通常是一个集成度较高的微控制器,资源有限,如:家电控制、自动化设备、传感器数据采集、智能玩具、汽车电子。嵌入式系统是一个计算机系统,嵌入在更大设备中,用来执行专门的任务。它通常包含硬件和软件两部分,具有专用性、实时性、资源受限等特点,如:消费电子(智能手机、智能手表等)、医疗设备、工业控制系统、汽车电子系统(ECU、ABS)、物联网设备等。
    • 上位机开发(桌面软件开发):其实,这部分的市场已经被其它编程语言蚕食了,如:C++ 的 QT、GTK,Java 的 Swing 、JavaFx,Dart 的 Flutter ,因为 C 语言太过于底层,本身不直接支持跨平台,而且没有丰富的库和框架支持。
    • ③ 系统组件开发:
      • 基础组件,如:文件系统、进程管理、用户界面(CLI + GUI)等。
      • 核心算法,如:加密/安全算法(MD5、SHA、AES、RSA、SSL)、调度算法(进程和线程调度、内存页面置换)、LZ 压缩算法、CRC 等数据校验算法、随机数生成算法等。
      • 硬件驱动,如:声卡驱动、显卡驱动、网卡驱动、蓝牙驱动、键盘和鼠标驱动、扫描仪驱动、打印机驱动、USB 驱动等。
      • 通信协议,如:TCP/IP 协议族(UDP、DNS、路由选择)、HTTP/HTTPS 、SMTP/POP3/IMAP、FTP、NFC 等。
    • ④ 开发操作系统:这是 C 语言的初衷,它就是为开发操作系统而生的,如:UNIX 内核、Linux 内核以及 Windows 内核,主要就是使用 C 语言开发。
    • ⑤ 开发其它编程语言:
      • 有些编程语言的编译器(解释器)和标准库就使用 C 语言开发,如: Python、PHP、Rust、Perl。
      • 有些编程语言是在 C 语言的基础上进行的扩展,如: C++、Objective-C、Swift。
    • ⑥ 信号处理:C 语言在电气工程领域也有很多用途,它可以使用信号处理算法来管理微处理器、微控制器等集成电路。
    • ⑦ 音视频处理:C 语言的速度非常快,能够快速地对音频和视频数据进行处理。音频和视频数据通常比较大,需要高效的算法和数据结构来处理,而 C 语言运行速度非常快,能够及时处理这些数据。C 语言提供了丰富的底层库和工具,如:FFmpeg、OpenCV 等,这些库和工具可以方便地对音频和视频数据进行编码、解码、剪辑、处理和转换等操作。
    • ⑧ 数据库开发:数据库是软件领域的基础设施,它的性能直接影响整个应用程序的运行效率,所以必须使用一种高效的语言进行开发。使用 C 语言开发的数据库有:MySQL、SQLite、PostgreSQL 等。
    • ⑨ ...

IMPORTANT

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

3.6 不学 C 语言,行吗?

  • C 语言相比于其它的现代化高级编程语言而言,如:Java、Go 等,实在是太老了;如果不打算搞嵌入式开发,即便学了,一时半会也用不上。但是,几乎所有大学的计算机/软件专业都将 C 语言作为必修课,这又是为什么呢?
  • 其实,是因为 C 语言是一门基础语言,很多其它的课程都依赖 C 语言。如果你不了解 C 语言,很多课程你是理解不了的,如下所示:
    • ① 编译原理课程通常是以 C 语言为例进行讲解,因为 C 语言的编译过程相对简单、规范和透明,适合教学。
    • ② 数据结构课程通常也是使用 C 语言进行编程,因为 C 语言比较底层,能够让大家看到数据结构的各种细节。另外,数据结构是一种被频繁调用的组件,必须要追求效率,C 语言再合适不过了。
    • ③ 学习操作系统原理(内存、进程、线程、通信等)也要具备 C 语言基础,否则是学不明白的。
    • ...
  • C 语言是一门面向计算机的语言,它能帮助我们快速了解底层;而其它的高级语言(Python、Java、C# 等)是面向用户的,它能让我们快速上手,搞出点实用的工具来,比如:桌面软件、网站、APP 等。

NOTE

  • ① 借助 C 语言学习原理,相当于修炼内功;使用其它语言开发程序,相当于精通招式。
  • ② 一个既有扎实“内功”又精通“招式”的程序员,无疑能够更好地应对各种编程挑战。
  • 从整体上讲,计算机软件大概可以分为两种:
    • 一种是基础设施,如:操作系统、数据库、浏览器、云计算系统、大数据系统、编译器/编程语言、通信协议、区块链、标准库/运行库、算法实现等。
    • 一种是应用软件,如:桌面软件、APP、网站、小程序等。

IMPORTANT

  • ① 内功不扎实的话,开发一般的应用软件可能没什么问题。但是,如果想要开发高性能的软件,或者开发基础设施,那是绝对是不行的。
  • ② 万丈高楼平地起,勿在浮沙筑高台!!!

3.7 C 语言的版本选择

3.7.1 概述

  • C 语言是在 B 语言的基础上改进而来的,目的是为了更好地开发 Unix 操作系统。到了 1973 年,Unix 的大部分功能都被 C 语言重写,这标志着 C 语言的初步成熟,因为它可以用于大型项目了。
  • 后来,C 语言被多次改进,越来越强大,为了规范 C 语言的特性和功能,人们发布了多个 C 语言标准。

3.7.2 版本 1(K&R C)

  • K&R C 指的是 C 语言的原始版本。1978 年,C 语言的发明者布莱恩·柯林(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)合写了一本著名的教材《C 编程语言》(The C programming language)。

NOTE

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

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

  • 到了 80 年代,C 语言越来越流行,广泛被业界使用,从大型主机到小型微机,各个厂商群雄并起,推出了多款 C 语言的编译器。这些编译器根据行业和厂商自己的需求,进行了各种扩展,C 语言进入了春秋战国时代,逐渐演变成一个松散杂乱的大家族。
  • 为统一 C 语言版本,1989 年,美国国家标准协会(ANSI)制定了一套 C 语言标准,并于次年被国际标准化组织(ISO)通过。它被称为 “ANSI C”,也可以按照发布年份,称为 “C89 或 C90”。

NOTE

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

3.7.4 版本 3(C99)

  • C 语言标准的第一次大型修订,发生在 1999 年,增加了许多语言特性,如:双斜杠( // )的注释语法,可变长度数组、灵活的数组成员、复数、内联函数和指定的初始值设定项,这个版本称为 C99,是目前最流行的 C 版本

NOTE

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

  • 当 GCC 和其它一些商业编译器支持 C99 的大部分特性的时候。
  • 微软和 Borland 却似乎对此不感兴趣,或者说没有足够的资源和动力来改进编译器。

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

3.7.5 版本 4(C11)

  • 2011 年,标准化组织再一次对 C 语言进行修订,增加了_Generic、static_assert 和原子类型限定符,这个版本称为 C11。

NOTE

  • ① 需要强调的是,修订标准的原因并不是因为原标准不能用,而是需要跟进新的技术。
  • ② 支持此标准的主流 C 语言编译器有 GCC、LLVM Clang、Intel C++ Compile 等。

3.7.6 版本 5(C17)

  • C11 标准在 2017 年进行了修补,但发布是在 2018 年。新版本只是解决了 C11 的一些缺陷,没有引入任何新功能,这个版本称为 C17。

3.7.7 版本 6(C23)

  • 2023 年发布,计划进一步增强安全性,消除实现定义的行为,引入模块化语言概念等新特性,使 C 语言在安全和可靠性方面有重大提高。

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

4.1 如何学习 C 语言?

  • 对于大部分的初学者, 学习 C 语言的目的可能是为了成为一名合格的程序员,开发出优秀的软件。但是,在学习了 C 语言的基本语法后,却发现只能在控制台黑底白字)上玩玩,没有漂亮的用户界面以及人性化的交互。于是,开始学习数据结构、算法、数据库、操作系统,越陷越深,越来越迷茫,不知道学习 C 语言能做什么,认为学习编程很难,开始怀疑自己,直到放弃!!!
  • 其实,C 语言本身就是一门非常简单的语言,提供的实用功能不多,大部分的时候需要借助操作系统、第三方库以及以及一些硬件,如:单片机等,才能发挥它的威力!!!

IMPORTANT

  • ① 学习 C 语言仅仅是让你踏上程序员之路的第一步而已,只学习 C 语言也做不了什么。
  • ② 系统、扎实的学习 C 语言可以让你了解底层硬件、一些简单的数据结构和算法,并培养计算机思维。
  • 前文,我们提过:C 语言是一门通用性的语言,并没有针对某个领域进行优化。并且,在实际项目中,C 语言主要用于比较底层的开发,例如:
    • Windows、Linux、Unix 等操作系统的内核 90% 以上都使用 C 语言开发(Rust 语言有望未来,在操作系统开发中占据一席之地,特别是在对安全性和性能要求极高的领域)。
    • 开发硬件驱动,让硬件和操作系统连接起来,这样用户才能更有效的使用硬件。
    • 单片机和嵌入式属于软硬件的结合,是使用 C 语言最多的地方。
    • 开发系统组件或服务,用于支撑上层应用。
    • 如果对软件某个模块,例如:算法和搜索部分的效率要求较高,也可以使用 C 语言来开发。
    • ……
  • 貌似感觉 C 语言的应用还是很多的啊,那为什么感觉学习 C 语言还是做不了什么?原因除了 C 语言通常都是开发最底层的应用之外,最重要的一点就是生态

IMPORTANT

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

  • ① 很多编程语言都自带标准库(语言本身提供的,开箱即用),如:Java、Go 等。
  • ② 很多编程语言都有自己的包管理器(用于管理第三方库)解决方案,如:Java 中的 Maven、Gradle、Go 中的 go modules ,JavaScript 的 npm 等。

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

IMPORTANT

  • ① 换言之,在实际工作中,C 语言几乎是不用做软件、网站、APP 等这些应用层开发,其它的编程语言能够更好地完成任务,没必要非得使用 C 语言,C 语言基本都是用来做底层开发,也就是看不见摸不着的、在后台默默提供服务的那些项目,而这样的项目对初学者来说基本没有实用价值,初学者也不知道它们该怎么使用。

  • ② 初学者想要的 C 语言没有,C 语言能做的初学者用不到,就是这种矛盾,导致初学者非常迷茫。

  • ③ 有人可能会问,C 语言不是还可以用来开发单片机或者嵌入式吗?是的没错,但是这个方向是软硬件结合的,不是在我们的电脑上进行开发,而是在特殊的板子上进行开发,并且还需要学习数字电路、模拟电路、8051/ARM、RTOS、嵌入式 Linux 等方面的知识,只学 C 语言也没有用武之地。

  • ④ 如果你觉得学了 C 语言没用,那么恭喜你,你是对的,应用层的开发一般真的用不上它。

  • ⑤ 但是,没用也要学,学习 C 语言并不一定是要应用它,C 语言可以夯实你的编程基础,尤其是数据结构、算法、内存、线程、进程、通信、操作系统、编译原理等底层的计算机知识,没有 C 语言基础是学不好的。

  • ⑥ 这些底层知识并不一定能够直接应用在实际开发中,但是它们会让你有底气,会让你透彻地理解编程概念,会让你站的“低”看得远,会让你避免很多低级错误,会让你心中有“架构师”的思维。

IMPORTANT

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

NOTE

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

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

4.2.1 概述

  • 项目构建工具包管理器在软件开发中扮演着不同的角色,它们虽然有时会有重叠的功能,但主要关注的点是不同的。

4.2.2 项目构建工具

  • 项目构建工具是用于自动化编译、测试、打包、部署等一系列任务的软件工具。它们帮助开发者简化和管理整个软件开发生命周期中的各个步骤,尤其是在构建过程中的复杂性管理上。
  • 其功能有:
    • 编译代码:自动编译源代码(如 :.java.c 等)为可执行文件或中间文件(如:.class 文件)。
    • 运行测试:集成单元测试、集成测试,自动运行测试用例并生成报告。
    • 打包:将编译后的代码、依赖库、资源文件等打包成可分发的格式(如:JAR、WAR、可执行文件等)。
    • 依赖管理:自动下载、更新和管理项目所需的第三方库(这部分功能有时与包管理器重叠)。
    • 部署:将打包后的应用程序自动部署到测试环境、生产环境等。
    • 任务自动化:除了基本的构建流程外,还可以自动化执行一些常见任务,如:代码检查、文档生成等。
  • 常用的项目构建工具:
    • Maven(Java):一个流行的构建工具和依赖管理工具,广泛用于 Java 项目。
    • Gradle(Java、Kotlin、Groovy):一个灵活的构建工具,支持声明式的构建脚本和多种语言。
    • Make(C/C++):一个经典的构建工具,使用 Makefile 来定义构建规则和依赖关系。
    • CMake(C/C++):一个跨平台的构建系统,帮助生成标准的构建文件,如:Makefile 或 Visual Studio 项目文件。
    • ……

4.2.3 包管理器

  • 包管理器是用于自动化安装、更新、配置管理软件包及其依赖关系的工具。它主要关注于获取和管理项目所需的第三方库或工具包,并确保它们正确地集成到项目中。
  • 其功能有:
    • 依赖管理:根据项目配置文件(如:package.jsonrequirements.txt)自动下载和安装项目所需的依赖包。
    • 版本控制:管理包的版本,允许开发者指定某个特定版本或版本范围,确保项目中的库版本一致性。
    • 包的发布和共享:开发者可以通过包管理器发布自己的库,并且共享给社区或组织内部的其他项目使用。
    • 环境隔离:有些包管理器提供虚拟环境功能,可以将不同项目的依赖隔离开,避免版本冲突。
    • 更新和卸载:包管理器可以自动更新依赖包到最新的兼容版本或卸载不再需要的包。
  • 常见的包管理器:
    • npm(Node.js):用于管理 JavaScript 和 Node.js 项目的包和模块。
    • pip(Python):用于安装和管理 Python 的软件包。
    • Cargo(Rust):Rust 编程语言的包管理器和构建工具。
    • Yarn(JavaScript):是 npm 的替代品,提供更快和更可靠的包管理体验。
    • Homebrew(macOS):用于 macOS 系统下的命令行工具和库的管理。
    • ……

4.2.3 注意事项

  • 对于 Java 项目中的 MavenGradle 而言,其不仅是项目构建工具也是包管理工具

NOTE

  • ① Gradle 也支持原生项目的开发,如:C 和 C++ 。
  • ② 不过,目前而言,业界开发 C/C++ 项目时,使用最多的项目构建工具和包管理器是 Cmake 和 Conan 。

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

  • C 语言是一门“古老”的语言了,它只支持面向过程编程,不支持面向对象编程和泛型编程,在中大型的应用层项目开发中,C 语言已经显得捉襟见肘了,C++、Java、Python、C#、JavaScript 等其他编程语言能够更好地胜任,为 C 语言开发应用层的库简直是费力不讨好,所以几乎没人这么做。
  • GTK 算是一个应用层的库,它使用 C 语言开发,但是为了适应市场,GTK 也提供了其它编程语言的接口,如:C++、Python 等。
  • 先不用管面向过程、面向对象、泛型这些晦涩的编程概念;简单地理解就是,C 语言支持的特性少,用起来费劲,开发效率低,而 C++、Java、Python、C#、JavaScript 等支持的特性多,用起来方便,开发效率高。
  • C 语言的优势是运行效率极高,这正是底层开发所看重的。底层开发有时候就是一个模块,或者是一个服务,规模不算大,但是对效率有严格的要求,此时用 C 语言就非常合适,所以针对底层开发的 C 语言库较多,因为它们有非常大的实用价值。

第五章:附录

5.1 嵌入式领域中的 C 语言

5.1.1 概述

  • C 语言在 C51、STM32 和 ARM 平台上的应用场景非常广泛,涵盖了各种嵌入式系统的开发需求。

5.1.2 C51(8051 系列微控制器)

  • 背景:8051 是由 Intel 于 1980 年设计的一种 8 位微控制器架构。它具有指令集简单、结构紧凑的特点,广泛应用于低端嵌入式系统中。
  • 开发工具:C51 是指针对 8051 系列微控制器的 C 语言编译器,如:Keil C51。这种编译器将 C 语言代码编译为适合 8051 架构的汇编代码。
  • C 语言的作用:C 语言在 8051 微控制器上的应用使得开发更加高效和可维护。尽管 8051 的硬件资源有限,但 C 语言仍然能够在不损失性能的前提下提供高级编程的便利。
  • 应用场景
    • 简单的控制系统:家用电器(微波炉、洗衣机、空调)的控制板等。这些设备通常不需要复杂的运算能力,但要求可靠和稳定的控制。
    • 低功耗传感器接口:C51 微控制器常用于低功耗传感器的数据采集和传输,如:温度、湿度、压力传感器。
    • 工业自动化设备:用于简单的工业自动化控制,如:小型电机驱动、工业传感器数据处理和传输。
    • 电子玩具:许多简单的电子玩具使用 8051 系列微控制器来控制声音、LED 灯光、显示屏等。

NOTE

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

5.1.3 STM32(STM32 系列微控制器)

  • 背景:STM32 是意法半导体(STMicroelectronics)推出的一系列基于 ARM Cortex-M 内核的 32 位微控制器。它们广泛用于需要高性能和低功耗的嵌入式应用中,如:工业控制、消费电子和物联网设备。
  • 开发工具:开发 STM32 微控制器通常使用 Keil、IAR Embedded Workbench 或 STM32CubeIDE 等开发环境。这些环境中使用的编程语言主要是 C(有时也包括 C++)。
  • C 语言的作用:C 语言在 STM32 上的应用非常广泛,开发者可以利用它直接控制硬件寄存器,同时也能方便地使用 STM32 提供的 HAL(硬件抽象层)库或 LL(低层)库进行开发。C 语言在这个平台上不仅能实现底层控制,还能编写复杂的应用逻辑。
  • 应用场景
    • 物联网(IoT)设备:STM32 微控制器常用于各种物联网设备,如:智能家居控制系统、环境监测设备、可穿戴设备等。这些设备通常需要低功耗和强大的处理能力,并且需要支持多种通信协议,如:Wi-Fi、Bluetooth、LoRa。
    • 消费电子:智能手表、健身追踪器、电子书阅读器、无人机等,这些设备需要具备实时处理能力、低功耗和良好的外设支持。
    • 医疗设备:STM32 微控制器被广泛应用于便携式医疗设备中,如:血糖监测仪、心率监测器、便携式超声设备等,这些设备需要精确的传感器数据采集和处理。
    • 工业自动化控制:PLC(可编程逻辑控制器)、工业机器人、伺服电机控制等,STM32 能够处理复杂的控制算法和实时任务。
    • 汽车电子:用于汽车中的传感器管理、车载信息娱乐系统、车身控制系统(车窗、电动座椅调节等)。

NOTE

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

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

  • 背景:ARM 是一种广泛使用的处理器架构,特别是在嵌入式系统中,ARM Cortex 系列处理器(如 Cortex-M、Cortex-R 和 Cortex-A)非常流行。Cortex-M 系列主要用于微控制器,Cortex-R 用于实时系统,Cortex-A 则用于高性能嵌入式系统。
  • 开发工具:针对 ARM 架构的开发,常用工具包括 ARM Keil MDK、IAR、GCC for ARM 和 ARM Development Studio。这些工具均支持使用 C 语言进行开发。
  • C 语言的作用:C 语言在 ARM 架构上的应用广泛。它被用于操作系统内核(如 FreeRTOS、Zephyr)、设备驱动、应用层逻辑等。在 ARM Cortex-M 和 Cortex-R 系列中,C 语言的高效性和低级别硬件访问能力是开发实时、低延迟系统的关键。
  • 应用场景
    • 高级嵌入式操作系统:ARM Cortex-A 系列处理器广泛用于运行 Linux、Android 等操作系统的嵌入式设备,如:智能手机、平板电脑、智能电视和车载娱乐系统。
    • 实时系统:ARM Cortex-R 系列处理器用于实时系统,如:汽车的 ABS(防抱死制动系统)、ESC(电子稳定控制系统),以及航空电子设备,这些系统要求极低的延迟和高可靠性。
    • 高性能物联网网关:Cortex-A 系列处理器可以用来开发支持多协议、多设备管理的物联网网关,这些网关通常需要强大的计算能力和多线程处理能力。
    • 边缘计算设备:在边缘计算场景中,ARM Cortex-A 处理器用于执行本地数据处理和决策,如:视频分析、图像处理、语音识别等。
    • 智能家居设备:ARM Cortex-M 系列微控制器广泛应用于智能家居产品,如:智能灯泡、智能音箱、家庭安全系统,这些设备需要高效的处理能力和低功耗。
    • 机器人控制系统:ARM Cortex-M 和 Cortex-A 系列处理器用于机器人系统的控制和通信,如:无人机、工业机器人、服务机器人等,处理复杂的运动控制、路径规划和传感器数据融合。

NOTE

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

5.2 C 和 C++ 的关系

  • 起源和发展:
    • C 语言:C 语言由丹尼斯·里奇(Dennis Ritchie)在 1972 年开发,最初用于开发操作系统,特别是 UNIX。它是一种结构化的编程语言,提供了对硬件的低级访问,且效率高,因此在系统编程中广泛使用。
    • C++ 语言:C++ 由比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)在 20 世纪 80 年代初开发,作为 C 语言的扩展。它引入了面向对象编程的概念,同时保留了 C 语言的高效性和底层操作能力。C++ 最初被称为 “C with Classes”(带类的 C),后来发展成一种独立的编程语言。
  • 兼容型:
    • 语法兼容:C++ 几乎完全兼容 C 语言的语法,这意味着大多数 C 代码可以在 C++ 编译器下直接编译运行。C++ 可以看作是 C 语言的超集(虽然不完全是 100% 兼容,但差异较少)。
    • 扩展性:C++ 在 C 的基础上增加了许多新特性,如:类和对象、继承、多态、模板和异常处理等。这使得 C++ 不仅适合系统编程,还可以用于开发复杂的应用程序。
  • 编程范式:
    • C 语言:主要是面向过程编程,强调的是函数调用和控制结构。
    • C++ 语言:支持多种编程范式,包括:面向过程、面向对象和泛型编程,使得开发者可以更灵活地选择适合的编程风格。
  • 性能与应用:
    • 性能:由于 C++ 包含了更多的高级特性,它的编译时间和运行时开销可能比 C 稍高。但得益于其优化机制,C++ 仍然可以实现与 C 语言相近的性能。
    • 应用场景:C 语言仍然在嵌入式系统、驱动程序开发和其他对性能要求极高的场合中占据重要地位。而 C++ 则被广泛用于游戏开发、图形处理、大型软件系统等需要复杂结构和抽象的领域。

NOTE

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

Released under the MIT License.

- + \ 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 c374040..2612a28 100644 --- a/notes/01_c-basic/01_xdx/index.html +++ b/notes/01_c-basic/01_xdx/index.html @@ -315,7 +315,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

  • 编译 perf 工具:
shell
cd tools/perf
shell
make clean && make

  • 复制到 PATH 变量所指向的路径中:
shell
cp perf /usr/bin/

8.4.3 整合

  • CLion 中配置 perf 的路径:

  • 在 CLion 中通过 perf 运行代码:

8.5 Win 中文乱码问题

  • 前文,我们提及到,在 Win 中,如果出现中文乱码问题,就需要去语言和区别设置系统区域的编码为 UTF-8 ;但是,这样可能会造成其它的软件出现中文乱码问题,如:Xshell 等。

NOTE

  • ① 之所以,修改系统的编码为 UTF-8 会出现问题,是因为早期的 Win 系统的中文默认编码是 GBK(目前也是,Win 并没有强制第三方软件使用 UTF-8 编码) ,而 Xshell 等也使用的这些编码,一旦我们修改为 UTF-8 之后,可能会造成这些第三方软件出现中文乱码问题(第三方软件适配问题,相信将来应该都会切换为 UTF-8 编码),体验较差!!!
  • ② 在 Linux 或 MacOS 之所以不会出现中文乱码的问题,是因为这些系统默认的编码就是 UTF-8 。
  • 其实,还有一种解决方案,如下所示:

  • 测试一下,是否配置成功:

8.6 CLion 中自动导入头文件

  • 在 CLion 中,最为强大的功能就是直接输入函数,然后让 IDE 帮我们自动导入头文件,包括自定义的头文件,相当实用。

NOTE

  • ① CLion 中的自动导入头文件快捷键Alt + Enter
  • ② CLion 中的自动提取变量的类型快捷键Ctrl + Alt + V

  • 开启自动导入头文件的步骤,如下所示:

Released under the MIT License.

- + \ 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 d797c3f..d320c05 100644 --- a/notes/01_c-basic/02_xdx/index.html +++ b/notes/01_c-basic/02_xdx/index.html @@ -12,7 +12,7 @@ - + @@ -68,7 +68,7 @@ // = 10 将 10 存储到 num 所代表的 4 个字节的存储空间中 int num = 10;

1.7 变量的重要操作

1.7.1 变量的输出

  • 在计算机中,所谓的输入输出都是以计算机(CPU 和内存)为主体而言的,即:

NOTE

  • ① 输入:从输入设备(键盘、鼠标、扫描仪)向计算机输入数据。

  • ② 输出:从计算机向外部输出设备(显示器、打印机)输出数据。

  • 在 C 语言中,提供了 printf() 函数用于输出信息,其函数声明是:
c
int printf (const char *__format, ...) {
     ...
-}
  • printf 的标准含义是格式化输出文本,来源于 print formatted(格式化打印)的缩写,其语法规则,如下所示:

NOTE

  • ① 格式化字符串:是使用双引号括起来的字符串,里面包含了普通的字符串和格式占位符。
  • ② 格式占位符(格式声明符):由 %格式字符组成,作用是将输出的数据转换为指定的格式后输出,这里的 %d 表示整数。
  • ③ 输出列表:是程序要输出的一些数据,可以是常量、变量或表达式,需要和格式占位符一一对应。
  • 在计算机中,二进制、八进制、十进制以及十六进制的英文名称和缩写,如下所示:

    • 二进制(binary),缩写是 bin。
    • 八进制(octal),缩写是 oct。
    • 十进制(decimal),缩写是 dec。
    • 十六进制(Hexadecimal),缩写是 hex。
  • 其实,我们也可以在 Windows 系统中的计算器中来看到,即:

IMPORTANT

  • ① 在生活中的 decimal 是小数的意思。
  • ② 但是,在计算机中,decimal 的完整含义是 decimal integer ,即十进制整数。
  • 示例:
c
#include <stdio.h>
+}
  • printf 的标准含义是格式化输出文本,来源于 print formatted(格式化打印)的缩写,其语法规则,如下所示:

NOTE

  • ① 格式化字符串:是使用双引号括起来的字符串,里面包含了普通的字符串和格式占位符。
  • ② 格式占位符(格式声明符):由 %格式字符组成,作用是将输出的数据转换为指定的格式后输出,这里的 %d 表示整数。
  • ③ 输出列表:是程序要输出的一些数据,可以是常量、变量或表达式,需要和格式占位符一一对应。
  • 在计算机中,二进制、八进制、十进制以及十六进制的英文名称和缩写,如下所示:

    • 二进制(binary),缩写是 bin。
    • 八进制(octal),缩写是 oct。
    • 十进制(decimal),缩写是 dec。
    • 十六进制(Hexadecimal),缩写是 hex。
  • 其实,我们也可以在 Windows 系统中的计算器中来看到,即:

IMPORTANT

  • ① 在生活中的 decimal 是小数的意思。
  • ② 但是,在计算机中,decimal 的完整含义是 decimal integer ,即十进制整数。
  • 示例:
c
#include <stdio.h>
 
 int main() {
 
@@ -291,8 +291,8 @@
     printf("b=%u\n", num);            // b=4294967286
 
     return 0;
-}
  • 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数的规则来输出,无符号数也可以按照有符号数的规则来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。

IMPORTANT

  • ① 实际开发中,printf 函数中的常量、变量或表达式,需要和格式占位符一一对应;否则,将会出现数据错误的现象。
  • ② 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。但是,很多数据库是使用 C 语言开发的,如:MySQL 等,就提供了创建数据表的字段为无符号类型的功能,即:UNSIGNED(正整数) ,不要感觉困惑!!!
  • ③ 对于 1000 0000 …… 0000 0000 这个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 -2³¹,至于为什么,下节我们会详细分析。

Released under the MIT License.

- +}
  • 其实,C 语言的底层逻辑很简单,C 语言压根不关心你定义的是有符号数还是无符号数,它只关心内存(如果定义的是有符号数,那就按照有符号数的规则来存储;如果定义的是无符号数,那就按照无符号数的规则来存储)。换言之,有符号数可以按照无符号数的规则来输出,无符号数也可以按照有符号数的规则来输出,至于输出结果对不对,那是程序员的事情,和 C 语言没有任何关系。

IMPORTANT

  • ① 实际开发中,printf 函数中的常量、变量或表达式,需要和格式占位符一一对应;否则,将会出现数据错误的现象。
  • ② 正因为上述的原因,很多现代化的编程语言,如:Java 等,直接取消了无符号的概念。但是,很多数据库是使用 C 语言开发的,如:MySQL 等,就提供了创建数据表的字段为无符号类型的功能,即:UNSIGNED(正整数) ,不要感觉困惑!!!
  • ③ 对于 1000 0000 …… 0000 0000 这个特殊的补码,无法按照上述的方法转换为原码,所以计算机直接规定这个补码对应的值就是 -2³¹,至于为什么,下节我们会详细分析。

Released under the MIT License.

+ \ 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 a0cdf3c..b7b5722 100644 --- a/notes/01_c-basic/03_xdx/index.html +++ b/notes/01_c-basic/03_xdx/index.html @@ -841,7 +841,7 @@ 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 字符编码之间的关系,如下所示:

Released under the MIT License.

- + \ 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 918afaf..f9f2137 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; }

Released under the MIT License.

- + \ 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 454bc7e..9347353 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 的值是一样的,但是对应的含义是不同的。

  • arr 是数组名,在大多数情况下会转换为数组第一个元素的地址,即:arr 等价于 &arr[0],其数据类型是 int *
  • &arr是数组名的地址,即整个数组的地址,它指向数组本身,并不是数组第一个元素的地址,&arr 的数据类型是 int(*)[3]

Released under the MIT License.

- + \ 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 64ac3e5..17528a2 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的地址

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

Released under the MIT License.

- + \ 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 7a7c5fc..08eda6c 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 52d1150..07d38ab 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 440a1c6..d73b52e 100644 --- a/notes/index.html +++ b/notes/index.html @@ -23,7 +23,7 @@ - + \ No newline at end of file