频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

2.1.4 字面值

作者: (美)米凯利斯(Michaelis, M.)著/周靖译 出处:人民邮电出版社  2008-07-18 16:57    砖    好    评论   进入论坛
阅读提示:《C#本质论》第2章数据类型,这一章将探讨基本的C#类型,继续学习C#的基础知识,本小节为大家介绍字面值。

2.1.4 字面值

字面值(literal value)用于表示源代码中的一个固定值。例如,假定你希望用System.Console. WriteLine()输出整数值42和double值1.618 034(Phi),那么可以使用如代码清单2-1所示的代码。

代码清单2-1 指定字面值

 System.Console.WriteLine(42);
System.Console.WriteLine(1.618034);

输出2-1展示了代码清单2-1的结果。

输出2-1

42
1.618034

初学者主题:在硬编码值的时候要慎重

直接将一个值放到源代码中的行为称为硬编码(hardcoding),因为以后若要更改值,就必须重新编译代码。因为可能会为维护带来不便,所以开发者在硬编码值的时候必须慎重。例如,可以考虑从一个外部来源获取值,比如从一个配置文件中。这样一来,以后需要修改值的时候,就不需要重新编译代码了。

默认情况下,如果输入一个带小数点的字面值,编译器会自动把它解释成double类型。相反,一个整数值(没有小数点)通常默认为int,前提是该值不是太大,以至于无法用int来存储。如果值太大,编译器会把它解释成long。此外,C#编译器允许向一个非int的数值类型赋值,前提是字面值对于目标数据类型来说是合法的。例如,short s = 42和byte b = 77都是允许的。然而,这一点只对字面值才是成立的。如果不使用额外的语法,b = s就是非法的,具体请参见2.6节。

前面讲过,C#有许多不同的数值类型。在代码清单2-2中,一个字面值被直接放到C#代码中。由于带小数点的数默认为double数据类型,所以如输出2-2所示,输出是1.61803398874989(最后一个数字5丢失了),这符合我们预期的double值的精度。


代码清单2-2 指定一个double字面量

 System.Console.WriteLine(1.618033988749895); 
输出2-2
1.61803398874989

要查看具有完整精度的数字,必须将字面值显式地声明为decimal类型,这是通过追加一个m(或者M)来实现的,如代码清单2-3和输出2-3所示。

代码清单2-3 指定一个decimal字面量

 System.Console.WriteLine(1.618033988749895m);
输出2-3
 1.618033988749895

现在,代码清单2-3的输出与预期的结果相同:1.618033988749895。注意,d表示double,之所以用m表示decimal,是因为这种数据类型经常用在货币(monetary)计算中。

还可以使用f和d作为后缀,将一个字面量显式地声明为float或者double。对于整数数据类型,相应的后缀是u、l、lu和ul。整数字面量的类型是像下面这样确定的。
 
没有后缀的数值字面量按照以下顺序,解析成能够存储该值的第一个数据类型:int、uint、long、ulong。
 
具有后缀u的数值字面量按照以下顺序,解析成能够存储该值的第一个数据类型:uint、ulong。
 
具有后缀l的数值字面量按照以下顺序,解析成能够存储该值的第一个数据类型:long、ulong。
 
如果数值字面量的后缀是ul或lu,就解析成ulong类型。

注意,字面量的后缀是不区分大小写的。然而,对于long来说,一般推荐使用大写字母L,因为小写字母l和数字1不好区分。
某些情况下,你会考虑使用指数记数法,避免在小数点前后写许多个0。为了使用指数记数法,需要使用e或E中缀,在中缀字母后面添加一个正整数或者负整数,并在字面量的最后添加恰当的数据类型后缀。例如,可以将Avagadro常数作为一个float输出,如代码清单2-4和输出2-4所示。

代码清单2-4 指数记数法

System.Console.WriteLine(6.023E23f);
输出2-4
6.023E+23

初学者主题:十六进制记数法

