C++0x导读 - 2.13 常数

来源:互联网 发布:园林景观软件 编辑:程序博客网 时间:2024/05/01 16:33

返回目录

C++0x支持以下7种类型的常数(其中后两种是C++0x新增的):

整型常数
字符常数
浮点常数
字符串常数
布尔常数
指针常数
自定义常数

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都是可以的。(但是目前VC还不支持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',这种称为多字符常数。类型默认为int,取值取决于具体的实现

转义字符以/开始,标准支持以下几种转义字符(参见2.13.2 Table6)

/n、/t、/v、/b、/r、/f、/a、//、/?、/'、/"以及/ooo和/xhhh

/ooo用于表示八进制数,/后面可以跟1到3个八进制字符(2.13.2-4)。/xhhh用于表示十六进制数,/后面跟x和若干个十六进制字符

3、浮点常数

浮点数如何表示大家可能都很熟悉了。

如果指定的浮点数无法用相应的类型精确表达,那么实现可以自由选择较大或者较小的最接近的数替代。如果浮点数太大超出了可以表示的范围,那么程序是ill-formed

需要注意的是,不加后缀默认类型为double,后缀f或者F表示float,后缀l或者L表示long double(2.13.3-1)

4、字符串常数

和字符常数类似,新标准中加入了带u8、u、U和L前缀的字符串常数,以及带R、u8R、uR、UR和LR的可以屏蔽转义的字符串常数(2.13.4-1)

需要注意的是,字符串常数的类型是“array of n const char_type”,具体的char_type取决于前缀(其中u8前缀的char_type仍然是char,不过字符串将采用UTF8编码)。字符串常数位于静态存储区。(2.13.4-6~9)

虽然你可以将字符串常数赋给char_type *的指针,但是如果你通过该指针修改字符串常数的话,会导致未知的行为。下面的程序展示了常见的对字符串常数的误用:

char *p="hello";
p[0]='a';

在早期的VC中,"hello"存放在.data段里,因此上面的代码不会导致运行期错误。但是现在的VC会将"hello"存放在.rdata段里。这个段是只读的,因此上面的代码就会出错。

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

if (""=="") printf("The Same");

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

注:u8前缀不能和宽字符串相邻

5、布尔常数

这个很简单,就true和false两种(2.13.5-1)

6、指针常数

这个最简单,只有一个:nullptr。用于代替NULL的作用。它的类型是std::nullptr_t(2.13.6-1)

7、自定义常数

目前没有编译器支持,这里就不介绍了

原创粉丝点击