目录一.const使用1.const修饰变量2.const修饰指针3.const修饰在函数名前面当4.const修饰在函数名后面5.const修饰函数参数二.define使用1.de
const 是 constant 的缩写,“恒定不变”的意思。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多 c++ 程序设计书籍建议:“Use const whenever you need”。
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 和 define 区别
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
#include <stdio.h>
int main() {
const int a = 20 ;
printf("a = %d\n",a);
a = 200 ;
printf("a = %d\n",a);
return 0;
}
用 const 定义的变量
的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。并且 const 修饰的变量在定义的时候就给它赋初值,否则报错:
error: uninitialized 'const ' [-fpermissive]
详细解释可以直接跳转:const 修饰变量;
//以下两者等价,表示 *p 不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变;
const int *p
int const *p
//此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变;
int * const p
/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言 const 和 define 区别
//@Time:2021/07/04 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
class People
{
public:
int talk(void);
int eat(void) const; // const 成员函数
private:
int m_age;
};
int People::eat(void) const
{
++m_age; // 编译错误,企图修改数据成员m_num
talk(); // 编译错误,企图调用非const函数
return m_age;
}
如果函数参数采用“指针传递”,那么加 const 修饰可以防止意外地改动该指针,起到保护作用。
void StrinGCopy (char*strDestination, const char *strSource);
其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。
如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加 const 修饰。
例如不要将函数 void Func1(int x) 写成 void Func1(const int x)。
如果参数作为输出参数,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加 const 修饰,否则该参数将失去输出功能(因为有 const 修饰之后,不能改变他的值)。
如果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性;
C 语言中,可以用 #define
定义一个标识符来表示一个常量,用 #define 定义标识符的一般形式为:
#define 标识符 常量 //注意define最后没有分号
//例如:
#define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926 //定义浮点数变量PI值为3.1415926
凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
//定义常量
#define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926 //定义浮点数变量PI值为3.1415926
//定义函数
#define MAX(a,b) (a>b)?a:b //取两个数最大值
#define MIN(a,b) (a<b)?a:b //取两个数最小值
//定义常量
#define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926 //定义浮点数变量PI值为3.1415926
//定义简单函数
#define MAX(a,b) (a>b)?a:b //取两个数最大值
#define MIN(a,b) (a<b)?a:b //取两个数最小值
//定义复杂多行的函数
#define MacRO(arg1, arg2) do { \
\
stmt1; \
stmt2; \
\
} while(0)
//关键是要在每一个换行的时候加上一个 "\ "
使用define定义一个多行的复杂函数,关键是要在每一个换行的时候加上一个 \;
通过 #ifndef / #define 解决头文件重复包含
#ifndef __XXX_H__
#define __XXX_H__
int a=1;
#endif
上面的伪代码如下:
如果(没有定义宏__XXX_H__)
{
那么直接定义宏__XXX_H__
定义变量a 并且赋值为 1
}
结束程序
1.就起作用的阶段而言
define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。
2.就起作用的方式而言
define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
3.就存储方式而言
define 只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份; const 定义的只读变量在程序运行过程中只有一份备份。
4.从代码调试的方便程度而言
const 常量可以进行调试的,define 是不能进行调试的,因为在预编译阶段就已经替换掉了。
5.从效率程度而言
编译器通常不为普通 const 常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高
到此这篇关于关于C语言 const 和 define 区别的文章就介绍到这了,更多相关C语言 const 和 define 区别 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 关于C语言 const 和 define 区别
本文链接: https://lsjlt.com/news/135168.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0