数值、布尔和指针文本

文本是一种直接表示值的程序元素。 本文介绍整数、浮点、布尔和指针类型的文本。 有关字符串文本和字符文本的信息,请参阅字符串文本和字符文本 (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

要指定十六进制整型文本,请以 0x0X 作为规范的开头(“x”的大小写形式并不重要),后跟 09 以及 a(或 A)到 f(或 F)之间的一系列数字。 十六进制数字 a(或 A)到 f(或 F)表示介于 10 和 15 之间的值。 例如:

int i = 0x3fff;   // Hexadecimal literal
int j = 0X3FFF;   // Equal to i

若要指定无符号类型,请使用 uU 后缀。 若要指定 long 类型,请使用 lL 后缀。 要指定 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

指数可以使用 eE(意义相同)后跟可选的符号(+ 或 -)和一系列数字来指定。 如果指数存在,则整数(如 18E0)中不需要尾随的小数点。

浮点文本默认为 double 类型。 通过使用后缀 flFL(后缀不区分大小写),可以将文本指定为 floatlong double

虽然 long doubledouble 具有相同的表示形式,但它们不属于同一类型。 例如,你可能有类似于下面的重载函数

void func( double );

void func( long double );

布尔值文字

布尔文本为 truefalse

指针文本 (C++11)

C++ 引入了 nullptr 文本来指定初始化为零的指针。 在可移植代码中,应使用 nullptr,而不是整型类型零或宏(如 NULL)。

二进制文本 (C++14)

可以通过使用 0B0b 前缀,后跟一系列 1 和 0,来指定二进制文本:

auto x = 0B001101 ; // int
auto y = 0b000001 ; // int

避免将文本用作“魔术常量”

你可以在表达式和语句中直接使用文本,虽然这种编程做法并不一定好用:

if (num < 100)
    return "Success";

在上一个示例中,更好的做法是使用能够传达明确含义的命名常量,例如“MAXIMUM_ERROR_THRESHOLD”。 如果最终用户看到返回值“成功”,那么使用命名字符串常量可能会更好。 可以将字符串常量保存在可本地化为其他语言的文件中的单个位置。 使用命名常量可帮助你自己和其他人了解代码的含义。

另请参阅

词法约定
C++ 字符串文本
C++ 用户定义的文本