数值、布尔和指针文本
文本是一种直接表示值的程序元素。 本文介绍整数、浮点、布尔和指针类型的文本。 有关字符串文本和字符文本的信息,请参阅字符串文本和字符文本 (C++)。 你也可以基于任何这些类别定义自己的文本。 有关详细信息,请参阅用户定义的文本 (C++)。
你可以在许多上下文中使用文本,但文本的最常用法是初始化命名变量以及将自变量传递给函数:
const int answer = 42; // integer literal
double d = sin(108.87); // floating point literal passed to sin function
bool b = true; // boolean literal
MyClass* mc = nullptr; // pointer literal
有时需要指示编译器如何解释某个文本或者为其赋予哪种特定类型。 可以通过为文本追加前缀或后缀来实现此目的。 例如,前缀 0x
指示编译器将其后面的数字解释为十六进制值,例如 0x35
。 后缀 ULL
指示编译器将值视为 unsigned long long
类型,就像 5894345ULL
中那样。 有关每个文本类型的前缀和后缀的完整列表,请参阅以下各节。
整数文本
整数文本以数字开头,没有小数部分或指数。 你可以指定十进制、二进制、八进制或十六进制形式的整数文本。 可以选择使用后缀将整数文本指定为无符号类型以及 long 类型或 long long 类型。
如果没有前缀或后缀,编译器将为整型文本值赋予 int
类型(32 位),前提是该值符合该类型,否则将赋予 long long
类型(64 位)。
要指定十进制整型文本,请以非零数字作为规范的开头。 例如:
int i = 157; // Decimal literal
int j = 0198; // Not a decimal number; erroneous octal literal
int k = 0365; // Leading zero specifies octal literal, not decimal
int m = 36'000'000 // digit separators make large values more readable
要指定八进制整型文本,请以 0 作为规范的开头,后跟 0 到 7 之间的一系列数字。 在指定八进制文本时,使用数字 8 和 9 是错误做法。 例如:
int i = 0377; // Octal literal
int j = 0397; // Error: 9 is not an octal digit
要指定十六进制整型文本,请以 0x
或 0X
作为规范的开头(“x”的大小写形式并不重要),后跟 0
到 9
以及 a
(或 A
)到 f
(或 F
)之间的一系列数字。 十六进制数字 a
(或 A
)到 f
(或 F
)表示介于 10 和 15 之间的值。 例如:
int i = 0x3fff; // Hexadecimal literal
int j = 0X3FFF; // Equal to i
若要指定无符号类型,请使用 u
或 U
后缀。 若要指定 long 类型,请使用 l
或 L
后缀。 要指定 64 位整型类型,请使用 LL 或 ll 后缀。 i64 后缀仍受支持,但不建议使用。 它是 Microsoft 专用的,不可移植。 例如:
unsigned val_1 = 328u; // Unsigned value
long val_2 = 0x7FFFFFL; // Long value specified
// as hex literal
unsigned long val_3 = 0776745ul; // Unsigned long value
auto val_4 = 108LL; // signed long long
auto val_4 = 0x8000000000000000ULL << 16; // unsigned long long
数字分隔符:可以使用单引号字符(撇号)分隔较大数字中的位值,使它们更易于人类阅读。 分隔符不会对编译产生任何影响。
long long i = 24'847'458'121;
浮点文本
浮点文本指定必须具有小数部分的值。 这些值包含小数点 (.
) 并可能包含指数。
浮点文本有一个有效数字(有时称为尾数),它指定数字的值。 它们有一个指数,用于指定数字的度量值。 而且,它们有一个可选的后缀,用于指定文本的类型。 指定的有效数字的格式是一系列位数后跟一个句点,再后跟表示数字的小数部分的可选的一系列位数。 例如:
18.46
38.
指数(如果有)指定数字的量级为 10 次幂,如以下示例所示:
18.46e0 // 18.46
18.46e1 // 184.6
指数可以使用 e
或 E
(意义相同)后跟可选的符号(+ 或 -)和一系列数字来指定。 如果指数存在,则整数(如 18E0
)中不需要尾随的小数点。
浮点文本默认为 double
类型。 通过使用后缀 f
或 l
或 F
或 L
(后缀不区分大小写),可以将文本指定为 float
或 long double
。
虽然 long double
和 double
具有相同的表示形式,但它们不属于同一类型。 例如,你可能有类似于下面的重载函数
void func( double );
和
void func( long double );
布尔值文字
布尔文本为 true
和 false
。
指针文本 (C++11)
C++ 引入了 nullptr
文本来指定初始化为零的指针。 在可移植代码中,应使用 nullptr
,而不是整型类型零或宏(如 NULL
)。
二进制文本 (C++14)
可以通过使用 0B
或 0b
前缀,后跟一系列 1 和 0,来指定二进制文本:
auto x = 0B001101 ; // int
auto y = 0b000001 ; // int
避免将文本用作“魔术常量”
你可以在表达式和语句中直接使用文本,虽然这种编程做法并不一定好用:
if (num < 100)
return "Success";
在上一个示例中,更好的做法是使用能够传达明确含义的命名常量,例如“MAXIMUM_ERROR_THRESHOLD”。 如果最终用户看到返回值“成功”,那么使用命名字符串常量可能会更好。 可以将字符串常量保存在可本地化为其他语言的文件中的单个位置。 使用命名常量可帮助你自己和其他人了解代码的含义。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