在C++中,字面量(Literal) 是直接出现在代码中的固定值,用于表示各种数据类型的常量。它们可以是数字、字符、字符串、布尔值或特殊类型的值。
1. 整型字面量(Integer Literals)
用于表示整数,支持多种进制和类型后缀:
进制表示:
- 十进制 :普通数字(无前缀),如
42
、100
。 - 八进制 :以
0
开头,如012
表示十进制的10
。 - 十六进制 :以
0x
或0X
开头,如0xFF
表示十进制的255
。 - 二进制 (C++14+):以
0b
或0B
开头,如0b1010
表示十进制的10
。
类型后缀:
u
或U
:unsigned
类型,如42U
。l
或L
:long
类型,如100L
。ll
或LL
:long long
类型,如9999999999LL
。ul
或UL
:unsigned long
类型,如1000000UL
。
示例:
cpp
int decimal = 42; // 十进制
int octal = 012; // 八进制,等于十进制10
int hex = 0xFF; // 十六进制,等于十进制255
int binary = 0b1010; // 二进制,等于十进制10
unsigned long large = 1234567890UL; // unsigned long类型
2. 浮点型字面量(Floating-Point Literals)
用于表示小数,支持两种表示方式和类型后缀:
表示方式:
- 小数形式 :如
3.14
、0.5
、.25
(等价于0.25
)。 - 指数形式 :使用
e
或E
表示科学计数法,如1.23e5
表示1.23×10⁵
(即123000
)。
类型后缀:
f
或F
:float
类型,如3.14F
。l
或L
:long double
类型,如3.14L
。
示例:
cpp
double pi = 3.14; // double类型
float pi_f = 3.14F; // float类型
long double big = 1.23e100L; // long double类型
3. 字符字面量(Character Literals)
用于表示单个字符,用单引号 '
包围:
- 普通字符 :如
'a'
、'0'
、'$'
。 - 转义字符 :以反斜杠
\
开头,如'\n'
(换行符)、'\t'
(制表符)、'\''
(单引号)。 - Unicode字符 (C++11+):
u8'x'
:UTF-8编码,类型为char
。u'x'
:UTF-16编码,类型为char16_t
。U'x'
:UTF-32编码,类型为char32_t
。L'x'
:宽字符,类型为wchar_t
。
示例:
cpp
char c = 'A'; // 普通字符
char newline = '\n'; // 换行符
char16_t euro = u'€'; // UTF-16编码的欧元符号
4. 字符串字面量(String Literals)
用于表示文本,用双引号 "
包围:
- 普通字符串 :如
"Hello"
、"123"
。 - 转义字符 :与字符字面量相同,如
"Hello\nWorld"
。 - 原始字符串 (C++11+):用
R"(...)"
表示,无需转义特殊字符,如R"(C:\path\to\file)"
。 - Unicode字符串 :
u8"text"
:UTF-8编码,类型为const char*
。u"text"
:UTF-16编码,类型为const char16_t*
。U"text"
:UTF-32编码,类型为const char32_t*
。L"text"
:宽字符,类型为const wchar_t*
。
示例:
cpp
const char* str = "Hello"; // 普通字符串
const char* path = R"(C:\Users\Doc)"; // 原始字符串
const char16_t* utf16 = u"你好"; // UTF-16编码的字符串
5. 布尔字面量(Boolean Literals)
表示逻辑值,只有两个:
true
:真。false
:假。
示例:
cpp
bool isReady = true;
bool isValid = false;
6. 指针字面量(Pointer Literals)
表示空指针:
nullptr
(C++11+):类型安全的空指针常量,类型为std::nullptr_t
。NULL
:传统的空指针宏,通常定义为0
或(void*)0
。
示例:
cpp
int* ptr = nullptr; // C++11及以后推荐使用nullptr
7. 用户定义字面量(User-Defined Literals, C++11+)
允许自定义字面量的解析方式,通过重载后缀运算符实现。标准库中也有一些预定义的UDL,例如:
- 时间单位 :
1h
(1小时)、30min
(30分钟)、45s
(45秒)。 - 字符串转换 :
"hello"s
表示std::string
类型(需包含<string>
)。
示例:
cpp
#include <iostream>
#include <string>
using namespace std::literals;
int main() {
auto str = "hello"s; // std::string类型
auto duration = 2h + 30min; // std::chrono::duration类型
std::cout << str.length() << std::endl;
return 0;
}
8. 字面量的类型推导
编译器会根据字面量的形式和后缀自动推导其类型:
42
:默认int
,若超出int
范围则为long
或long long
。3.14
:默认double
。'a'
:char
类型。"hello"
:const char[6]
类型(包含终止符'\0'
)。
总结
字面量是C++中表示常量值的基本方式,不同类型的字面量有不同的语法和用途。理解字面量的类型和后缀有助于避免隐式类型转换和溢出问题,尤其是在处理大数或高精度计算时。用户定义字面量则提供了强大的扩展能力,使代码更具表达力。