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 533be0f..0000000 Binary files a/assets/14.DL02VQMp.png and /dev/null differ diff --git a/assets/14.Oc1zdsE_.svg b/assets/14.Oc1zdsE_.svg new file mode 100644 index 0000000..7c21eef --- /dev/null +++ b/assets/14.Oc1zdsE_.svg @@ -0,0 +1,4 @@ + + + +
匹配
%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 程序中变化的数据

1.2 变量

NOTE

NOTE

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}; +}

IMPORTANT

`,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 @@ }

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 语言的第三方库也不是很多(和其它现代化高级编程语言相比,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 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

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 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 变量的输出

NOTE

c
int printf (const char *__format, ...) {
     ...
-}

NOTE

IMPORTANT

c
#include <stdio.h>
+}

NOTE

IMPORTANT

c
#include <stdio.h>
 
 int main() {
 
@@ -291,8 +291,8 @@
     printf("b=%u\n", num);            // b=4294967286
 
     return 0;
-}

IMPORTANT

- +}

IMPORTANT

+ \ 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 运算符优先级

优先级运算符名称或含义结合方向
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 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; } - + \ 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 的值是一样的,但是对应的含义是不同的。

- + \ 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的地址

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

- + \ 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 @@
Skip to content

c/c++ 学科


Released under the MIT License.

- + \ No newline at end of file