P&8?^@qePCl3&^nsRnc=D$P9Bw>^Abm+Feod2$%$v3&;x
z!npsu&I>7`*Ix|>(?tLPVWAS@7MM@JtX2y1S+}5)+phHcq55#qZ)KI@F=g94_bdIT
hRQ@6L;694Vy|}nPDm?!0p?3R=_qoy5dxCr0|2IZC@yq}K
From ce125cfa5fef691131483a6a85de46d32243ff9b Mon Sep 17 00:00:00 2001
From: Aurelius84
Date: Fri, 12 Jun 2020 21:03:43 +0800
Subject: [PATCH 2/2] refine content of assert and const
---
basic_content/assert/README.md | 21 ++--
basic_content/assert/ignore_assert.c | 4 +-
basic_content/const/README.md | 139 ++++++++++++---------------
3 files changed, 78 insertions(+), 86 deletions(-)
diff --git a/basic_content/assert/README.md b/basic_content/assert/README.md
index 534fc49..8699eff 100644
--- a/basic_content/assert/README.md
+++ b/basic_content/assert/README.md
@@ -10,12 +10,17 @@
## 1.第一个断言案例
-断言,**是宏,而非函数**。assert 宏的原型定义在 (C)、(C++)中,其作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,include 之前。
+断言,**是宏,而非函数**。
+
+assert 宏的原型定义在 (C)、(C++)中。其作用是如果它的条件返回错误,则终止程序执行。
+
+可以通过定义 `NDEBUG` 来关闭 assert,**但是需要在源代码的开头,include 之前。**
```c
void assert(int expression);
```
-对应代码:[assert.c](./assert.c)
+
+> 代码样例:[assert.c](./assert.c)
```c
#include
#include
@@ -35,22 +40,22 @@ int main()
return 0;
}
-
```
输出:
```c
-assert: assert.c:13: main: Assertion `x==7' failed.
+assert: assert.c:13: main: Assertion 'x==7' failed.
```
可以看到输出会把源码文件,行号错误位置,提示出来!
## 2.断言与正常错误处理
-断言主要用于检查逻辑上不可能的情况。例如,它们可用于检查代码在开始运行之前所期望的状态,或者在运行完成后检查状态。与正常的错误处理不同,断言通常在运行时被禁用。
++ 断言主要用于检查逻辑上不可能的情况。
-忽略断言:
+>例如,它们可用于检查代码在开始运行之前所期望的状态,或者在运行完成后检查状态。与正常的错误处理不同,断言通常在运行时被禁用。
-在代码开头加上:
++ 忽略断言,在代码开头加上:
```c++
#define NDEBUG // 加上这行,则 assert 不可用
```
-对应学习的代码:[ignore_assert.c](./ignore_assert.c)
+
+> 样例代码:[ignore_assert.c](./ignore_assert.c)
diff --git a/basic_content/assert/ignore_assert.c b/basic_content/assert/ignore_assert.c
index d3069e5..0a5a15e 100644
--- a/basic_content/assert/ignore_assert.c
+++ b/basic_content/assert/ignore_assert.c
@@ -6,12 +6,10 @@
* @date 2019-07-25
*/
-# define NDEBUG
+# define NDEBUG // 忽略断言
#include
-
-
int main(){
int x=7;
assert(x==5);
diff --git a/basic_content/const/README.md b/basic_content/const/README.md
index 69af42c..c23e458 100644
--- a/basic_content/const/README.md
+++ b/basic_content/const/README.md
@@ -10,47 +10,45 @@
## 2.const作用
-(1)可以定义常量
++ 可以定义常量
-```c++
+```cpp
const int a=100;
```
-(2)类型检查
++ 类型检查
-const常量与#define宏定义常量的区别:~~**const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查。**~~感谢两位大佬指出这里问题,见:
+ + const常量与`#define`宏定义常量的区别:
+ > ~~**const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查。**~~感谢两位大佬指出这里问题,见:[issue](https://github.com/Light-City/CPlusPlusThings/issues/5)
-> https://github.com/Light-City/CPlusPlusThings/issues/5
+ + const定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。
+ + 其他情况下它只是一个 `const` 限定的变量,不要将与常量混淆。
-`const` 定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。其他情况下它只是一个 `const` 限定的变量,不要将与常量混淆。
++ 防止修改,起保护作用,增加程序健壮性
-(3)防止修改,起保护作用,增加程序健壮性
-
-```c++
+```cpp
void f(const int i){
i++; //error!
}
```
-(4)可以节省空间,避免不必要的内存分配
++ 可以节省空间,避免不必要的内存分配
-const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
+ + const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像`#define`一样给出的是立即数。
+ + const定义的常量在程序运行过程中只有一份拷贝,而`#define`定义的常量在内存中有若干个拷贝。
## 3.const对象默认为文件局部变量
注意:非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。
+
> 未被const修饰的变量在不同文件的访问
-```c++
+```cpp
// file1.cpp
int ext
// file2.cpp
#include
-/**
- * by 光城
- * compile: g++ -o file file2.cpp file1.cpp
- * execute: ./file
- */
+
extern int ext;
int main(){
std::cout<<(ext+10)< const常量在不同文件的访问
-```c++
+```cpp
//extern_file1.cpp
extern const int ext=12;
//extern_file2.cpp
#include
-/**
- * by 光城
- * compile: g++ -o file const_file2.cpp const_file1.cpp
- * execute: ./file
- */
extern const int ext;
int main(){
std::cout<小结:可以发现未被const修饰的变量不需要extern显式声明!而const常量需要显式声明extern,并且需要做初始化!因为常量在定义后就不能被修改,所以定义时必须初始化。
+> 小结:
可以发现未被const修饰的变量不需要extern显式声明!而const常量需要显式声明extern,并且需要做初始化!因为常量在定义后就不能被修改,所以定义时必须初始化。