tempad
Readygo技术搜索引擎 >>PHP技术 >> 请教二者之间的区别?

请教二者之间的区别?

Readygo技术搜索引擎 网络搜索 efish 2008-1-14 16:14:05

请教二者之间的区别?

楼主backin(坏小子)2002-07-20 09:41:47 在 C/C++ / C语言 提问

请问   const   int   N=100;/定义全局变量N  
  和  
  #define   N=100;/宏定义N  
  有什么区别啊?  
  问题点数:0、回复次数:12Top

1 楼LeeMaRS(小菜虎,仍需努力)回复于 2002-07-20 09:43:37 得分 0

几乎没区别,一个是C++的形式,一个是C的形式.Top

2 楼littlegu(littlegu)回复于 2002-07-20 09:45:12 得分 0

你用的是什么语言的语法啊?Top

3 楼reaperGD(感悟者)回复于 2002-07-20 09:53:06 得分 0

你写的是不是有问题呀define只是简单的文本替换,没见过用=号的呀  
   
  直接  
   
  #define   N   100  
   
  前面那个const是定义常量,就是说程序中,不论发生什么变化,常量的值都不变。  
   
  后面的define也说了,是简单的文本替换,一般用在不同环境中的移植。Top

4 楼zhanghaifeng(海风)回复于 2002-07-20 10:17:19 得分 0

define中未见过有=号的。  
  const中定义的常量有类型,而define中定义的值没有类型。Top

5 楼chinafriend_xj(江湖)回复于 2002-07-20 11:08:20 得分 0

const   是常量访问说明符,  
  const   int   a     定义整形变量a,值不能被程序修改.可以在初始化时直接被赋值或通过某些硬件的方法赋值.  
  #define   是宏替换,使用它会使移植和修改程序很方便,另外宏替换还可以带形式参数,如:#define   MIN   (a<b)   ?   a:b     在程序中实际参数会代替这些形式参数.  
  不过,似乎也有本书上提到const也不能阻止某些修改,记不确切了,你可以自己再翻一下资料.Top

6 楼ynli2002(阿男)回复于 2002-07-20 11:15:54 得分 0

这两个没有区别  
  但是宏可以定义简单的函数功能,如江湖所说  
  Top

7 楼langhaixin(C++如此多娇,引无数高手尽折腰!)回复于 2002-07-20 12:04:06 得分 0

常量const定义引入了类型安全机制  
  而#define   只是在预编译的时候把符号N替换成100而以Top

8 楼backin(坏小子)回复于 2002-07-20 12:47:47 得分 0

是我写错了  
  #define   N   100;  
  多谢大家,我明白了。  
  还有一个问题,怎样输入一个不定长度字符串,怎么判断它的长度?怎么统计该字符串中字符和数字的个数,用什么语句来进行判断呢?因为我输入的字符串是不定长度的,我总是找不到它的结束标志。因此用循环语句来统计该字符串中字符和数字的个数时,总是出现错误的结果。谢谢。Top

9 楼zheng_can(nothrow)回复于 2002-07-20 12:57:25 得分 0

给定一个最大值,eg               const   int   MAX   =   1024;  
  定义一个大的缓冲区   eg         char   buf;  
  将读取的字符串存入该缓冲区,如果使用系统函数读取字符串的话,它会设好结束标志的;如果是你自己一个一个字节得读进来的话,自己设置结束标志  
  然后用循环语句配合判断语句就可以搞定Top

10 楼Oversense(步步文)回复于 2002-07-20 13:04:46 得分 0

