返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >关于C语言 const 和 define 区别
  • 425
分享到

关于C语言 const 和 define 区别

2024-04-02 19:04:59 425人浏览 八月长安
摘要

目录一.const使用1.const修饰变量2.const修饰指针3.const修饰在函数名前面当4.const修饰在函数名后面5.const修饰函数参数二.define使用1.de

一.const 使用

const 是 constant 的缩写,“恒定不变”的意思。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多 c++ 程序设计书籍建议:“Use const whenever you need”。

1.const 修饰变量



//@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 修饰变量;

2.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 对象只能访问 const 成员函数,而非 const 对象可以访问任意的成员函数,包括 const 成员函数;
  • const 对象的成员是不可修改的,然而 const 对象通过指针维护的对象却是可以修改的;
  • const 成员函数不可以修改对象的数据,不管对象是否具有 const 性质.它在编译时,以是否修改成员数据为依据,进行检查;
  • 然而加上 mutable 修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的 const 成员函数是可以修改它的;

5.const 修饰函数参数

如果函数参数采用“指针传递”,那么加 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 修饰之后,不能改变他的值)。

如果参数作为输入参数,可以防止数据被改变,起到保护作用,增加程序的健壮性;

二.define 使用

1.define 定义常量

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


凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

2.define 定义函数


//定义常量
#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  //取两个数最小值

3.define 定义多行函数


//定义常量
#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定义一个多行的复杂函数,关键是要在每一个换行的时候加上一个 \;

4.define 防止头文件重复包含

通过 #ifndef / #define 解决头文件重复包含


#ifndef __XXX_H__
#define __XXX_H__

int a=1;

#endif

上面的伪代码如下:

如果(没有定义宏__XXX_H__)
{
    那么直接定义宏__XXX_H__
    定义变量a 并且赋值为 1
}
结束程序

  • 假如第一次包含时,由于没有定义宏 __XXX_H,所以做了两件事,定义宏 __XXX_H,然后定义 int a = 1;
  • 假如第二次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
  • 假如第 N 次包含时,由于已经定义宏 __XXX_H__,所以啥都不做;
  • 整个过程,无论头文件被包含多少次,变量 a 只被定义一次,不会有重复包含重复定义的问题存在!

三.const 和 define 区别

1.就起作用的阶段而言
define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。
2.就起作用的方式而言
define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
3.就存储方式而言
define 只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份; const 定义的只读变量在程序运行过程中只有一份备份。
4.从代码调试的方便程度而言
const 常量可以进行调试的,define 是不能进行调试的,因为在预编译阶段就已经替换掉了。

5.从效率程度而言

编译器通常不为普通 const 常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高

四.const 优点

  • 1.const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
  • 2.有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
  • 3.const 可节省空间,避免不必要的内存分配,提高效率

到此这篇关于关于C语言 const 和 define 区别的文章就介绍到这了,更多相关C语言 const 和 define 区别 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 关于C语言 const 和 define 区别

