C++编程中的数据类型和常量学习教程

发布时间:2026/5/20 0:40:12

C++编程中的数据类型和常量学习教程 C数据类型计算机处理的对象是数据而数据是以某种特定的形式存在的例如整数、浮点数、字符等形式。不同的数据之间往往还存在某些联系例如由若干个整数组成一个整数数组。数据结构指的是数据的组织形式。例如数组就是一种数据结构。不同的计算机语言所允许使用的数据结构是不同的。处理同一类问题如果数据结构不同算法也会不同。例如对10个整数排序和对包含10个元素的整型数组排序的算法是不同的。C的数据包括常量与变量常量与变量都具有类型。由以上这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。C并没有统一规定各类数据的精度、数值范围和在内存中所占的字节数各C编译系统根据自己的情况作出安排。表2.1列出了Visual C数值型和字符型数据的情况。几点说明1) 整型数据分为长整型(long int)、一般整型(int)和短整型(short int)。在int前面加long和short分别表示长整型和短整型。2) 整型数据的存储方式为按二进制数形式存储例如十进制整数85的二进制形式为1010101则在内存中的存储形式如下图所示。3) 在整型符号int和字符型符号char的前面可以加修饰符signed表示“有符号”或unsigned表示“无符号”。如果指定为signed则数值以补码形式存放存储单元中的最高位(bit)用来表示数值的符号。如果指定为unsigned则数值没有符号全部二进制位都用来表示数值本身。例如短整型数据占两个字节 有符号时能存储的最大值为215-1即32767最小值为-32768。无符号时能存储的最大值为216-1即65535最小值为0。有些数据是没有负值的可以使用unsigned它存储正数的范围比用signed时要大一倍。4) 浮点型(又称实型)数据分为单精度(float)、双精度(double)和长双精度(long double)3种在Visual C 6.0中对float提供6位有效数字对double提供15位有效数字并且float和double的数值范围不同。对float分配4个字节对double和long double分配8个字节。5) 表中类型标识符一栏中方括号[ ]包含的部分可以省写如short和short int等效unsigned int和unsigned等效。常量的值是不能改变的一般从其字面形式即可判别是否为常量。常量包括两大类即数值型常量(即常数)和字符型常量。如12, 0, -3为整型常量4.6, -1.23为实型常量包含在两个单撇号之间的字符为字符常量如′a′, ′x′。这种从字面形式即可识别的常量称为“字面常量”或“直接常量”。C常量(C数值常量、字符串常量、符号常量)数值常量数值常量就是通常所说的常数。在C中数值常量是区分类型的从字面形式即可识别其类型。整型常量整数的类型在上一节中已知道整型数据可分为int, short int,long int以及unsigned int, unsigned short, unsigned long等类别。整型常量也分为以上类别。为什么将数值常量区分为不同的类别呢因为在进行赋值或函数的参数虚实结合时要求数据类型匹配。那么一个整型常量怎样从字面上区分为以上的类别呢一个整数如果其值在-32768~32767范围内认为它是short int型它可以赋值给short int型?int型和long int型变量。一个整数如果其值超过了上述范围而在-2147483648~2147483647范围内则认为它是long int型可以将它赋值给一个int或long int型变量。如果某一计算机系统的C版本例如Visual C确定int与long int型数据在内存中占据的长度相同则它们能够表示的数值的范围相同。因此一个int型的常量也同时是一个long int型常量可以赋给int型或long int型变量。常量无unsigned型。但一个非负值的整数可以赋值给unsigned整型变量只要它的范围不超过变量的取值范围即可。一个整型常量可以用3种不同的方式表示十进制整数。如1357, -432, 0等。在一个整型常量后面加一个字母l或L则认为是long int型常量。例如123L, 421L, 0L等这往往用于函数调用中。如果函数的形参为long int则要求实参也为long int型此时用123作实参不行而要用123L作实参。八进制整数。在常数的开头加一个数字0就表示这是以八进制数形式表示的常数。如020表示这是八进制数20即(20)8它相当于十进制数16。十六进制整数。在常数的开头加一个数字0和一个英文字母X或x就表示这是以十六进制数形式表示的常数。如0X20表示这是十六进制数20即(20)16它相当于十进制数32。浮点数的表示方法一个浮点数可以用两种不同的方式表示1) 十进制小数形式。如21.456, -7.98等。它一般由整数部分和小数部分组成可以省略其中之一如78.或.06, .0但不能二者皆省略。C编译系统把用这种形式表示的浮点数一律按双精度常量处理在内存中占8个字节。如果在实数的数字之后加字母F或f表示此数为单精度浮点数如1234F, -43f占4个字节。如果加字母L或l表示此数为长双精度数(long double)在GCC中占12个字节在Visual C 6.0中占8个字节。2) 指数形式即浮点形式。一个浮点数可以写成指数形式如3.14159可以表示为0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程序中应表示为0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2用字母e表示其后的数是以10为底的幂如e12表示1012。其一般形式为数符 数字部分 指数部分上面各数据中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的数字部分。可以看到由于指数部分的存在使得同一个浮点数可以用不同的指数形式来表示数字部分中小数点的位置是浮动的。例如1234a0.314159e1;a3.14159e0;a31.4159e-1;a314.159e-2;以上4个赋值语句中用了不同形式的浮点数但其作用是相同的。在程序中不论把浮点数写成小数形式还是指数形式在内存中都是以指数形式即浮点形式存储的。例如不论在程序中写成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式在内存中都是以规范化的指数形式存放数字部分必须小于1同时小数点后面第一个数字必须是一个非0数字例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在内存中表示成0.314159×103。存储单元分为两部分一部分用来存放数字部分一部分用来存放指数部分。为便于理解在图2.3中是用十进制表示的实际上在存储单元中是用二进制数来表示小数部分用2的幂次来表示指数部分的。对于以指数形式表示的数值常量也都作为双精度常量处理。字符常量1) 普通的字符常量用单撇号括起来的一个字符就是字符型常量。如a, #, %, D都是合法的字符常量在内存中占一个字节。注意字符常量只能包括一个字符如AB 是不合法的。字符常量区分大小写字母如A和a是两个不同的字符常量。撇号()是定界符而不属于字符常量的一部分。如couta;输出的是一个字母a而不是3个字符a 。2) 转义字符常量除了以上形式的字符常量外C还允许用一种特殊形式的字符常量就是以 \开头的字符序列。例如\n代表一个换行符。cout\n; 将输出一个换行其作用与coutendl; 相同。这种控制字符在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示只能采用特殊形式来表示。3) 字符数据在内存中的存储形式及其使用方法将一个字符常量存放到内存单元时实际上并不是把该字符本身放到内存单元中去而是将该字符相应的ASCII代码放到存储单元中。如果字符变量c1的值为ac2的值为b则在变量中存放的是a的ASCII码97b 的ASCII码98如图2.4(a)所示实际上在内存中是以二进制形式存放的既然字符数据是以ASCII码存储的它的存储形式就与整数的存储形式类似。这样在C中字符型数据和整型数据之间就可以通用。一个字符数据可以赋给一个整型变量反之一个整型数据也可以赋给一个字符变量。也可以对字符数据进行算术运算此时相当于对它们的ASCII码进行算术运算。【例】将字符赋给整型变量。12345678910#include iostreamusingnamespacestd;intmain( ){inti, j;//i和j是整型变量iA;//将一个字符常量赋给整型变量ijB;//将一个字符常量赋给整型变量jcouti j\n;//输出整型变量i和j的值,\n 是换行符return0;}执行时输出165 66i和j被指定为整型变量。但在第5和第6行中将字符A和B分别赋给i和j它的作用相当于以下两个赋值语句1i65;j66;因为A和B的ASCII码为65和66。在程序的第5和第6行是把65和66直接存放到i和j的内存单元中。因此输出65和66。可以看到在一定条件下字符型数据和整型数据是可以通用的。但是应注意字符数据只占一个字节它只能存放0~255范围内的整数。【例】字符数据与整数进行算术运算。下面程序的作用是将小写字母转换为大写字母。123456789101112#include iostreamusingnamespacestd;intmain( ){charc1,c2;c1a;c2b;c1c1-32;c2c2-32;coutc1 c2endl;return0;}运行结果为1A Ba的ASCII码为97而A的ASCII码为65b为98B为66。从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII代码大32。C符数据与数值直接进行算术运算a-32得到整数65b-32得到整数66。将65和66存放在c1c2中由于c1c2是字符变量因此用cout输出c1c2时得到字符A和BA的ASCII码为65B的ASCII码为66。字符串常量用双撇号括起来的部分就是字符串常量如abcHello!abLi ping都是字符串常量。字符串常量abc在内存中占4个字节而不是3个字节见图。编译系统会在字符串最后自动加一个\0作为字符串结束标志。但\0并不是字符串的一部分它只作为字符串的结束标志。如1coutabcendl;输出3个字符abc而不包括\0。注意: a和a代表不同的含义a是字符串常量a 是字符常量。前者占两个字节后者占1个字节。请分析下面的程序片段123charc;//定义一个字符变量ca;//正确ca;//错误c只能容纳一个字符请思考字符串常量abc\n包含几个字符不是5个而是4个字符其中\n是一个转义字符。但它在内存中占5个字节包括一个\0字符 。编译系统遇到\时就会把它认作转义字符的标志把它和其后的字符一起作为一个转义字符。如果\后面的字符不能与\组成一个合法的转义字符如\c则在编译时显示出错信息。如果希望将\字符也作为字符串中的一个字符则应写为abc\\n此时字符包括5个字符即abc\n。如果有以下输出语句1coutabc\\\nendl;则会输出1abc\ (然后换行)同理执行1coutI say \Thank you!\\n;的输出是1I say Thank you!如果在一个字符串中最后一个字符为\则表示它是续行符下一行的字符是该字符串的一部分且在两行字符串间无空格。如12coutWe must study C\ //本行最后的\后面的空格和换行均不起作用 hard!; //本行的字符紧连在上一行最后的\前面字符之后则输出1We must study C hard!符号常量为了编程和阅读的方便在C程序设计中常用一个符号名代表一个常量称为符号常量即以标识符形式出现的常量。【例】符号常量的使用。1234567891011#include iostreamusingnamespacestd;#define PRICE 30 //注意这不是语句,末尾不要加分号intmain ( ){intnum,total;num10;totalnum * PRICE;couttotaltotalendl;return0;}程序中用预处理命令#define指定PRICE在本程序单位中代表常量30此后凡在本程序单位中出现的PRICE都代表30可以和常量一样进行运算程序运行结果为1total300请注意符号常量虽然有名字但它不是变量。它的值在其作用域在本例中为主函数内是不能改变的也不能被赋值。如用赋值语句PRICE40;给PRICE赋值是错误的。 使用符号常量的好处是含义清楚在需要改变一个常量时能做到一改全改。 如1#define PRICE 35

相关新闻