常量是具有固定值的表达式
直接常量最一般的常量。它们被用来表示程序中的特定值。我们已经在前几章中使用了一些特定的值来赋值给变量或表达式。例如我们希望我们的程序打印出来:
a = 5;
5就是一个直接赋值的常量;
常量可分为:整数、浮点数、字符、字符串、布尔值、指针和自定义值。
1776
707
-273
这是确定整数值的数值常量。注意,他们不是写在引号或任何其他特殊字符里面;它们是一个简单的数字表示一个整数,例如,1776代表的值一千七百七十六。
除了十进制数(大多数人每天使用的),C++也允许使用八进制数(基数为8)和十六进制数(基数为16)为常量。不同的是,对于八进制字符,数字前面有一个0(零)字符。对于十六进制,他们是之前的字符0x(0,x)。例如,下面的数字常量表示的数值是相等的:
75 // decimal
0113 // octal
0x4b // hexadecimal
这些都代表相同的数字:上述75(七十五)是分别为一个十进制数字、八进制数和十六进制数。
这些数字常量有一个类型,就像变量。默认情况下是整数常量类型。但是,某些后缀可以被附加到一个整数,指定一个不同的整数类型:
无符号Unsigned 可与其他任何一个类型组合以形成 unsigned long或unsigned long long。
例如:
75 // int
75u // unsigned int
75l // long
75ul // unsigned long
75lu // unsigned long
在所有的情况下,后缀可以指定使用大写或小写字母。
他们表达的是全体实数,有小数或指数。他们可以包括一个小数点,一个e字符(表示“10的指数次”,其中x是一个整型值,如下的字符),或者一个小数点和一个字符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,二是阿伏伽德罗数,第三是一个电子的电荷(极少数)(都是近似的),而最后一个是数字三表示的浮点数值。
对于浮点数默认类型是double型的。浮点数float类型的长短可以通过添加后缀指定:
Suffix Type
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”(表示小写字母的字符)。
字符和字符串类型也可以表示那些很难或不可能在程序的源代码表示的特殊字符,如换行符(\n)或空格(\t)。这些特殊的字符都由一个反斜杠(\)表示。
'\n'
'\t'
"Left \t Right"
"one\ntwo\nthree"
在计算机里面使用的是数字代码:最典型的使用的是一个扩展ASCII字符编码系统(更多信息参见ASCII码)。字符也可以使用对应的数子代码来表示,不过需要写一个反斜杠(\)代表。表示为八进制或十六进制数。一个八进制值,反斜杠之后直接的数字;而十六进制用字符X插入反斜杠来表示十六进制数字(例如:\ 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类型的字符。不同的类型可以通过以下一个前缀指定:
Prefix Character type
u char16_t
U char32_t
L wchar_t
需要注意的是,不同于整型字面值类型后缀,这些前缀区分为char32_t、wchar_t、 char16_t以及大写小写。
字符串中,除了以上的u,U,L,还有另外两个前缀存在:
Prefix Description
u8 The string literal is encoded in the executable using UTF-8
R The string literal is a raw string
在原始字符串,反斜杠和单双引号都是有效的字符;字符串内容初始化为R”sequence(最后一个)sequence”,sequence可以是任何字符序列(包括空序列)。字符串的内容在括号里面,可以无视序列本身。例如:
R"(string with \backslash)"
R"&%$(string with \backslash)&%$"
上两个字符串相当于”string with \backslash”.。R前缀可以结合其他的前缀,如U,L或U8。
c++中存在的3类其他常量: true, false 和nullptr:
bool foo = true;
bool bar = false;
int* p = nullptr;
有的时候为了方便给一个变量一个常量:
const double pi = 3.1415926;
const char tab = '\t';
这样我们可以使用这些名字在使用对应的变量:
#include 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;
}
另一种命名常数的值是使用预处理器定义方式。他们有以下形式:
#define identifier replacement
在该预定义指令之后,在代码中的任何一个使用到的标识符都会被替换为预定义后面的内容(直到该行的结尾)。这是由预处理器进行更换,并在程序编译时更换:值的类型或语法所涉及的有效性是不检查的。
#include
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;
}
请注意,#define 预处理器指令,是单线指令,不能像C++语句那样,所以不需要分号(;)。指令自动延伸到行的结尾。如果一行中包含分号,那么它替代的是一部分也是全部在内的事件。