2 tianliangcsdn tianliangcsdn 于 2016.03.21 15:59 提问

c++中#define 与const用法有什么区别? 如下的程序错在了什么地方?
c++

#include
using namespace std;
#define pi 3.1415;
const float PI=3.14;
int main()
{ system("color 4A");
float s1,s2,r;
cin>>r;
s1=PI*r*r;
s2=pi*r*r;
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
system("pause");
}

7个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.21 16:18

错误是多了分号,楼上的已经说了,说下区别
(1) 编译器处理方式不同
  define宏是在预处理阶段展开。
  const常量是编译运行阶段使用。
(2) 类型和安全检查不同
  define宏没有类型,不做任何类型检查,仅仅是展开,这样预处理在C++中成为可能引发错误的隐患。
  const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
  const常量会在内存中分配(可以是堆中也可以是栈中)。
(4)const 可以节省空间,避免不必要的内存分配。 例如:

#define PI 3.14159 //常量宏

const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......

double i=Pi; //此时为Pi分配内存,以后不再分配!

double I=PI; //编译期间进行宏替换,分配内存

double j=Pi; //没有内存分配

double J=PI; //再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

MetroArtyom
MetroArtyom   2016.03.21 16:20

define定义的常量没有数据类型,不方便理解,如果日后需要修改常量类型需要每个用到常量的地方都修改十分麻烦,const克服了define的缺点只需要修改一条语句,带有常量类型更容易理解,在c++中更推荐使用const而不是define

wangyaninglm
wangyaninglm   Ds   Rxr 2016.03.21 16:02

常量const意思是只读比较类似,而define是碰见这样的就强制展开

tianliangcsdn
tianliangcsdn 能说详细一点吗 下面的程序错哪了
2 年多之前 回复
lx624909677
lx624909677   Ds   Rxr 2016.03.21 16:13

using namespace std;
#define pi 3.1415
const float PI=3.14;
int main()
{ system("color 4A");
float s1,s2,r;
cin>>r;
s1=PI*r*r;
s2=pi*r*r;
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
system("pause");
}
#define是C语言中进行常量定义的方法,const是C++中定义常量的方法

u014714226
u014714226   2016.03.21 16:14

#define表达式最后不需要加 ;

enpterexpress
enpterexpress   Rxr 2016.03.21 16:24

define宏是在预处理阶段展开。
const常量是编译运行阶段使用。

w1eix1iao
w1eix1iao   2016.03.26 17:51

#define 是预处理阶段执行的. 所谓预处理就是在编译前处理,这个过程没有什么神奇的,就是做一些文本工作。
例如:#define a A。

编译器注意到这个宏定义,当程序出现a的地方,就会用A代替a。只是简单地做一些文本工作。通常,我们会将一个标示符定义为某个数字,如:
#define bufsize 1000
在程序出现bufsize的地方会用1000来代替,一个有趣的地方是,1000是一个字面值常量,编译器会开辟内存用于存储1000这个值的。这也是为什么
#define bufsize 1000.0和上面的写法是完全不同的,1000会默认作为int型,1000.0默认是浮点型(我忘了是双精度还是单精度)。
要真正理解#define做了文本工作,可以考虑下列例子。
#define MAX(a,b) a>b ? a:b
程序出现,MAX(a,b) 的地方会变成 a>b ? a:b
可以这样使用: printf("%d\n", MAX(3, 2))//会输出3.
事实上,#define的功能很强大,因为只是做了一些文本工作,所以是类型无关的,比如上面的MAX(a,b)也可以用来比较double类型的数据。

顺便一提,很多标准库中很多东西都是宏定义。

const是一个修饰符,用于表明一个变量不可修改,这是这么简单。一个有趣的问题是,编译器要怎么实现const的功能(也就是怎么让一个变量在
程序的执行过程中只能读,不能写,这个问题自己想把)。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++Primer学习之二#define,const,constexpr
一.#define 是预处理操作符(宏定义),编译器将在编译过程中用到该变量的地方替换成对应的值。 二.Const const是声明常量的限定符,它可以约定一个变量为常量。 如: Const int buffsize = 1024; 编译器将在编译过程中用到该变量的地方替换成对应的值,这个效果和#define,constexpr是一致的。 const常量只有在const i
C语言中 关于const和#define的区别心得
尽量用const和inline而不用#define 这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好像不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及
C++ const 和 constexpr 的区别
语义上: constexpr:告诉编译器我可以是编译期间可知的,尽情的优化我吧。 const:告诉程序员没人动得了我,放心的把我传出去;或者放心的把变量交给我,我啥也不动就瞅瞅。 语法上: constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的 evaluate at compile time. 在constexpr 出现之前, 可以
C语言 #define 与 const的区别
1.编译器处理方式不同 define宏是预处理阶段展开 const常量是编译运行阶段使用define是宏定义,程序在预处理阶段将用define定义的内容进行替换,因此程序运行时常量表中并没有用define定义的常量,系统不为其分配内存。 const常量是编译运行时的常量,系统为其分配内存。2.类型跟安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开 const常量有具体的类
宏定义中是使用 const(static) 还是 使用 define
const 和 define 在开发中常用来定义常量,这样做的好处是:使代码更易维护、提高代码的效率。 1、const const是C/C++中的一个关键字(修饰符), const一般用来定义一个常量, 既然叫做常量, 即以后再也不能修改其值。 const 定义常量时,编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内
高质量C++_C编程指南.doc
经典论述了,如下问题: BOOL , float, 指针变量 与“零值”比较的 if 语句。 头文件中的 ifndef/define/endif 干什么用? #include <filename.h> 和 include “filename.h” 有什么区别? const 有什么用途?
const 与#define的异同
const 与#define的异同相同点:const与define都能用来定义常量 不同点: 1. define是在预处理展开,const是在编译运行阶段处理 2.const常量是有类型的,会进行类型安全检查。但是define没有类型,不进行安全检查。 3.define可以用来定义简单的函数 4.define仅仅是替换不分配内存,在使用的地方进行展开。const是占有内存的。const比d
#define 和 const 定义常量比较。
在C++中可以使用#define或者const来定义常量,但是使用const相比起#define有更多的优点。——–<Effective C++>以下部分内容选自<程序猿面试宝典> const 常量有数据类型,而宏常量是没有数据类型。编译器可以对前者进行类型安全检查,而后者仅仅进行字符替换,没有类型安全检查,并且在字符替换过程中会产生一些意料不到的错误。(边际效应) #define X 10 #de
typedef和#define究竟有什么区别?
typedef int * int_ptr ; 与#define int_ptr int * 作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理 时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。
iOS- define宏定义和const常变量区别
define宏定义和const常变量区别: 1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。 const定义的常量,在程序运行时在常量表中,系统为它分配内存。 2.define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。 const定义的常量,在编译时进行