常量
常量是具有固定值的表达式。
字面量
字面量是最明显的常量。 它们用于表达程序源代码中的特定值。 之前我们已经使用过它们,例如,当我们写下以下代码时,给变量赋予具体的值或者表达我们想要程序打印出的信息:
这段代码中的
5
就是一个
字面常量。
字面常量可以分为
整型字面量、
浮点字面量、
字符、
字符串和
布尔值。
整型字面量
它们是标识整数值的数字常量。 请注意,要表达一个数字常量,我们不需要写引号 (
"
) 也不需要任何特殊字符。 毫无疑问,它是一个常量:无论我们在程序中写
1776
,我们都将引用值 1776。
除了十进制数(我们每天都习惯使用的数字)之外,C++ 允许使用八进制数(
基数为 8)和十六进制数(
基数为 16)作为字面常量。 如果我们想表达一个八进制数,我们必须在它前面加上一个
0
(一个
零字符)。 为了表达一个十六进制数,我们必须在它前面加上字符
0x
(
零,
x)。 例如,以下字面常量彼此等效:
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。 如果您明确想要表达
float 或
long double 数字字面量,则可以使用后缀
f
或
l
。
1 2
|
3.14159L // long double
6.02e23f // float
|
作为浮点数字常量的任何字母 (
e
,
f
,
l
) 都可以使用小写或大写字母书写,而对其含义没有任何影响。
字符和字符串字面量
还存在非数字常量,例如:
1 2 3 4
|
'z'
'p'
"Hello world"
"How do you do?"
|
前两个表达式表示单字符常量,以下两个表达式表示由多个字符组成的字符串字面量。 请注意,为了表示单个字符,我们将其括在单引号 (
'
) 之间,为了表达字符串(通常由多个字符组成),我们将其括在双引号 (
"
) 之间。
在编写单字符和字符串字面量时,有必要将它们用引号括起来,以将它们与可能的变量标识符或保留关键字区分开来。 注意这两个表达式之间的区别:
单独的
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"
|
宽字符主要用于表示非英语或异国情调的字符集。
布尔字面量
只有两个有效的布尔值:
true 和
false。 这些可以在 C++ 中表示为
bool 类型的值,方法是使用布尔字面量
true
和
false
。
定义常量 (#define)
您可以使用
#define
预处理器指令,为您经常使用的常量定义自己的名称,而无需求助于消耗内存的变量。 它的格式是:
#define 标识符 值
例如:
1 2
|
#define PI 3.14159
#define NEWLINE '\n'
|
这定义了两个新常量:
PI 和
NEWLINE。 一旦定义了它们,您就可以在代码的其余部分中使用它们,就好像它们是任何其他常规常量一样,例如:
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
指令时所做的唯一事情就是按照它们已定义的代码,字面替换它们标识符的任何出现(在前面的例子中,这些是
PI 和
NEWLINE)(分别是
3.14159
和
'\n'
)。
#define
指令不是 C++ 语句,而是预处理器的指令; 因此,它假定整行作为指令,并且在其末尾不需要分号 (
;
)。 如果在末尾附加一个分号字符 (
;
),它也会附加到预处理器替换的程序正文中标识符的所有出现位置。
声明常量 (const)
使用
const
前缀,您可以像声明变量一样声明具有特定类型的常量:
1 2
|
const int pathwidth = 100;
const char tabulator = '\t';
|
在这里,
pathwidth
和
tabulator
是两个类型常量。 它们被视为常规变量,只是它们的值在定义后无法修改。