## 1.3 常量 (Constants )
一个常量(constant)是一个有固定值的表达式。
### 字(Literals)
字是用来在程序源码中表达特定的值。在前面的内容中我们已经用了很多的字来给变量赋予特定的值。例如:
~~~
a = 5;
~~~
这句代码中5就是一个字常量。
字常量(literal constant)可以被分为整数(Integer Numbers), 浮点数(Floating-Point Numbers),字符(Characters)和字符串(Strings)。
### 整数(Integer Numbers)
~~~
1776
707
-273
~~~
他们是整型常数,表示十进制整数值。注意表示整型常数时我们不需要些引号(quotes ("))或任何特殊字符。毫无疑问它是个常量:任何时候当我们在程序中写1776,我们指的就是1776这个数值。
除十进制整数另外, C++还允许使用八进制(octal numbers)和十六进制(hexadecimal numbers)的字常量(literal constants)。如果我们想要表示一个八进制数,我们必须在它前面加上一个0字符(zero character),而表示十六进制数我们需要在它前面加字符0x (zero, x)。例如以下字常量(literal constants)互相等值:
~~~
75 // 十进制 decimal
0113 // 八进制 octal
0x4b // 十六进制 hexadecimal
~~~
所有这些都表示同一个整数: 75 (seventy five) ,分别以十进制数,八进制数和十六进制数表示。
像变量一样,常量也是有数据类型的。默认的整数字常量的类型为int型。我们可以通过在后面加字母u或l来迫使它为无符号(unsigned)的类型或长整型(long)。
~~~
75 // int
75u // unsigned int
75l // long
75ul // unsigned long
~~~
这里后缀u和l可以是大写,也可以是小写。
### 浮点数(Floating Point Numbers)
浮点数以小数(decimals)和/或指数幂( exponents)的形式表示。它们可以包括一个小数点,一个e字符(表示"by ten at the Xth height",这里X是后面跟的整数值) ,或两者都包括。
~~~
3.14159 // 3.14159
6.02e23 // 6.02 x 10^1023
1.6e-19 // 1.6 x 10^-19
3.0 // 3.0
~~~
以上是包含小数的以C++表示的4个有效数值。第一个是PI,第二个是Avogadro数之一,第三个是一个电子(electron)的电量(electric charge)(一个极小的数值) – 所有这些都是近似值。最后一个是浮点数字常量表示数3。
浮点数的默认数据类型为double。如果你想使用float或long double类型,可以在后面加f或l后缀,同样大小写都可以:
~~~
3.14159L // long double
6.02e23f // float
~~~
### 字符和字符串(Characters and strings)
此外还有非数字常量,例如:
~~~
'z'
'p'
"Hello world"
"How do you do?"
~~~
前两个表达式表示单独的字符(character),后面两个表示由若干字符组成的字符串(string) 。注意在表示单独字符的时候,我们用单引号(single quotes (')),在表示字符串或多于一个字符的时候我们用双引号(double quotes ("))。
当以常量方式表示单个字符和字符串时,必须写上引号以便把他们和可能的变量标识或保留字区分开,注意以下例子:
~~~
x
'x'
~~~
x 指一个变量名称为 x, 而'x'指字符常量'x'。
字符常量和字符串常量各有特点,例如escape codes,这些是除此之外无法在源程序中表示的特殊的字符,例如换行符 newline (\n) 或跳跃符tab (\t)。所有这些符号前面要加一个反斜杠inverted slash (\)。这里列出了这些escape codes:
|||
|---|---|
| **\n** | 换行符newline |
| **\r** | 回车carriage return |
| **\t** | 跳跃符tabulation |
| **\v** | 垂直跳跃vertical tabulation |
| **\b** | backspace |
| **\f** | page feed |
| **\a** | 警告alert (beep) |
| **\'** | 单引号single quotes (') |
| **\"** | 双引号double quotes (") |
| **\?** | 问号question (?) |
| **\\** | 反斜杠inverted slash (\) |
例如:
~~~
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"
~~~
另外你可以数字ASCII 码表示一个字符,这种表示方式是在反斜杠(\)之后加以8进制数或十六进制数表示的ASCII 码。在第一种(八进制octal)表示中,数字必需紧跟反斜杠(例如**\23**或**\40**),第二种(十六进制hexacedimal),必须在数字之前写一个x字符(例如**\x20**或**\x4A**)。
如果每一行代码以反斜杠inverted slash (\)结束,字符串常量可以分多行代码表示:
~~~
"string expressed in \
two lines"
~~~
你还可以将多个被空格blankspace、跳跃符tabulator、换行符newline或其他有效空白符号分隔开的字符串常量连接在一起:
~~~
"we form" "a single" "string" "of characters"
~~~
最后如果我们想让字符串使用宽字符(wchar_t),而不是窄字符(char),可以在常量的前面加前缀L:
~~~
L"This is a wide character string"
~~~
宽字符通常用来存储非英语字符,比如中文字符,一个字符占两个字节。
布尔型常量(Boolean Literals)
布尔型只有两个有效的值:true和false,其数据类型为bool。
### 定义常量Defined constants (#define)
使用预处理器指令#define,你可以将那些你经常使用的常量定义为你自己取的名字而不需要借助于变量。它的格式是:
`#define identifier value`
例如:
~~~
define PI 3.14159265
define NEWLINE '\n'
define WIDTH 100
~~~
以上定义了三个常量。一旦做了这些声明,你可以在后面的程序中使用这些常量,就像使用其它任何常量一样,例如:
~~~
circle = 2 * PI * r;
cout
~~~
实际上编译器在遇到#define指令的时候做的只是把任何出现这些 常量名(在前面的例子中为PI, NEWLINE或WIDTH)的地方替换成他们被定义为的代码(分别为3.14159265, '\n'和100)。因此,由#define定义的常量被称为宏常量macro constants。
define 指令不是代码语句,它是预处理器指令,因此指令行末尾不需要加分号semicolon (;) 。如果你在宏定义行末尾加了分号(;) ,当预处理器在程序中做常量替换的时候,分号也会被加到被替换的行中,这样可能导致错误。
### 声明常量declared constants (const)
通过使用const前缀,你可以定义指定类型的常量,就像定义一个变量一样:
~~~
const int width = 100;
const char tab = '\t';
const zip = 12440;
~~~
如果没有指定类型(如上面最后例子中最后一行),编译器会假设常量为整型int。