必备技能2.2 :实字
实字是指固定的,人类可以阅读的,不可改变的值。例如数值101就是一个整形实字。实字通常也被称作是常量。实字的使用方法很简单直观,前面的几个实例程序中都用到了实字。现在是时候正式介绍一下实字了。
C++中的实字可以是任何的基本数据类型。实字的表示方式取决于它的类型。正如前面所看到的那样,字符实字是用单引号括起来的一个字符。比如:'a'和'%'都是字符型的实字。
整型实字的就是不带小数的数值。例如,10和-100都是整型实字。浮点型实字表示的时候小数点后面要跟小数部分。例如,11.123就是一个浮点类型的实字。C++中允许使用科学计数法来表示浮点类型的实字。
所有的实字都有类型的,这就引入了一个问题。我们都知道,整型类型有分为长整形,短整型和无符号的整型。浮点类型也分为三种:单精度的浮点,双精度的浮点和长形双精度浮点数。那么编译器如何确定一个实字的类型了?比如,123.23是单精度的浮点数还是双精度的浮点数了?这个问题的答案有两部分构成。第一,C++编译器自动地采用缺省的类型;第二,我们可以根据需要明确指定实字的类型。
缺省情况下,对于整型实字,C++编译器会采用最小的可以兼容的数据类型来存放这个实字,最小的从int类型开始。因此,假设整形数为16位,那么10缺省的就是int类型,但是103000就是long类型了。尽管char类型也可以用来表示10,但是编译器不会这样做,因为这意味着跨越了类型的边界。
缺省情况下,浮点类型实字的类型是double的。因此,123.23的类型就是double。
实际上,对于我们初学者来说,编译器的缺省类型对我们来说是相当够用的。只有在编译器缺省取值不满足要求的情况下,我们可以通过明确指定后缀来表示数字型实字的类型。对于浮点类型来说,如果数字的后面跟了F,这个数值就会被认为是float类型的。如果后面跟的是L,那么他就是long double类型的。对于整型类型来说,后跟U表示unsigned,L表示long。在指定一个unsigned long类型的时候,后缀U和L都要使用。下面给出了一些示例:
数据类型 | 常量举例 |
int | 1 123 2100 -234 |
long int | 3500L -34L |
unsigned int | 10000U 987U 40000U |
unsigned long | 12323UL 900000UL |
float | 123.23F 4.3e-3F |
double | 23.23 123123.33 -0.9876324 |
long double | 1001.2L |
16进制和8进制实字
有时候在程序中使用16进制或者8进制比使用10进制更方便一些。8进制就是基于8的数字系统,它使用数字0到7。在10进制中,数字10和8进制中的8是一样的,即数字10(一零)如果是10进制就代表10,如果是 8 进制就代表8。16进制系统中使用数字0到9加上字母A到F来表示10,11,12,13,14和15。例如,16进制数10就是10进制中的16。C++中我们可以指定整形实字是16进制的或者是8进制的。16进制的数值以0x开始。8进制的实字以0开始。下面是一些例子:
hex = 0xFF;//10进制中的255
oct = 011;//10进制中的9
字符串实字
C++除了支持前面提到的内置类型的实字外,还支持另外一种实字:字符串。一个字符串就是用双引号引起来的字符的集合。比如,“this is a test"就是一个字符串。在前面的示例程序中我们在count语句中实际上已经使用到了字符串实字。有一点必须注意:尽管C++允许我们定义字符串常量,但是C++中并没有内置的字符串这种类型。而在后面,我们会看到C++中把字符串作为字符的数组来支持的(C++在类库中提供了string类型来支持字符串)。
专家答疑
问:
我们知道了如何指定一个字符实字。那么wchar_t类型的实字也是用同样的方式来指定的吗?
答:
不是的。一个宽位字符常量(也就是我们说的wchar_t 类型)前面需要加上一个字符L。例如
wchar_t wc;
wc = L'A';
上面的代码为wc赋值了一个宽位的常量值A。在日常的编程中,我们不会用到宽位字符的。但是如果你需要编写多过语言的程序,可能就要用到宽位字符了。
转义字符
单引号引起来的字符常量大多数都是可打印的,但是也有部分字符,比如回车,当在使用文本编辑器的时候就会出现问题。另外,一些其它的字符,比如单引号和双引号在C++中都是有特殊含义的,我们不能直接使用它。基于上述的原因,C++提供了转义字符,有时候也被称作为反斜杠字符常量,如表格2-3所示,我们可以在程序中使用这些转义字符。可以看到,我们之前使用的/n就是一个转义字符。
代码 | 含义 |
\b | 退格 |
\f | 换页 |
\n | 新的一行(换行) |
\r | 回车 |
\t | 水平制表符 |
\" | 双引号 |
\' | 单引号 |
\\ | 反斜杠 |
\v | 垂直制表符 |
\a | 告警 |
\? | 问号 |
\N | 8进制常量 |
\xN | 16进制常量 |
|
|
表2-3 转义字符
专家答疑
问:
由一个字符组成的字符串是否和一个字符常量一样?比如,"k"和'k'一样吗?
答:
不。我们不能把字符和字符串混淆。一个字符实字代表的是一个char类型的单一字母。只有一个字符的字符串依然是字符串,不是字符。经字符串是有字符构成的,但是他们是不同的类型。
下面的程序展示了一个转义字符:
#include <iostream>
using namespace std;
int main()
{
cout << "one\ttwo\tthree\n" ;
cout << "123\b\b45" ; //\b\b将会退格掉2和3
return 0;
}
程序的输入如下:
one two three
145
上面的程序中,第一个cout语句使用了制表符来确定tow和three的位置。第二个cout语句中显示输出了一个123,然后两个退格就删除了2和3,最后输出了字符4和5。
练习:
1. 缺省情况下,实字10的类型是什么?10.0呢?
2. 怎么指定100为long int类型?怎么指定100为unsigned int类型?
3. /b是什么意思?
答案:
1. 10是int类型,10.0是double类型。
2. 指定100为long int:100L;指定100为unsigned int为:100U
3. \b退格的转义字符。