Update README.md

This commit is contained in:
Wei ZHANG 2021-09-20 11:35:13 +08:00 committed by GitHub
parent 545c27c3de
commit 52ec6b7be1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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. <b>类型定义不同。</b> const定义常量时需要带数据类型而define不用带
2. <b>编译器处理不同。<b>
- const是在编译、运行的时候起作用而define是在编译的预处理阶段起作用
- define只是简单的替换没有类型检查。简单的字符串替换会导致边界效应
```cpp
#include <stdio.h>
@ -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 = 1B = A+3那么AB就为AB = AA+3 = 11+3按照我们一般的思维这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应如果想把B的值作为一个整体就需要使用括号将值括起来。
说明:这里替换是<b>原样替换</b>比如说代码中A = 1B = A+3那么AB就为AB = AA+3 = 11+3按照我们一般的思维这里的AB应该为A(A+3),但实际上并不是,所以使用#define定义常量容易造成边界效应如果想把B的值作为一个整体就需要使用括号将值括起来。
4. const常量可以进行调试define不能进行调试主要是预编译阶段就已经替换掉了调试的时候就没它了简单点说在预编译的时候就已经将常量替换成了对应的值所以是没法调试的
5. const不能重新定义不可以定义两个一样的而define通过undef取消某个符号的定义再重新定义,例如:
3. <b>是否可调试。</b> const常量可以进行调试define不能进行调试主要是预编译阶段就已经替换掉了调试的时候就没它了简单点说在预编译的时候就已经将常量替换成了对应的值所以是没法调试的
4. <b>是否可重新定义。</b> const不能重新定义不可以定义两个一样的而define通过undef取消某个符号的定义再重新定义,例如:
```cpp
#include <stdio.h>
#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. <b>其他差别:</b> define可以配合#ifdef、#ifndef、#endif来使用可以让代码更加灵活比如我们可以通过``#define``来启动或者关闭调试信息
```cpp
#include <stdio.h>
//#define DEBUG
void main() {
#ifdef DEBUG //如果定义了DEBUG
printf("OK,调试信息");