2.1.4 字面值
字面值(literal value)用于表示源代码中的一个固定值。例如,假定你希望用System.Console. WriteLine()输出整数值42和double值1.618 034(Phi),那么可以使用如代码清单2-1所示的代码。
代码清单2-1 指定字面值
System.Console.WriteLine(42); |
输出2-1展示了代码清单2-1的结果。
输出2-1
42 |
初学者主题:在硬编码值的时候要慎重
直接将一个值放到源代码中的行为称为硬编码(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); |
1.61803398874989 |
要查看具有完整精度的数字,必须将字面值显式地声明为decimal类型,这是通过追加一个m(或者M)来实现的,如代码清单2-3和输出2-3所示。
代码清单2-3 指定一个decimal字面量
System.Console.WriteLine(1.618033988749895m); |
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); |
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. |
输出2-5展示了结果。
输出2-5
42 |
注意,代码输出的仍然是42,而不是0x002A。
高级主题:将数格式化成十六进制
要想显示一个数的十六进制形式,需要使用x或X数值格式说明符。大小写决定了十六进制字母的大小写形式。代码清单2-6展示了一个例子。
代码清单2-6 十六进制格式说明符的例子
// Displays"0x2A" |
输出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格式说明符进行格式化
// ... text = string.Format("{0}", number); text = string.Format("{0:R}", number); |
输出2-7显示了结果。
输出2-7
True: result != number |
| 回书目 上一节 下一节 |
|
||||
| · 龙芯要做中国的“奔腾” · 2008年上半年IT技术图.. · 虚拟化的“赤壁之战” · 服务器节能与绿色IT · 微软出价446亿美元收购.. · 脉冲无线电uwb专题 · 802.11n:下一代的无线.. · 云计算时代来临 |
· IT工程师该不该考CCIE.. · 浏览器的战国时代 · 2008年上半年全国软考.. · 无线网络环境 · 无线网状网(MESH) · 无线重中之重:安全问题 · 网络故障排除宝典 · Windows Server 2008专.. |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · 无线网状网(MESH) · Windows远程桌面应用 · C#技术开发指南 |
· Apache技术专题 · Windows集群服务应用 · C#技术开发指南 · 文档格式标准开战 OOXM.. · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 解析35岁技术人的价值.. |
|||