Linux C++ 常量
常量是一个有固定值得表达式,在程序执行期间不会改变。这些固定的值,又叫做字常量。
常量可以是任何的基本数据类型,可分为整数、浮点数、字符、字符串和布尔值。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
整数
整数也就是整型常数。在书写时数字类型的常量不需要使用双引号。
C++中整数我们可以使用十进制、八进制以及十六进制来表示,下面的例子我们分别展示一下这几种进制的写法。
// 十进制整型常量
int a = 75;
// 八进制整型常量
int b = 0113;
// 十六进制常量
int c = 0x4b;
注意八进制和十六进制的开头都是以0开头的。
另外,我们可以在数字后面加上u或者l来让这些数字变为无符号的整数或者长整型数字。
int d = 75u;
int e = 75l;
int f = 75ul;
浮点数
浮点数由整数部分、小数点、小数部分和指数部分组成。
可以使用小数形式或者指数形式来表示浮点常量。当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
3.14159
6.09e43
3.2e-2
浮点数默认是double,如果你想使用float或者long double,在后面加上f或者l即可。
3.12f
3.12L
这里我们说一下常见的浮点数和0的比较,这一点在我们刚开始写程序的时候经常会因为没有注意浮点数的特性,导致程序无法按照我们预期的逻辑进行处理。
假设有下面的代码,输出结果会是什么?
double a = 3.141592653589793238462643383279502884197169399375L;
double b = a- 3.141592653589793238462643383279501884197169399375L;
cout << setprecision(50) << a << endl;
cout << setprecision(50) << b << endl;
cout <<( b == 0) << endl;
注意数字是不同的:
按照我们的想法,这里b肯定不会等于0了,我们看下运行结果:
3.141592653589793115997963468544185161590576171875
-1.2251484549086200104284216649830341339111328125e-16
0
当然了,不同的系统之间会存在差异,由于浮点数的精度以及在内存中的存储格式导致浮点数存在有效精度这一说法,这点大家看下a的输出就知道了,后面的数字完全不知道是什么。
所以目前通常在比较浮点数的时候,会设置一个极小值,如果a-b的绝对值在这个极小值范围内,就认为两者是相等的。关于极小值的设置视情况而定。
字符以及字符串
c++中,字符使用单引号来表示,字符串使用双引号来表示。比如:
字符可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符例如 ‘\u02C0’)。
字符:'a'
字符串:"abcd"
在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:
\\ \ 字符
\' ' 字符
\" " 字符
\? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数
关于字符串这里我们只说一下字符串的多行写法。每行末尾加反斜杠用来标识多行字符串。
注意多行之间就别为了整齐而加空格或者制表符,这些都是字符串的一部分哦。
布尔值
布尔值只有两个答案:true或者false
接下来我们谈谈如何定义常量,不要误会,这里说的是,常量变量,所谓的常量变量就是定义之后不能再次修改的变量。
在C++中我们可以使用下面两种方式来进行常量的定义:
预处理器指令#define
当然了,我们还是推荐另外的一种写法:使用const修饰符来定义制定类型的常量。
如果我们试着修改这个常量,会发生什么?
输出结果:
main.cpp: 在函数‘int main(int, char**)’中:
main.cpp:27:8: 错误:向只读变量‘PI’赋值
PI = 0.9999;
^
gmake[2]: *** [build/Debug/GNU-Linux/main.o] 错误 1