c++中两种常量方法的比较
常量是定以后,在程序运行中不能被改变的标识符。C++中定义常量可以用#define 、const 这两种方法。例如: #define PRICE 10 //定义单价常量10 const int PRICE = 10; //定义单价常量10 其实用常量是有它的理由的,下面我们来看下面两段程序对比
代码
#include <iostream>
using namespace std;
#define PI 3.14159
//const double PI = 3.14159;
int main(int argc, char* argv[])
{ double square = 0,volume =0, radius=0;
cout<<"请输入半径长度"<<endl;
cin>>radius;
square = 3.14159 * radius * radius;
cout<<"半径长度为:"<<radius<<"的圆面积是:"<<square<<endl;
volume = 4 * 3.14159 * radius * radius * radius /3;
cout<<"半径长度为:"<<radius<<"的球体积是:"<<volume<<endl;
}
代码
#include <iostream>
using namespace std;
#define PI 3.14159
//const double PI = 3.14159;
int main(int argc, char* argv[])
{ double square = 0,volume =0, radius=0;
cout<<"请输入半径长度"<<endl;
cin>>radius;
square = PI * radius * radius;
cout<<"半径长度为:"<<radius<<"的圆面积是:"<<square<<endl;
volume = 4 * PI * radius * radius * radius /3;
cout<<"半径长度为:"<<radius<<"的球体积是:"<<volume<<endl;
}
显然如果我还要求球、圆柱体的面积等,用常量的好处就显而易见,用常量的有下面一些好处: 1:增强程序的可读性。用一个有意义的常量代理一串无意义的字符串,显然很多时候程序员忘了或是不理解这一串字符串代表什么意义。 2:如果很多地方用到像PI(3.14159)这样的常量,难保输入错误,尤其复杂的很长的字符串时,而用常量则能一改而全部改变、减少出错的几率。
其中#define是定义宏变量,它其实是在编译之前,由预处理指令把代码里面的宏变量用指定的字符串替换,它不做语法检查,而constant 则是定义含有变量类型的常量。一般说来推荐使用constant定义常量,它在编译时会做语法检查。Effective c++ 的条款1中:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。而且有时候用宏,会出现意想不到的输出结果。
#define 与 const 的比较
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 (2) 有些集成化的调试工具可以对 const 常量进行调试, 但是不能对宏常量进行调试。
c++中两种常量方法的比较的更多相关文章
- JAVA 中两种判断输入的是否是数字的方法__正则化_
JAVA 中两种判断输入的是否是数字的方法 package t0806; import java.io.*; import java.util.regex.*; public class zhengz ...
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- Linux系统中存储设备的两种表示方法
转:https://blog.csdn.net/holybin/article/details/38637381 一.对于IDE接口的硬盘的两种表示方法: 1.IDE接口硬盘,对于整块硬盘的两种表示方 ...
- JS中的两种刷新方法以及区别和适用范围
在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...
- 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C#中Trim()、TrimStart()、TrimEnd()的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c#中 总结
史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...
- HTML中label的两种使用方法
如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. 有两种使用方法: 方法1: <label for=" ...
- 两种常量类型-readonly和const
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...
- 菜鸡的Java笔记 第十三 String 类的两种实例化方法
String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /* 1.String 类的两种实例化方式的区别 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
随机推荐
- 【Origin】 画道
-夏之时,晚归途中,观云,感雨,识迷障,题以记之. 原道是东边日出西边雨, 却原来乌云蔽日雨不息; 只不过光芒也破云边洒, 可还是满地泥泞水花起. --作于二零一六年七月十一日
- linux第11天 共享内存和信号量
今天主要学习了共享内存和信号量 在此之前,有个管道问题 ls | grep a 整句话的意思是将ls输出到管道的写端,而流通到另一端的读端,grep a则是从管道的读端读取相关数据,再做筛选 共享内存 ...
- kafka迁移数据目录
问题 先前存储kafka日志的磁盘空间太小,zabbix警报不断,于是加了磁盘,将日志存到新磁盘上. 解决方案 依次在每台机器上操作,保证有机器能响应producer和consumer的操作. 加磁盘 ...
- struts2中的addActionError 、addFieldError、addActionMessage的方法
一 addActionError ①概念addActionError是Action级别的错误消息 ②添加this.addActionError("错误信息"); ③显示<s: ...
- 《科学》封面:人工智能终于能像人类一样学习 zz
原文地址:http://tech.sina.com.cn/d/i/2015-12-12/doc-ifxmpnqi6368668.shtml science Human-level concept ...
- c 语言 结构体
一:结构体定义结构体类型变量 三种方式1st:先声明结构体类型,再定义该类型的变量struct student liming,zhangle;2nd:声明类型的同时定义变量struct student ...
- android SDK安装容易出错的原因
1.实际上,安卓SDK安装之后,拷贝到其他的机子上面.配置一下环境变量,就可以跑起来的 2.但是拷贝到其他的机子上面临着一个问题就是Eclipse已经配置了的android环境,需要在新的机子上面修改 ...
- 图像处理工具包ImagXpress中如何定义图像显示属性
图像处理工具包ImagXpress中如何定义图像显示属性,如色彩管理.设置工具栏和工具.设置上下文&工具栏菜单.配置滚动条.鼠标和键等······ 在显示图像时的色彩管理 在ImagXpres ...
- 去除冗余 – 精简您的CSS样式代码
讲讲常见的一些没有必要使用CSS代码情况,而这些不起作用可以去掉的CSS代码可能是我们经常忽视的.越是对CSS理解不够,越容易出现这些问题. 二.一些常见不必要CSS样式 1.与默认CSS样式一致 我 ...
- Python 进阶(五)定制类
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF/CAIAAACUs6uhAAAgAElEQVR4nOzdZXubx7ov8PPV9tlrt0 ...