我们一般使用的都是十进制记数法。换言之,数中的每位数字都可以使用10个符号(0~9)来表示。除此之外,还可以使用十六进制记数法。换言之,每位数字都可以使用16个符号来表示:0~9,A~F(也可以用小写)。所以,0x000A对应于十进制值10,而0x002A对应于十进制值42。不过,实际的数是相同的。十六进制和十进制的相互转换不会改变数本身,改变的只是数的表示。

每位十六进制数字都是4个比特位,所以一个字节可以表示两位十六进制数字。

前面讨论数值字面量的时候,我只提到了十进制值。事实上,C#还允许指定十六进制值。为了指定一个十六进制值,要为值附加0x前缀,再添加你希望使用的任何十六进制数字,如代码清单2-5所示。

代码清单2-5 十六进制字面量

 // Display the value 42 using a hexadecimal literal.
System.Console.WriteLine(0x002A);

输出2-5展示了结果。

输出2-5

 42

注意,代码输出的仍然是42,而不是0x002A。

高级主题:将数格式化成十六进制

要想显示一个数的十六进制形式,需要使用x或X数值格式说明符。大小写决定了十六进制字母的大小写形式。代码清单2-6展示了一个例子。

代码清单2-6 十六进制格式说明符的例子

 // Displays"0x2A"
System.Console.WriteLine("0x{0:X}", 42);

输出2-6展示了结果。

输出2-6

 0x2A

要注意的是,数值字面量(42)可以随意采用十进制或十六进制形式,结果是一样的。

高级主题:Round-Trip(往返行程)格式化

默认情况下,System.Console.WriteLine(1.618033988749895);会显示1.61803398874989,最后一个数位会被丢弃。为了更准确地判断与一个double值对应的字符串形式,我们可以使用一个格式字符串和一个Round-Trip格式说明符R(或者r进行转换)。例如,string.Format("{0:R}", 1.618033988749895)会返回结果1.6180339887498949,这个结果是一个字符串,假如将该字符串转换回数值,那么你肯定能获得原始值。代码清单2-7对此进行了演示。

代码清单2-7 使用R格式说明符进行格式化

// ...
const double number = 1.618033988749895;
double result;
string text;

text = string.Format("{0}", number);
result = double.Parse(text);
System.Console.WriteLine("{0}: result != number",
result != number);

text = string.Format("{0:R}", number);
result = double.Parse(text);
System.Console.WriteLine("{0}: result == number",
result == number);
// ...

输出2-7显示了结果。

输出2-7

 True: result != number
True: result == number
第一次为text赋值的时候,没有使用R格式说明符,所以double.Parse(text)的返回值与原始数值不同。相反,在使用了R格式说明符之后,double.Parse(text)返回的就是原始值。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
程序员如何成长?
C#实用基础教程
C#技术开发指南
C#本质论
Windows Vista之兵法
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
CCNA认证考试Pass必备
CCNA认证考试Pass必备
求职必杀技 决战面试官
求职必杀技 决战面试官
龙芯要做中国的“奔腾”
龙芯要做中国的“奔腾”
· 龙芯要做中国的“奔腾”
· 2008年上半年IT技术图..
· 虚拟化的“赤壁之战”
· 服务器节能与绿色IT
· 微软出价446亿美元收购..
· 脉冲无线电uwb专题
· 802.11n:下一代的无线..
· 云计算时代来临
· IT工程师该不该考CCIE..
· 浏览器的战国时代
· 2008年上半年全国软考..
· 无线网络环境
· 无线网状网(MESH)
· 无线重中之重:安全问题
· 网络故障排除宝典
· Windows Server 2008专..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· 无线网状网(MESH)
· Windows远程桌面应用
· C#技术开发指南
· Apache技术专题
· Windows集群服务应用
· C#技术开发指南
· 文档格式标准开战 OOXM..
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· C#技术开发指南
· 三层交换技术专题
· Apache技术专题
· C#技术开发指南
· Windows远程桌面应用
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 解析35岁技术人的价值..