#define NUM 10 和const int NUM=10有啥具体的区别?

darkwalkertt 2008-10-28 11:04:51
rt...
...全文
922 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sc_valentine21 2008-10-28
  • 打赏
  • 举报
回复

#define NUM 10 //简单的名字替换,写啥都可以,预编译时
const int NUM=10//要做类型检查,编译时
jack_luck 2008-10-28
  • 打赏
  • 举报
回复
在某种程度上,这两个是一样的。
但是对define只做替换,不会进行检查类型是否对。而第二个会进行类型检查!
xmczr 2008-10-28
  • 打赏
  • 举报
回复
#define 是c中定义常量所用的方式,不能指定变量的类型,而且是全局的。
const在C和C++中的定义不一样,在C中只是表示不会改变,而在C++中赋予了更多的意思,其中最明显的就是他可以用来定义一个编译期间的常量,这个功能可以取代C中#define的功能,而且还附带了安全性检查,所以在C++中比较多的使用CONST来代替
hhyttppd 2008-10-28
  • 打赏
  • 举报
回复
再看一例:
const int NUM = UINT_MAX;

#define M_NUM UINT_MAX

template<typename T>
void SomeFuction(T const& arg)
{

std::cout << "in template:" << arg << std::endl;
}

int main()
{
SomeFuction(NUM);
SomeFuction(M_NUM);

return 0;
}
hhyttppd 2008-10-28
  • 打赏
  • 举报
回复
const int NUM=10
NUM现在有了类型(const int)

#define NUM 10
执行编译期替换,仍是字面常量(literal const)

比如:
const int NUM = UINT_MAX;

#define M_NUM UINT_MAX

void SomeFuction(unsigned short arg)
{
std::cout << arg << std::endl;
}

int main()
{
SomeFuction(NUM); //VS2005:warning C4245: “参数”: 从“const int”转换到“unsigned short”,有符号/无符号不匹配
SomeFuction(M_NUM); //warning C4305: “参数”: 从“unsigned int”到“unsigned short”截断
//warning C4309: “参数”: 截断常量值

return 0;
}
xhs_lh04 2008-10-28
  • 打赏
  • 举报
回复
理论上讲是有区别
一个预编译时用来替换
一个是常量,使用起来效果是一样
JJZHK 2008-10-28
  • 打赏
  • 举报
回复
效果上来说,没有区别。不过建议使用后者,具体参照《Effective C++》。
dzc8866 2008-10-28
  • 打赏
  • 举报
回复
学习了UP
xtting_8984313 2008-10-28
  • 打赏
  • 举报
回复
区别如下
1、处理位置不一样,一个预处理,一个编译期
2、数据类型检查,define不存在检查一说,于是在某些情况下编译正常的define,功能可能不是你所期望的,所以优先使用const
3、生成的代码大小,在某些情况下const的东西会占用最终程序的空间的(具体看c专家编程之类的书籍/c陷阱与缺陷,具体哪一本可忘记了)
4、
ForestDB 2008-10-28
  • 打赏
  • 举报
回复
一个是预编译的事,没有任何类型信息,只是简单的内容替换。
一个是编译的事,有类型信息,可以利用次信息做类型检查,减少错误。
JIGSONG 2008-10-28
  • 打赏
  • 举报
回复
修订一下:
定义不同:可以理解NUM1是10的一个别名,在编译时凡遇到NUM1的地方均用10替换;
NUM2是一个int型变量,它有值、地址值、类型,它被限定为const说明该变量
的值不能被修改。
意义不同:#define经常是为了方便记忆和使用而用一个符号指代常量值,如指代3.1415等;
(const int)是一个变量并且该变量的值不可修改,但可以有指针(常指针)指向它。
NUM1表示别名,NUM2是变量并不可修改它的值,即它是常量。
[Quote]
引用楼主 darkwalkertt 的帖子:
#define NUM1 10 和const int NUM2=10有啥具体的区别?
[/Quote]
JIGSONG 2008-10-28
  • 打赏
  • 举报
回复
定义不同:NUM1是一个常量,它是10;NUM2是一个变量,它有值、地址值、类型
意义不同:#define经常是为了方便记忆和使用而用一个符号指代常量值,如指代3.1415等;
(const int)是一个变量,可以有指针指向它,通常是防止被修改。
NUM1表示常量,NUM2是变量并不可修改它的值。
[Quote=引用楼主 darkwalkertt 的帖子:]
#define NUM1 10 和const int NUM2=10有啥具体的区别?
[/Quote]
  • 打赏
  • 举报
回复
看你的回答,感觉const比较好一些。

但是我在实际应用中,貌似#define 用的多一些。

如果const仅仅是 多了一个类型检查 ,那我想 还是#define 好一些。
shuaiwang_01 2008-10-28
  • 打赏
  • 举报
回复
第一个要进行预编译处理,c用的较多。
第二个是常变量,推荐第二个。
anncanm 2008-10-28
  • 打赏
  • 举报
回复
#define NUM 10
没有为NUM开辟空间,如二楼所说编译时进得了替换。
const int NUM = 10
定义了NUM为常量,分配了内存空间。
以下是我对const定义变量的一些理解.

#include <stdio.h>
void main()
{
const int NUM = 10;
printf( "%d\n", NUM );
printf( "%x\n", &NUM );

*((int *)&NUM) = 11;
printf( "%d\n", NUM );
printf( "%x\n", &NUM );
}
编程-鸟人-_-- 2008-10-28
  • 打赏
  • 举报
回复
up
xuhb95083023 2008-10-28
  • 打赏
  • 举报
回复
1、#define 生成的目标文件会大些,因为是预处理阶段进行的,没有进入符号表,目标代码中会有多个副本
2、#define没有语法检查
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