尽量用const和inline而不用#define  
   
  这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:  
   
  #define   ASPECT_RATIO   1.653  
   
  编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不会出现在符号列表中。  
  解决这个问题的方案很简单:不用预处理宏,定义一个常量:  
   
  const   double   ASPECT_RATIO   =   1.653;  
   
  这种方法很有效。但有两个特殊情况要注意。  
  首先,定义指针常量时会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如,要在头文件中定义一个基于char*的字符串常量,你要写两次const:  
   
  const   char   *   const   authorName   =   "Scott   Meyers";  
   
  关于const的含义和用法,特别是和指针相关联的问题,参见条款21。  
   
  另外,定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:  
           
   
  class   GamePlayer   {  
  private:  
  static   const   int   NUM_TURNS   =   5;   //   constant   eclaration    
  int   scores;//   use   of   constant  
  ...  
  };  
   
  还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件中定义类的静态成员:  
   
  const   int   GamePlayer::NUM_TURNS;//   mandatory   definition;  
  //   goes   in   class   impl.file  
   
  你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。  
   
  旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int,   bool,   char   等),还只能是常量。  
  在上面的语法不能使用的情况下,可以在定义时赋初值:  
   
   
  class   EngineeringConstants   {   //   this   goes   in   the   class  
  private://   header   file  
  static   const   double   FUDGE_FACTOR;  
  ...  
  };  
  //   this   goes   in   the   class   implementation   file  
  const   double   EngineeringConstants::FUDGE_FACTOR   =   1.35;  
   
  大多数情况下你只要做这么多。唯一例外的是当你的类在编译时需要用到这个类的常量的情况,例如上面GamePlayer::scores数组的声明(编译过程中编译器一定要知道数组的大小)。所以,为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:  
   
   
  class   GamePlayer   {  
  private:  
  enum   {   NUM_TURNS   =   5   }//   "the   enum   hack"   —   makes  
  //   NUM_TURNS   a   symbolic   name    
  //   for   5  
  int   scores;//   fine  
  };  
   
  除非你正在用老的编译器(即写于1995年之前),你不必借用enum。当然,知道有这种方法还是值得的,因为这种可以追溯到很久以前的时代的代码可是不常见的哟。  
   
  回到预处理的话题上来。另一个普遍的#define指令的用法是用它来实现那些看起来象函数而又不会导致函数调用的宏。典型的例子是计算两个对象的最大值:  
   
   
  #define   max(a,b)   ((a)   >   (b)   ?   (a)   :   (b))  
   
  这个语句有很多缺陷,光想想都让人头疼,甚至比在高峰时间到高速公路去开车还让人痛苦。  
  无论什么时候你写了象这样的宏,你必须记住在写宏体时对每个参数都要加上括号;否则,别人调用你的宏时如果用了表达式就会造成很大的麻烦。但是即使你象这样做了,还会有象下面这样奇怪的事发生:  
   
  int   a   =   5,   b   =   0;  
  max(++a,   b);//   a   的值增加了2次  
  max(++a,   b+10);   //   a   的值只增加了1次  
   
  这种情况下,max内部发生些什么取决于它比较的是什么值!  
  幸运的是你不必再忍受这样愚笨的语句了。你可以用普通函数实现宏的效率,再加上可预计的行为和类型安全,这就是内联函数(见条款33):  
   
   
  inline   int   max(int   a,   int   b)   {   return   a   >   b   ?   a   :   b;   }  
  不过这和上面的宏不大一样,因为这个版本的max只能处理int类型。但模板可以很轻巧地解决这个问题:  
   
   
  template<class   T>  
  inline   const   T&   max(const   T&   a,   const   T&   b)  
  {   return   a   >   b   ?   a   :   b;   }  
   
  这个模板产生了一整套函数,每个函数拿两个可以转换成同种类型的对象进行比较然后返回较大的(常量)对象的引用。因为不知道T的类型,返回时传递引用可以提高效率(见条款22)。  
   
  顺便说一句,在你打算用模板写象max这样有用的通用函数时,先检查一下标准库(见条款49),看看他们是不是已经存在。比如说上面说的max,你会惊喜地发现你可以后人乘凉:max是C++标准库的一部分。  
  有了const和inline,你对预处理的需要减少了,但也不能完全没有它。抛弃#include的日子还很远,#ifdef/#ifndef在控制编译的过程中还扮演重要角色。预处理还不能退休,但你一定要计划给它经常放长假。  
   
  ================================================================  
   
    论坛助手   Ver   1.0   B0402提供下载。   改进了很多,功能完备!  
   
  ★     浏览帖子速度极快!。   ★     多种帖子实现界面。    
  ★     保存帖子到本地★     监视您关注帖子的回复更新。  
  ★     可以直接发贴、回复帖子★     采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录!    
  ★     支持在线检测程序升级情况,可及时获得程序更新的信息。  
   
  ★★   签名     ●      
            可以在您的每个帖子的后面自动加上一个自己设计的签名哟。  
   
  Http:/Top

责任编辑: efish 参与评论 查找更多:
相关文章
请问我的程序在编译的时候,有一个错误是class type … 请问我的程序在编译的时候,有一个错误是class type redefinition
同时操作一种企业管理软件,我开销售单你即时可以在… 同时操作一种企业管理软件,我开销售单你即时可以在本地机器上看到
到底用pb访问远程sybase数据库有哪些方法? 到底用pb访问远程sybase数据库有哪些方法?
一个数组的问题,请高手们来讨论! 一个数组的问题,请高手们来讨论!
在一个MFC程序中,我从CToolBar类派生出CEnToolBar类… 在一个MFC程序中,我从CToolBar类派生出CEnToolBar类,但是怎么也无法把新的工具条(CEnToolBar)加入到程序窗口中,该如何解决呢???
如何编程向一几个INPUT连连发信息攻击? 如何编程向一几个INPUT连连发信息攻击?
请教:delphi 6+interbase通过BDE单机发布需要哪些文… 请教:delphi 6+interbase通过BDE单机发布需要哪些文件及如何配置?
STL使用问题 STL使用问题
关于recordset的addnew 关于recordset的addnew
在线等待,请各位大虾帮忙!!!!!!!!! 在线等待,请各位大虾帮忙!!!!!!!!!
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn

分类导航
Readygo技术搜索引擎