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 能说详细一点吗 下面的程序错哪了
一年多之前 回复
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   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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!