Skip to content

Commit c2ba8c1

Browse files
committed
Optimize Article
1 parent e29c753 commit c2ba8c1

File tree

3 files changed

+82
-44
lines changed

3 files changed

+82
-44
lines changed

source/Language Core/Chapter-1/Section-03.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Hello World!
5252

5353
第二行: 一行没有任何内容的空行,它对代码没有任何影响编译器会忽略空行。旨在提升代码的美观和可读性。
5454

55-
第三行: [`int`](../Chapter-2/Section-02.md#整数型) 它是 C++ 中用于表达整数的数据类型,在上方代码中和 main()组成了一个函数,int 代表了这个程序入口函数的返回值的类型。main() 函数它是程序的入口函数,操作系统通过调⽤这个函数来启动程序。程序当中的所有代码全部都从这里开始执行没有例外。作为程序的入口函数在每个程序当中都必须有且仅有一个,如果一个 C++ 程序出现了两个及两个以上的入口函数则程序会无法编译。需要注意的是 main() 函数可以没有返回值(当返回值类型声明为 void 时),但在现代开发的⼤多数情况下它会返回⼀个整数值给操作系统,通常⽤来表⽰程序的退出状态。0 通常表⽰程序是正常关闭的,⾮零值表⽰有错误或异常情况。
55+
第三行: `int` 它是 C++ 中用于表达整数的数据类型,在上方代码中和 main()组成了一个函数,int 代表了这个程序入口函数的返回值的类型。main() 函数它是程序的入口函数,操作系统通过调⽤这个函数来启动程序。程序当中的所有代码全部都从这里开始执行没有例外。作为程序的入口函数在每个程序当中都必须有且仅有一个,如果一个 C++ 程序出现了两个及两个以上的入口函数则程序会无法编译。需要注意的是 main() 函数可以没有返回值(当返回值类型声明为 void 时),但在现代开发的⼤多数情况下它会返回⼀个整数值给操作系统,通常⽤来表⽰程序的退出状态。0 通常表⽰程序是正常关闭的,⾮零值表⽰有错误或异常情况。
5656

5757
第三与第六行: `{ }` 花括号在 C++ 中都是成对出现的,有开头就必须有结尾。在函数中的花括号代表了函数体,在花括号内部的代码都⾪属于同⼀个函数,在调⽤此函数时,大括号内部的代码会按照出现的先后顺序来依次执⾏。
5858

source/Language Core/Chapter-2/Section-03.md

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,93 @@
11
# 变量
22

3-
在计算机编程中我们经常需要存储某些随时会更改的数据并且这些数据可能会需要频繁的使用,如果我们把这些数据直接写在代码中它就会变成一个固定的数据无法根据需求进行更改。并且当我们需要在多个地方使用这些数据的时候如果每个地方都写一个同样的数据这不仅会增加代码量还会导致后期维护的时候变得异常的困难。
4-
当我们遇到了上述的问题的时候就可以使用变量来节省我们的工作量并提升可维护性了。
3+
在程序中,我们经常需要存储一些会变化的数据,例如用户年龄、计数器、计算结果等。
54

6-
变量是一种用来标记需要频繁使用且随时会更改的一种数据地址标记,变量的原理就是为某段数据地址起一个名字,我们可以随时通过这个名字来读取或修改这段数据
5+
如果将这些数据直接写死在代码中,不仅无法修改,还会导致代码难以维护。因此,C++ 提供了 **变量(Variable)** 来解决这个问题
76

8-
## 定义变量
7+
变量的本质其实就是一块内存空间的名字,可以通过这个名字进行读取数据或修改数据。
98

10-
当你想定义一个变量的时候必须为变量指定一个数据类型,如果没有指定数据类型则会出现错误。
9+
## 定义变量
1110

12-
```{admonition} 代码演示
11+
在 C++ 中,定义一个变量必须为其指定一个数据类型,如果没有指定数据类型则会出现错误。
1312

14-
**定义语法**: 数据类型 变量名称;
13+
**定义语法**: 数据类型   变量名称;
1514

1615
```CPP
16+
short age; // 定义了一个名为 age 的变量,但没有对其进行初始化
17+
```
1718

18-
short age; // 定义一个名为 age 的变量
19-
19+
```{important}
20+
对于未进行初始化的变量其值也是未定义的(垃圾值)
2021
```
2122

22-
通常我们在定义一个变量的时候会给这个变量一个初始值这个初始值可以理解为变量的默认数据,在不对其进行赋值等操作的时候此变量的值永远都是所设定的初始值。
23+
## 初始化变量
2324

24-
```{admonition} 代码演示
25+
通常我们在定义一个变量的时候会给这个变量一个初始值,在不对其进行额外的赋值等操作时此变量的值永远都是所设定的初始值。
2526

26-
**定义且初始化语法**: 数据类型 变量名称 = 变量的值;
27+
**传统写法**
2728

28-
```CPP
29+
**定义且初始化语法**: 数据类型   变量名称   =   变量的值;
2930

31+
```CPP
3032
short age = 18; // 定义一个名为 age 的变量,并设定初始值 (默认) 为 18
33+
```
34+
35+
**现代写法**
3136

37+
```CPP
38+
short age{18}; // 使用 { } 进行初始化
3239
```
3340
34-
同时定义多个相同类型的变量
41+
{ }(列表初始化) 是从 C++ 11 开始的核心语法,它的特性就是禁止 "隐式缩窄"
3542
36-
**定义语法**: 数据类型 变量名称, 变量名称, 变量名称, ···N+;
43+
例如:
3744
3845
```CPP
46+
int a = 3.14; // 可以编译,但会变成 3(精度丢失)double → int(缩窄转换)
47+
int a{3.14}; // 直接提示编译错误,{} 会阻止危险的数据丢失
3948
40-
short a, b, c; // 在数据类型相同的情况下定义多个变量。
49+
int a; // 未初始化(垃圾值)
50+
int b{}; // 安全, b 会被初始为 0
51+
```
52+
53+
之所以它的名字叫做 “列表初始化" 是因为它可以初始化多个值(列表)
4154

55+
例如数组:
56+
57+
```CPP
58+
int arr[]{1, 2, 3, 4};
4259
```
4360
44-
**初始语法**: 数据类型 变量名称 = 变量的值, 变量名称 = 变量的值, ···N+;
61+
## 多变量定义
62+
63+
**定义语法**: 数据类型   变量名称,   变量名称,   N+;
4564
4665
```CPP
66+
short a, b, c; // 在数据类型相同的情况下定义多个变量。
67+
```
68+
69+
## 多变量初始化
4770

71+
**初始语法**: 数据类型   变量名称   =   变量的值,   变量名称   = 变量的值,   N+;
72+
73+
```CPP
4874
short a = 123, b = 456, c = 789;
75+
```
4976

77+
**现代写法**
78+
79+
```CPP
80+
short a{1};
81+
short b{2};
82+
short c{3};
5083
```
5184
5285
## 语法规范
5386
5487
在 C++ 编程中使用变量时须严格遵守如下准则:
5588
5689
* 变量名中只能使用英文字母、数字、下划线 (_) 来命名。
57-
* 变量名的第一个字符禁止使用数字。
90+
* 变量名禁止使用数字开头
5891
* 变量名严格区分⼤⼩写,例如"Name"和"name"是不同的变量。
5992
* 禁止使用 C++ 中的任意[关键字](https://cppreference.com/w/cpp/keywords.html)作为变量名称。
6093

source/Language Core/Chapter-2/Section-04.md

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,50 +57,57 @@ double x = 3.14 * 2;
5757

5858
普通常量其实就是一个只读的变量,定义普通常量需要使用 **`const`** 关键字。
5959

60-
定义语法:
60+
普通常量语法:
6161

6262
```CPP
63-
const 数据类型 常量名称 = 常量的值;
63+
const 数据类型 常量名称 = ;
6464
```
6565

66-
可以理解为就是在变量的前面增加了 `const`
66+
现代常量语法:
67+
68+
```CPP
69+
const 数据类型 常量名称{值};
70+
```
71+
72+
常量可以理解为就是在变量的前面增加了 `const` 关键字然后让变量从读写变成了只读。
6773
6874
普通常量有数据类型、作用域、编译器检查相比宏常量更加安全。
6975
7076
```{caution}
7177
需要注意的是对于下方这种定义,编译器在编译的时候不保证知道常量的值。
7278
7379
```CPP
74-
const int x = rand(); // rand() 随机数函数,返回伪随机数。
80+
// rand() 随机数函数,返回伪随机数。
81+
const int x{rand()}; // 在编译期 x 的值未知,只有在运行期才知道。
7582
```
7683

77-
普通常量使用场景:
84+
普通常量的常见使用场景:
7885

79-
- 函数参数:
86+
- 函数参数保护:
8087

8188
```CPP
82-
void foo(const std::string& s); // 防止参数被修改
89+
void foo(const std::string& s); // 防止函数内部修改参数
8390
```
8491
8592
- 只读变量:
8693
8794
```CPP
88-
const int max_users = 1000;
95+
const int max_users{1000};
8996
```
9097

91-
- 类成员 ……
92-
9398
## 编译期常量
9499

95-
自 C++ 11 起支持使用 **`constexpr`** 定义常量,它的本质就是在编译阶段就确定的值
100+
自 C++ 11 起支持使用 **`constexpr`** 定义常量,用于定义必须在编译期就能确定值的常量
96101

97102
定义语法:
98103

104+
constexpr   数据类型   常量名称{值};
105+
99106
```CPP
100-
constexpr 数据类型 常量名称 = 常量的值;
107+
constexpr int a{10};
101108
```
102109
103-
constexpr 必须编译期可计算,编译器可将其极限的优化
110+
constexpr 必须是编译期可计算的表达式,允许编译器在编译阶段完成计算,从而避免运行时开销
104111
105112
使用场景:
106113
@@ -111,13 +118,13 @@ constexpr int square(int x) {
111118
return x * x;
112119
}
113120
114-
constexpr int a = square(5);
121+
constexpr int a{square(5)};
115122
```
116123

117124
- 数组大小:
118125

119126
```CPP
120-
constexpr int size = 100;
127+
constexpr int size{100};
121128
int arr[size];
122129
```
123130
@@ -128,25 +135,23 @@ int arr[size];
128135
例如:
129136
130137
```CPP
131-
const int x = rand(); // 合法但 x 的值只有在运行期才知道
138+
const int x{rand()}; // 合法但 x 的值只有在运行期才知道
132139
```
133140

134141
- constexpr 编译期就必须确定值
135142

136143
例如:
137144

138145
```CPP
139-
constexpr int a = 10; // 能在编译阶段算出来否则直接报错
146+
constexpr int a{10}; // 能在编译阶段算出来否则直接报错
147+
148+
constexpr int x{rand()}; // 编译失败,rand() 函数只有在运行期才会有返回值
140149
```
141150
142151
## 如何选择
143152
144-
1. 类型安全 + 普通常量: const
145-
2. 追求性能 / 编译期优化: constexpr
146-
3. 跨平台 / 编译控制: #define
147-
148-
优先级: 在现代 C++ 中,优先选择 constexpr,其次 const,尽量避免使用宏来定义常量。
153+
1. 能在编译期确定的值 → 使用 constexpr
154+
2. 需要运行期确定但不希望修改 → 使用 const
155+
3. 仅用于编译控制(如平台/调试) → 使用 #define
149156
150-
- 能 constexpr 就 constexpr
151-
- 需要运行时值但不希望修改 → const
152-
- 宏只用于条件编译或平台适配
157+
优先级: 在现代 C++ 中,优先选择 constexpr,其次 const,在现代 C++ 中,应避免使用宏定义常量。

0 commit comments

Comments
 (0)