Home C&C++函数库 c++ 语法 程序源码 Linux C库

常量


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

☞ 字面量(Literals)



字面量是最明显的常量类型。它们用于在程序源代码中表示特定值。
我们已经在前面的章节中使用了一些来为变量赋予特定值,
或者表达我们希望我们的程序打印出的消息,
例如:


a = 5;

这段代码中5表示一个字面常量。

字面常量(literal constant)可以分为:整数(Integer Numbers)、浮点数(Floating-Point Numbers)、
字符(Characters)、字符串(Strings)、布尔值(Boolean)、指针(pointers)和用户定义的字符。

整数:
1776
707
-273

这些是标识整数值的数字常量。请注意,它们没有用引号或任何其他特殊字符括起来;
它们是一连串简单的数字,代表一个以十进制为基数的整数;
例如,1776始终代表值一千七百七十六。


除了十进制数(我们大多数人每天使用的那些数)之外,
C++ 还允许使用八进制数(基数为 8)和十六进制数(基数为 16)作为字面常量。
对于八进制文字,数字前面有一个0字符。
对于十六进制,它们前面有字符0x。

例如,下面的字面常量都是等价的:

75         // 十进制 decimal
0113       // 八进制 octal
0x4b       // 十六进制 hexadecimal

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

就像变量一样,这些字面常量也有类型.
默认情况下,整数字符的类型为int。
但是,我们可以通过在该字符后面加字母以指定不同的整数类型:

后缀 类型修饰符
u 或者 U unsigned
l 或者 L long
ll 或者 LL long long

Unsigned 可以以任何顺序与其他两个中的任何一个组合,
形成unsigned long或unsigned long long。

例如:

75         // int
75u        // unsigned int
75l        // long
75ul       // unsigned long
75lu       // unsigned long

在上述所有情况下,都可以使用大写或小写字母指定后缀。

浮点数:
实数值用小数(和/或)指数表示。
它们可以包含一个小数点、e字符(表示e前面的数乘以“10的X次方”,其中X是e字符后面的整数值),
或者同时包含小数点和e字符:
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,第二个是阿伏伽德罗数,第三个是一个电子(electron)的电量(electric charge)
(一个极小的数值) -– 所有这些都是近似值,最后一个是用数字3表示的一个浮点数字符。

浮点数的默认类型是double.
可以通过添加以下后缀之一来指定float类型或long double类型:

后缀 类型
f or F float
l or L long double

例如:

3.14159L   // long double
6.02e23f   // float

浮点数的字母部分( e, f, l)可以使用小写或大写字母书写,含义没有区别.

字符和字符串

字符和字符串用引号括起来:
'z'
'p'
"Hello world"
"How do you do?"

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

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

x 'x'

这里,x 单独指代标识符,例如变量或复合类型的名称,
而 'x'(括在单引号内)将表示字符文字'x'(表示小写x字母的字符)。

字符和字符串文字还可以表示在程序的源代码中难以或不可能以其他方式表达的特殊字符,
例如换行符 ( \n) 或制表符 ( \t)。这些特殊字符都以反斜杠字符 ( \)开头。

这里有一个转义字符列表:

转义字符 说明
\n 换行符
\r 回车
\t 水平制表符,等于TAB键
\v 垂直制表符
\b 退格
\f 分页
\a 警报
\' 单引号
\" 双引号
\? 问号
\\ 反斜杠

例如:

'\n'
'\t'
"Left  \t  Right"
"one\ntwo\nthree"

在计算机内部,它用数字码表示字符:
最典型的是,它们使用ASCII码系统的一种扩展
(有关更多信息,请参阅ASCII 代码)。

字符也可以使用其数字码形式表示,
方法是先写一个反斜杠字符 (\ ) ,后跟表示为八进制 (base-8)
或十六进制 (base-16) 数字的代码。
对于八进制值,反斜杠后直接跟数字;
而对于十六进制,则在反斜杠和十六进制数字本身之间插入一个字符(例如:\x20 或 \x4A)。

用一个或多个空格(包括制表符、换行符和其他有效的空白字符),
将多个字符串连接起来,就可以合成单个字符串。例如:

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

上面这个个字符串等价于:

"this formsa single string of characters"

请注意引号内的空格是文字的一部分,而引号外的空格则不是。

一些程序员还使用一种技巧将长字符串分为多行:
在 C++ 中,行尾的反斜杠 ( \) 被视为行继续符,
它将该行和下一行合并为一行。因此下面的代码:

x = "string expressed in \
two lines"

相当于:

x = "string expressed in two lines"

上面描述的所有字符和字符串都是由char类型的字符组成的。
可以使用以下前缀之一指定不同的字符类型:

前缀 字符类型
u char16_t
U char32_t
L wchar_t

请注意,与整数的类型后缀不同,这些前缀区分大小写:
小写 char16_t和大写 char32_t and wchar_t。

对于字符串文字,除了上面的u, U, 和L,还有两个额外的前缀:

前缀 说明
u8 字符串在可执行文件中使用 UTF-8 编码
R 字符串文字是原始字符串

原始字符串中的字符表示的就是自己本身,
原始字符串用 "( 和 )" 用作定界符,并使用前缀R来标识原始字符串,
反斜杠、单引号和双引号都是有效字符.
例如:


R"(string with \backslash)"
R"&%$(string with \backslash)&%$"

上面的两个字符串都等价于"string with \backslash".
该R前缀可以与任何其他的前缀如u,L或u8结合使用。

其他

C++ 中存在三个关键字文字:true,false和nullptr:
    true和false是bool类型变量的两个可能值。
    nullptr是空指针值。

bool foo = true;
bool bar = false;
int* p = nullptr;

☞ 常量表达式类型



有时,为方便使用,可以给常量取一个名字:

const double pi = 3.1415926;
const char tab = '\t';

然后我们可以直接使用这些名称:
#include <iostream>
using namespace std;

const double pi = 3.14159;
const char newline = '\n';

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

  circle = 2 * pi * r;
  cout << circle;
  cout << newline;
}
31.4159

☞ 预处理器定义 (#define)



另一种命名常量值的机制是使用预处理器定义。它们具有以下形式:

#define identifier replacement

在identifier之后,代码中出现的任何标识符都被编译器理解为替换(replacement),
其中replacement是任何字符序列(直到行尾)。
这种替换是由预处理器执行的,发生在程序编译之前,
因此会导致某种盲目的替换:不以任何方式检查所涉及的类型或语法的有效性。
例如:

#include <iostream>
using namespace std;

const double pi = 3.14159;
const char newline = '\n';

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

  circle = 2 * pi * r;
  cout << circle;
  cout << newline;
}
31.4159

请注意,#define是预处理器指令,因此是单行指令.
与 C++ 语句不同,末尾不需要分号 (;);该指令自动扩展到行尾。
如果行中包含分号,则编译器认为它是替换序列的一部分,
并且把它包含在被替换的代码中.
联系我们 免责声明 关于CandCplus 网站地图