本文链接: https://lsjlt.com/news/135168.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于C语言 const 和 define 区别
    目录一.const使用1.const修饰变量2.const修饰指针3.const修饰在函数名前面当4.const修饰在函数名后面5.const修饰函数参数二.define使用1.de...
    99+
    2024-04-02
  • C语言中const和define的区别是什么
    本文小编为大家详细介绍“C语言中const和define的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中const和define的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。def...
    99+
    2023-06-29
  • C语言中const和define的区别你了解嘛
    目录define和const使用const和define区别总结define和const使用 const和define区别 #include <stdio.h> #...
    99+
    2024-04-02
  • PHP中const和define的区别
    一、定义方式的区别 define:define是一个函数,用于定义常量,语法格式是define(name, value, case-insensitive)。其中,name是必需的,规定常量的名称;value是必需的,规定常量的值;c...
    99+
    2023-10-29
    区别 PHP const
  • c语言中typedef和define的区别是什么
    这篇文章主要介绍“c语言中typedef和define的区别是什么”,在日常操作中,相信很多人在c语言中typedef和define的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c语言中typed...
    99+
    2023-06-25
  • c语言和c++语言中const修饰的变量区别浅析
    目录c:修饰全局变量:修饰局部变量:c++:修饰全局变量:修饰局部变量:总结:在c语言中:在c++语言中:总结c: 修饰全局变量: 用const修饰的全局变量是没有办法直接修改的,间...
    99+
    2024-04-02
  • 详解C语言中typedef和#define的用法与区别
    目录一、typedef的用法二、#define的用法三、typedef与#define的区别四、typedef的用途用途一用途二用途三用途四五、typedef的陷阱陷阱一陷阱二一、t...
    99+
    2024-04-02
  • 关于C语言strlen与sizeof区别详情
    目录一.sizeof详解1.sizeof()作用2.sizeof3.sizeof ()4.sizeof()与数组名的关系5.sizeof()返回类型造成的坑二.strlen详解三.s...
    99+
    2024-04-02
  • c语言中等于和等于等于的区别
    在 c 语言中,"等于"(=)用于赋值,而 "等于等于"(==)用于比较。等于(=)运算符:将右侧值赋值给左侧变量。等于等于(==)运算符:比较两个值是否相等,返回布尔值(true/fa...
    99+
    2024-05-02
    c语言
  • c语言中等于和双等于的区别
    c 语言中,“==”和“===”比较运算符的区别在于:“==”只比较值,而“===”同时比较值和类型。因此,使用“==”时不同类型的值可能相等,而使用“===”时只有值和类型都相等才返回...
    99+
    2024-04-27
    c语言
  • const在c和c++中的区别
    在 c 和 c++ 中,const 关键字用于声明常量。在 c 中,const 只能修饰变量,不能修饰指针或数组;在 c++ 中,const 可以修饰变量、指针和数组。主要的差异在于:作...
    99+
    2024-04-28
    c++ 作用域
  • c++和c语言的区别
    区别:1、c++支持类、继承、多态等oop概念,而c语言本身并不直接支持oop;2、c++相对于c语言来说,引入了更多的新特性,例如函数重载、运算符重载、模板、异常处理等;3、c++标准...
    99+
    2024-03-14
    c++ c语言 标准库
  • 关键字const和readonly的区别
    关键字const和readonly都用于声明只读变量或只读属性,但它们的用法和作用有所不同。1. const关键字:- 可以用于变量...
    99+
    2023-09-01
    区别
  • C++和C中const的区别详解
    目录C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通...
    99+
    2024-04-02
  • C语言中typedef的用法以及#define区别详解
    目录1、简洁定义 2、为已有类型起别名 为字符数组起别名为指针起别名3、typedef 和 #define 的区别总结1、简洁定义 C语言允许为一个数据类型起一个新的别名,就像给人...
    99+
    2024-04-02
  • c语言和python区别
    c语言和python是两种截然不同的编程语言,各具特色和应用场景。c语言作为编译型、面向过程的语言,在底层系统编程和性能要求高的领域表现出色。python作为解释型、面向对象的语言,凭借...
    99+
    2024-03-14
    c语言 python 代码可读性
  • 详解C++中typedef 和 #define 的区别
    1、执行上不同 关键字 typedef 在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能。 #define 则是宏定义,发生在预处理阶段,也就是编译之前,它只...
    99+
    2024-04-02
  • C语言中const,指针和引用的关系
    目录const 与指针const 与引用const 与指针、引用总结const 与指针 我们写一段代码来探究以下 int a = 10, b = 20; int* p1 = &...
    99+
    2024-04-02
  • c语言和c++怎么区别
    c++kquote>c语言和c++的主要区别在于:对象导向编程:c++支持,c不支持。数据类型:c++引入了bool、string、vector等新类型。指针:c使用直接指针,c+...
    99+
    2024-04-05
    c语言 c++
  • c语言和c++有区别吗?
    c++kquote>是的,c 语言和 c++ 之间存在关键区别:c++ 支持面向对象的类和对象,而 c 则不支持。c++ 具有严格的数据封装和访问控制,而 c 没有。c++ 具有命...
    99+
    2024-04-13
    c语言 c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作