常量
常量的值是不能改变的,常量包括两类:数值型常量和字符型常量。
数值型常量
整型常量
十进制整数,在一个整常量后面加一个字母l或L,则认为是long int型常量。
八进制整数,在常数的开头加一个数字0。
十六进制整数,在常数的开头加一个数字0和一个英文字母x或X。
浮点型常量
十进制小数形式,一般由整数部分和小数部分组成,可以省略其中之一,但不能二者皆省略。
C++系统把这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母F或f,表示此数为单精度浮点数,占4个字节。如果加上L或l,表示此数为长双精度数,在GCC中占12个字节,在Visual C++中占8个字节。
指数形式,一般形式为 数符 数字部分 指数部分,以字母e表示其后的数是以10为底的幂。
字符常量
普通字符常量
普通字符常量,用单撇号括起来的一个字符就是字符常量,在内存中占一个字节,字符常量只包含一个字符,区分大小写,撇号是定界符,不属于字符常量的一部分。
转义字符常量
转义字符常量,以'\'开头的字符序列,如'\n'表示换行,这种控制字符在屏幕上是不能显示的,在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。
字符形式 | 含义 | ASCII码 |
---|---|---|
\a | 响铃 | 7 |
\n | 换行,将当前额外i之移动到下一行开头 | 10 |
\t | 水平制表(跳转到下一个tab位置) | 9 |
\b | 退格,将当前位置移动到前一列 | 8 |
\r | 回车,将当前位置移动到本行开头 | 13 |
\f | 换页,将当前位置移动到下页开头 | 12 |
\v | 竖向跳格 | 8 |
\\ | 反斜杠字符'\' | 92 |
\' | 单撇号字符 | 39 |
\" | 双引号字符 | 34 |
\0 | 空字符 | 0 |
\ddd | 1-3位八进制的数所代表的字符 | |
\xhh | 1-2位十六进制数所代表的字符 |
字符数据在内存中的存储形式及其使用方法
将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASCII码放到存储单元中。如果字符变量c1的值为'a',c2的值为'b',则在变量中存放的是'a'的ASCII码97,'b'的ASCII码98,实际上在内存中是以二进制形式存放的。既然字符数据以ASCII码存储的,它的存储形式就与整数的存储形式类似,这样在C++中字符型数据和整型数据之间就可以通用。
一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术计算,此时相当于对它们的ASCII码进行算术计算。
#include <iostream>
using namespace std;
int main()
{
int i, j; //定义整型变量
i = 'a'; //对变量i进行赋值,值为字符常量
j = 'b'; //对变量j进行赋值,值为字符常量
cout << i << ' ' << j << endl;
return 0;
}
结果如下:
需要注意,字符数据只占1字节,只能存放0-255内的整数。
应用实例:将小写字母转化成大写字母
#include <iostream>
using namespace std;
int main()
{
char c1, c2, c3, c4; //定义字符变量
c1 = 'a'; //赋值,a的ASCII码为97
c2 = 'b'; //赋值,b的ASCII码为98
c3 = c1 - 32; //实际是ASCII码的计算,大小写字母之间相差32
c4 = c2 - 32; //实际是ASCII码的计算,大小写字母之间相差32
cout << c3 << ' ' << c4 << endl;
return 0;
}
结果如下:
字符串常量
用双撇号括起来的字符就是字符串常量。编译系统会在字符串常量后自动加一个'\0'作为字符串结束标志。
注意,'\0'并不是字符串的一部分,它只作为字符串的结束标志,会占用一个字节。
符号常量
为了编程和阅读的方便,可以用一个符号名代表一个常量,称为符号常量,即以标识符形式出现的常量。符号常量虽然有名字,但是它不是变量,在进行编译预处理时,所有的符号常量都会被置换为具体的数值。
符号常量是在C程序中用的较多,在C++程序中常用常变量而较少用符号常量。
#include <iostream>
using namespace std;
#define PRICE 50 //定义符号常量,没有等号,末尾无分号
int main()
{
int num, total;
num = 30;
total = num * PRICE; //乘法运算
cout << "total = " << total << endl;
return 0;
}
结果如下: