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

问题描述

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的功能(也就是怎么让一个变量在
程序的执行过程中只能读,不能写,这个问题自己想把)。

时间: 2024-10-31 02:23:13

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

php中define()与const的区别详解

define()与const的区别: define() 在执行期定义常量,而 const 在编译期定义常量.这样 const 就有轻微的速度优势(即性能稍微好点),但不值得考虑这个问题,除非你在构建大高并发系统. define() 将常量放入全局作用域,即使在命名空间中使用define方法定义常量也属于全局作用域的.不能使用 define() 定义类常量(类常量使用const定义),命名空间作用域内的常量使用const定义如: namespace const ABC='100′;. define

C++中const用法小结_C 语言

const在C++中使用十分广泛,不同位置使用的意义也不尽相同,所以想写篇文章对其做一个总结. 首先,明确const是"不变"这个基本意义,但是不变不意味着什么都不变,下面将会看到. 1. const与变量 基本原则:const变量(对象)不能被修改 const在变量中的引入和魔数有关,所谓"魔数"指的是突然出现的一个常量值(也叫字面值常量). for(int i = 0; i < 512; i++) { // todo } 上例中,512即为魔数,512突然

php中static和const关键字用法分析_php技巧

本文实例讲述了php中static和const关键字用法.分享给大家供大家参考,具体如下: static关键字在类中描述的成员属性和成员函数都是静态的. static成员能限制外部的访问,因为static成员是属于类的,而不是属于任何对象实例. 从内存的角度讲,其中对象是放在"堆内存"中,对象的引用是放在"栈内存"中,而静态成员被放在初始化静态段中,在类的第一次加载的时候加入的.可以让对内存中的所有对象所共享.如下图所示: <?php class Person

C++类中的static和const用法实例教程_C 语言

static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法.供大家参考借鉴.具体说明如下: 首先以代码用来举例说明.示例代码如下: class A { public: A():m(10) //const成员必须在构造函数的初始化构造列表中初始化 { q = 40; } void fun1()const { m++; //错误.const成员是常量,不能改变其值. n++; //正确.static变量n属于类,但是每个对象的函数都可以访

php中define用法实例_php技巧

本文实例讲述了php中define用法.分享给大家供大家参考.具体如下: <?php /* * define * */ /*第3个参数: * false -- 对大小写敏感(默认) * true -- 对大小写不敏感 * */ define("pai",3.14); define ("name","LiLei",true); function testfor($x) { for($a=$x;$a<=12;$a++) { echo &q

C语言中正确使用const

基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助. 虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题. 问题:const变量 & 常量 为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? const int n = 5; int a[n]

PHP模板引擎Smarty中的保留变量用法分析_php实例

本文实例讲述了PHP模板引擎Smarty中的保留变量用法.分享给大家供大家参考,具体如下: 在 Smarty 中,有一些保留变量,它们是不需要 PHP 脚本去分配就可以直接使用,即不用使用 $_tpl->assign('var','value') 去分配. 1.在模板中访问页面请求的变量 {$smarty.get.user} == $_GET['user'] {$smarty.post.user} == $_POST['user'] {$smarty.cookie.username} == $_

理解PHP5中static和const关键字

php5|关键字 PHP5中加入了很多面向对象的思想,PHP5的面向对象比较接近Java的面向对象思想.我们这里对PHP5中的static和const关键字作用进行一下描述,希望对学习PHP5的朋友有帮助. (1) staticstatic关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护.类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方

Python中的装饰器用法详解_python

本文实例讲述了Python中的装饰器用法.分享给大家供大家参考.具体分析如下: 这里还是先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: 复制代码 代码如下: @makebold @makeitalic def say():    return "Hello" 打印出如下的输出: <b><i>Hello<i></b> 你会怎么做?最后给出的答案是: 复制代码 代码如下: def makebold(fn):