From 545c27c3de12428bf2250863147c91b350288f20 Mon Sep 17 00:00:00 2001 From: Wei ZHANG Date: Thu, 9 Sep 2021 18:49:02 +0800 Subject: [PATCH 1/3] Update README.md --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/README.md b/README.md index 9a581b6..f2e8c30 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,67 @@ const int* function6(); // 返回一个指向常量的指针变量,使用 int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7(); ``` +#### #define与const的区别 + +##### 常量定义的两种方式 +- 使用``#define``预处理器:``#define 变量名 变量值`` +- 使用关键字``const``:``const 数据类型 变量名 变量值`` + +##### #define与const定义常量的区别 +1. const定义常量时,需要带数据类型,而define不用带 +2. const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用 +3. define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应, + +```cpp +#include + +#define A 1 +#define B A+3 +#define C A/B*3 +void main() { + //分析过程 + //#define就是一个简单的替换 + //C其实是A/A+3*3 = > 1/1 + 3*3 = 10 + printf("C=%d",C); + getchar(); +} +``` + + 这里替换的意思就是字面上的意思,比如说代码中A = 1,B = A+3,那么AB就为AB = AA+3 = 11+3;按照我们一般的思维,这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应,如果想把B的值作为一个整体,就需要使用括号将值括起来。 + +4. const常量可以进行调试,define不能进行调试,主要是预编译阶段就已经替换掉了,调试的时候就没它了;(简单点说,在预编译的时候就已经将常量替换成了对应的值,所以是没法调试的); +5. const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义,例如: + +```cpp +#include +#define PI 3.14 //定义一个常量 +#undef PI //取消定义 +#define PI 3.1456 //再次定义 +//const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义 +void main() { + const int n1 = 10; + printf("%0.3f",PI * 10); + getchar(); +} +``` + +6. define可以配合#ifdef、#ifndef、#endif来使用,可以让代码更加灵活,比如我们可以通过``#define``来启动或者关闭调试信息 + +```cpp +#include + +//#define DEBUG +void main() { +#ifdef DEBUG //如果定义了DEBUG + printf("OK,调试信息"); +#endif //结束语句 +#ifndef DEBUG //如果没有定义DEBUG + printf("no,其他信息"); +#endif + getchar(); +} +``` + ### static #### 作用 From 52ec6b7be1af73c85db838568ae909ce5b17a193 Mon Sep 17 00:00:00 2001 From: Wei ZHANG Date: Mon, 20 Sep 2021 11:35:13 +0800 Subject: [PATCH 2/3] Update README.md --- README.md | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index f2e8c30..786aa28 100644 --- a/README.md +++ b/README.md @@ -124,14 +124,15 @@ int* const function7(); // 返回一个指向变量的常指针,使用:i #### #define与const的区别 -##### 常量定义的两种方式 +##### 两种定义方式 - 使用``#define``预处理器:``#define 变量名 变量值`` - 使用关键字``const``:``const 数据类型 变量名 变量值`` -##### #define与const定义常量的区别 -1. const定义常量时,需要带数据类型,而define不用带 -2. const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用 -3. define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应, +##### 区别 +1. 类型定义不同。 const定义常量时,需要带数据类型,而define不用带; +2. 编译器处理不同。 + - const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用; + - define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应 ```cpp #include @@ -140,25 +141,22 @@ int* const function7(); // 返回一个指向变量的常指针,使用:i #define B A+3 #define C A/B*3 void main() { - //分析过程 - //#define就是一个简单的替换 - //C其实是A/A+3*3 = > 1/1 + 3*3 = 10 printf("C=%d",C); getchar(); } ``` - 这里替换的意思就是字面上的意思,比如说代码中A = 1,B = A+3,那么AB就为AB = AA+3 = 11+3;按照我们一般的思维,这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应,如果想把B的值作为一个整体,就需要使用括号将值括起来。 +说明:这里替换是原样替换,比如说代码中A = 1,B = A+3,那么AB就为AB = AA+3 = 11+3;按照我们一般的思维,这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应,如果想把B的值作为一个整体,就需要使用括号将值括起来。 -4. const常量可以进行调试,define不能进行调试,主要是预编译阶段就已经替换掉了,调试的时候就没它了;(简单点说,在预编译的时候就已经将常量替换成了对应的值,所以是没法调试的); -5. const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义,例如: +3. 是否可调试。 const常量可以进行调试,define不能进行调试,主要是预编译阶段就已经替换掉了,调试的时候就没它了;(简单点说,在预编译的时候就已经将常量替换成了对应的值,所以是没法调试的); +4. 是否可重新定义。 const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义,例如: ```cpp #include #define PI 3.14 //定义一个常量 #undef PI //取消定义 #define PI 3.1456 //再次定义 -//const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义 + void main() { const int n1 = 10; printf("%0.3f",PI * 10); @@ -166,12 +164,11 @@ void main() { } ``` -6. define可以配合#ifdef、#ifndef、#endif来使用,可以让代码更加灵活,比如我们可以通过``#define``来启动或者关闭调试信息 +5. 其他差别: define可以配合#ifdef、#ifndef、#endif来使用,可以让代码更加灵活,比如我们可以通过``#define``来启动或者关闭调试信息 ```cpp #include -//#define DEBUG void main() { #ifdef DEBUG //如果定义了DEBUG printf("OK,调试信息"); From 1115ef4fcb9f806315e59759b3aa30dfdea74102 Mon Sep 17 00:00:00 2001 From: huihut Date: Wed, 22 Sep 2021 23:49:20 +0800 Subject: [PATCH 3/3] Update README.md --- README.md | 65 ++++++++----------------------------------------------- 1 file changed, 9 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 786aa28..220481a 100644 --- a/README.md +++ b/README.md @@ -122,63 +122,16 @@ const int* function6(); // 返回一个指向常量的指针变量,使用 int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7(); ``` -#### #define与const的区别 +#### 宏定义 #define 和 const 常量 -##### 两种定义方式 -- 使用``#define``预处理器:``#define 变量名 变量值`` -- 使用关键字``const``:``const 数据类型 变量名 变量值`` - -##### 区别 -1. 类型定义不同。 const定义常量时,需要带数据类型,而define不用带; -2. 编译器处理不同。 - - const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用; - - define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应 - -```cpp -#include - -#define A 1 -#define B A+3 -#define C A/B*3 -void main() { - printf("C=%d",C); - getchar(); -} -``` - -说明:这里替换是原样替换,比如说代码中A = 1,B = A+3,那么AB就为AB = AA+3 = 11+3;按照我们一般的思维,这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应,如果想把B的值作为一个整体,就需要使用括号将值括起来。 - -3. 是否可调试。 const常量可以进行调试,define不能进行调试,主要是预编译阶段就已经替换掉了,调试的时候就没它了;(简单点说,在预编译的时候就已经将常量替换成了对应的值,所以是没法调试的); -4. 是否可重新定义。 const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义,例如: - -```cpp -#include -#define PI 3.14 //定义一个常量 -#undef PI //取消定义 -#define PI 3.1456 //再次定义 - -void main() { - const int n1 = 10; - printf("%0.3f",PI * 10); - getchar(); -} -``` - -5. 其他差别: define可以配合#ifdef、#ifndef、#endif来使用,可以让代码更加灵活,比如我们可以通过``#define``来启动或者关闭调试信息 - -```cpp -#include - -void main() { -#ifdef DEBUG //如果定义了DEBUG - printf("OK,调试信息"); -#endif //结束语句 -#ifndef DEBUG //如果没有定义DEBUG - printf("no,其他信息"); -#endif - getchar(); -} -``` +宏定义 #define|const 常量 +---|--- +宏定义,相当于字符替换|常量声明 +预处理器处理|编译器处理 +无类型安全检查|有类型安全检查 +不分配内存|要分配内存 +存储在代码段|存储在数据段 +可通过 `#undef` 取消|不可取消 ### static