读C++标准系列 - 2.13 Literals

返回目录

C++支持以下5种类型的常数:
  1. 整型常数
  2. 字符常数
  3. 浮点常数
  4. 字符串常数
  5. 布尔常数

1、整型常数
(注:因为long long是C++0X才正式加入的,所以目前不同的编译器对它的支持和标准的描述还有些出入)

有三类整型常数:
十进制,以1~9开头
八进制,以0开头
十六进制,以0x或者0X开头

你可以在整型常数后面加上后缀来明确它的类型(2.13.1-2)。
如果你不显式指定类型后缀的话,十进制整型常数会自动根据你常数的大小从int,long,long long中选择合适的类型,而八进制与十六进制常数会同时从有符号和无符号的类型中选择。
如果你指定了l后缀,那么不会考虑int和unsigned int;如果指定了ll后缀,那么只会考虑long long和unsigned long long。
如果你指定了u后缀,那么只会从无符号类型中选择。
如果所有合适的类型都不足以存放整型常数,那么会自动使用扩展的整型类型(2.13.1-3,扩展的整型类型定义参见3.9.1-2和3.9.1-3)。如果具体的实现没有提供扩展的整数类型,或者扩展的整数类型依然无法存放整型常数,那么程序是ill-formed

注意,u和l的位置可以互换,所以ul和lu都是可以的。(但是VC8目前还不支持llu,只支持ull)

看看你是不是能正确说出下面这些整型常数的类型?
1
1U
1LU
1ULL
2147483647
2147483648
017777777777
020000000000
0x7FFFFFFF
0xFFFFFFFF
4294967296
0x7FFFFFFFFFFFFFFF
0xFFFFFFFFFFFFFFFF

2、字符常数
字符常数就是大家通常所写的'a'、'/n'等等。
在C++0X标准中,除了普通的类型为char的字符常数之外,还新增了
u'a'
U'a'
L'a'
三种字符常数,它们的类型分别为char16_t、char32_t和wchar_t

需要注意的是,我们可以在''中指定多个字符,譬如'abcd',这种字符常数称为“multicharacter literal”。类型默认为int,取值取决于具体的实现

转义字符
转义字符以/开始,标准支持以下几种转义字符(参见2.13.2-3 Table6)
/n、/t、/v、/b、/r、/f、/a、//、/?、/'、/"
以及/ooo和/xhhh
/ooo用于表示八进制数,/后面可以跟1到3个八进制字符(2.13.2-4)
/xhhh用于表示十六进制数,/后面跟x和若干个十六进制字符

3、浮点常数
浮点数如何表示大家可能都很熟悉了。
需要注意的是,不加后缀默认类型为double,后缀f或者F表示float,后缀l或者L表示long double(2.13.3-1)

4、字符串常数
和字符常数类似,新标准中加入了带u、U和L前缀的字符串常数(2.13.4-1)

需要注意的是,字符串常数的类型是“array of n const char_type”,具体的char_type取决于前缀。字符串常数位于静态存储区。(2.13.4-2~5)
虽然你可以将字符串常数赋给char_type *的指针,但是如果你通过该指针修改字符串常数的话,会导致未知的行为(2.13.4-6)
下面的程序展示了常见的对字符串常数的误用:
char *p="hello";
p[0]='a';

同时,包含相同内容的字符串常数是否指向同一块内存区域是实现相关的,因此下面的判断是否成立,取决于具体的实现:
if (""=="") printf("The Same");

字符串常数有一个很有趣的属性,就是相邻的两个字符串常数会自动连接,比如"a""b"<==>"ab"(2.13.4-7)
新标准规定,两个字符串常数如果拥有相同的前缀,就可以自动连接,类型取决于前缀。如果其中一个字符串常数不带后缀,那么也可以自动连接,类型取决于另一个带前缀的字符串常数。其它组合是否支持取决于具体的实现

5、布尔常数
这个最简单,就true和false两种(2.13.5-1)
发布了40 篇原创文章 · 获赞 5 · 访问量 21万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章