常量

常量是具有固定值的表达式。

字面量

字面量是最明显的常量。 它们用于表达程序源代码中的特定值。 之前我们已经使用过它们,例如,当我们写下以下代码时,给变量赋予具体的值或者表达我们想要程序打印出的信息:

1
a = 5;

这段代码中的 5 就是一个字面常量

字面常量可以分为整型字面量浮点字面量字符字符串布尔值

整型字面量


1
2
3
1776
707
-

它们是标识整数值的数字常量。 请注意,要表达一个数字常量,我们不需要写引号 (") 也不需要任何特殊字符。 毫无疑问,它是一个常量:无论我们在程序中写 1776 ,我们都将引用值 1776。

除了十进制数(我们每天都习惯使用的数字)之外,C++ 允许使用八进制数(基数为 8)和十六进制数(基数为 16)作为字面常量。 如果我们想表达一个八进制数,我们必须在它前面加上一个 0(一个字符)。 为了表达一个十六进制数,我们必须在它前面加上字符 0xx)。 例如,以下字面常量彼此等效:

1
2
3
75         // decimal
0113       // octal
0x4b       // hexadecimal 

所有这些都代表相同的数字:75(七十五),分别表示为十进制数字、八进制数字和十六进制数字。

与变量一样,字面常量也被认为具有特定的数据类型。 默认情况下,整数字面量是 int 类型。 但是,我们可以通过附加 u 字符来强制它们为无符号类型,或者通过附加 l 来强制它们为长整型。

1
2
3
4
75         // int
75u        // unsigned int
75l        // long
75ul       // unsigned long 

在这两种情况下,后缀都可以使用大写或小写字母指定。

浮点数

它们表达带有小数和/或指数的数字。 它们可以包括小数点、e 字符(表示“乘以 10 的 X 次方”,其中 X 是跟随 e 字符的整数值),或者同时包括小数点和 e 字符。

1
2
3
4
3.14159    // 3.14159
6.02e23    // 6.02 x 10^23
1.6e-19    // 1.6 x 10^-19
3.0        // 3.0 

这些是在 C++ 中表达的四个有效的带小数点的数字。 第一个数字是 PI,第二个数字是阿伏伽德罗数,第三个是电子的电荷(一个非常小的数字)- 它们都是近似值 - 最后一个是将数字三表示为浮点数字面量。

浮点字面量的默认类型是 double。 如果您明确想要表达 floatlong double 数字字面量,则可以使用后缀 fl

1
2
3.14159L   // long double
6.02e23f   // float 

作为浮点数字常量的任何字母 (e, f, l) 都可以使用小写或大写字母书写,而对其含义没有任何影响。

字符和字符串字面量

还存在非数字常量,例如:

1
2
3
4
'z'
'p'
"Hello world"
"How do you do?"

前两个表达式表示单字符常量,以下两个表达式表示由多个字符组成的字符串字面量。 请注意,为了表示单个字符,我们将其括在单引号 (') 之间,为了表达字符串(通常由多个字符组成),我们将其括在双引号 (") 之间。

在编写单字符和字符串字面量时,有必要将它们用引号括起来,以将它们与可能的变量标识符或保留关键字区分开来。 注意这两个表达式之间的区别:

1
2
x
'x'

单独的 x 将引用一个标识符为 x 的变量,而 'x'(括在单引号内)将引用字符常量 'x'

字符和字符串字面量具有某些特性,例如转义码。 这些是在程序的源代码中难以或不可能以其他方式表达的特殊字符,例如换行符 (\n) 或制表符 (\t)。 它们都以反斜杠 (\) 开头。 以下是一些转义码的列表:

\n换行
\r回车
\t制表符
\v垂直制表符
\b退格
\f换页(进纸)
\a警告(蜂鸣)
\'单引号 (')
\"双引号 (")
\?问号 (?)
\\反斜杠 (\)

例如:

1
2
3
4
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"

此外,您可以通过其数字 ASCII 码来表示任何字符,方法是编写一个反斜杠字符 (\),后跟以八进制(基数-8)或十六进制(基数-16)数字表示的 ASCII 码。 在第一种情况(八进制)中,数字必须紧跟在反斜杠之后(例如 \23\40),在第二种情况(十六进制)中,必须在数字本身之前写入 x 字符(例如 \x20\x4A)。

通过在每个未完成行的末尾放置一个反斜杠符号 (\),字符串字面量可以扩展到多行代码。

1
2
"string expressed in \
two lines"

您还可以通过一个或多个空格、制表符、换行符或任何其他有效的空白字符分隔它们来连接几个字符串常量。

1
"this forms" "a single" "string" "of characters"

最后,如果我们希望字符串字面量明确地由宽字符 (wchar_t 类型) 而不是窄字符 (char 类型) 组成,我们可以在常量前加上 L 前缀。

1
L"This is a wide character string"

宽字符主要用于表示非英语或异国情调的字符集。

布尔字面量

只有两个有效的布尔值:truefalse。 这些可以在 C++ 中表示为 bool 类型的值,方法是使用布尔字面量 truefalse

定义常量 (#define)

您可以使用 #define 预处理器指令,为您经常使用的常量定义自己的名称,而无需求助于消耗内存的变量。 它的格式是:

#define 标识符 值
例如:

1
2
#define PI 3.14159
#define NEWLINE '\n' 

这定义了两个新常量:PINEWLINE。 一旦定义了它们,您就可以在代码的其余部分中使用它们,就好像它们是任何其他常规常量一样,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// defined constants: calculate circumference

#include <iostream>
using namespace std;

#define PI 3.14159
#define NEWLINE '\n'

int main ()
{
  double r=5.0;               // radius
  double circle;

  circle = 2 * PI * r;
  cout << circle;
  cout << NEWLINE;

  return 0;
}
31.4159

事实上,编译器预处理器在遇到 #define 指令时所做的唯一事情就是按照它们已定义的代码,字面替换它们标识符的任何出现(在前面的例子中,这些是 PINEWLINE)(分别是 3.14159'\n')。

#define 指令不是 C++ 语句,而是预处理器的指令; 因此,它假定整行作为指令,并且在其末尾不需要分号 (;)。 如果在末尾附加一个分号字符 (;),它也会附加到预处理器替换的程序正文中标识符的所有出现位置。

声明常量 (const)

使用 const 前缀,您可以像声明变量一样声明具有特定类型的常量:

1
2
const int pathwidth = 100;
const char tabulator = '\t';

在这里,pathwidthtabulator 是两个类型常量。 它们被视为常规变量,只是它们的值在定义后无法修改。
Index
目录