问题描述
- c++中#define 与const用法有什么区别? 如下的程序错在了什么地方?
-
#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");
}
解决方案
错误是多了分号,楼上的已经说了,说下区别
(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常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
解决方案二:
define定义的常量没有数据类型,不方便理解,如果日后需要修改常量类型需要每个用到常量的地方都修改十分麻烦,const克服了define的缺点只需要修改一条语句,带有常量类型更容易理解,在c++中更推荐使用const而不是define
解决方案三:
常量const意思是只读比较类似,而define是碰见这样的就强制展开
解决方案四:
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++中定义常量的方法
解决方案五:
#define表达式最后不需要加 ;
解决方案六:
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
解决方案七:
#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("%dn", MAX(3, 2))//会输出3.
事实上,#define的功能很强大,因为只是做了一些文本工作,所以是类型无关的,比如上面的MAX(a,b)也可以用来比较double类型的数据。
顺便一提,很多标准库中很多东西都是宏定义。
const是一个修饰符,用于表明一个变量不可修改,这是这么简单。一个有趣的问题是,编译器要怎么实现const的功能(也就是怎么让一个变量在
程序的执行过程中只能读,不能写,这个问题自己想把)。