1第二章基本数据类型、运算符和表达式2.1数据类型2.2变量和常量2.3运算符和表达式2.4指针*2.5typedef语句2.6应用举例22.1数据类型程序中要对各种各样的数据进行描述和操作,用到的数据都必须指明其类型。数据类型的作用:指出了应为数据分配的存储空间的大小规定了数据所能进行的操作数据类型基本类型构造类型整型(int)实型字符型(char)布尔型(bool)空类型(void)单精度型(float)双精度型(double)指针数组结构型(struct)共用体(union)枚举(enum)类(class)32.2变量和常量1.变量的定义程序运行过程中其值可变的量,定义方式如下:C/C++规定:程序中所有变量必须先定义后使用,可及时发现录入错误(如,定义的变量为data,而程序体中使用变量为date),同时还可限制非法运算(如:a%b,若a,b为float类型则出错)。C++中变量可随时使用,随时定义。例如:inta,b;(定义变量a和b为整型)floatx,y;(定义变量x和y为单精度实型)数据类型变量名表;2.2.1变量42.变量的初始化变量必须先有确定的值后才能参与各种相应的操作,变量获取值的途径有三:通过输入语句输入(如:cina;)通过赋值语句赋值(如:a=3;)通过初始化方式赋初值(如:intk=3;)所谓初始化是指在定义变量的同时指定变量的初值,形式有二:例如:intk=3,m=3,n(3);()intk=m=n=3;//不允许为多个变量同时初始化数据类型变量名=表达式;数据类型变量名(表达式);53.变量引用C++中增加了“引用”这一概念,许多地方可以代替指针实现相应的功能,比指针更安全。所谓引用即给一个已知变量起个别名,系统不为引用另外开辟内存,而是与原变量共享同一段内存,引用好比是一个虚拟的变量,声明形式为:数据类型&引用名=已定义的变量如:inta=3,&b=a;//定义b为a的引用b=5;//你知道此时a的值为多少吗?62.2.2常量在程序运行过程中其值不能改变的量,有值常量和符号常量两种。1.整型常量进制形式实例错例十进制以数字1~9开始-3,+5,12045八进制以数字0开始(由0~7之间数字组成)023,-010078十六进制以0x或0X开始(由0~9及A~F组成)0XAF,-0X510XFG72.实型常量十进制小数形式:由正负号、数字和小数点组成,如1.25、-1.25、17.和.1指数形式:由尾数、指数符号e(或E)及指数构成,其中指数必须是十进制整数。如1.25e-5、+1e10、-1.25e5。注意:e前面不能没有数字,e后面的数字必须为整数,也不能加园括号。如1E(-3)、E-5、1e2.1都是错误的。83.字符常量C/C++提供了两类字符型常量:普通字符常量:用单引号括起来的一个字符。如:‘A’、‘0’、‘?’。转义字符常量:以“\”(反斜杠)开头的用单引号括起来的字符序列。如:‘\n’、‘\t’、‘\x61’等。常用的转义字符见p26。注意:‘\0’表示ASCII码为0的字符,它是一个空字符,注意其与‘0’的区别,后者表示的是ASCII码为48的数字字符。字符型数据在内存中以ASCII码存储,故整型数据和字符型数据在一定范围内可以通用。如:x='a'+2;printf(%d,'a');94.字符串常量字符串常量是用双引号括起来的字符序列,系统在字符串常量最后自动加字符串结束符号'\0'。例如:字符串“A”的存储形式:字符‘A’的存储形式:5.符号常量是以标识符形式出现的常量,作用是便于程序阅读和修改。C++中用define命令或关键字const定义符号常量,形式如下:A\0A内存中实际存放的是这些字符的ASCII码#define标识符常量值const数据类型标识符=常量值或:10注意:习惯上符号常量名大写,而变量名小写,以示区分。符号常量虽然用标识符来标识,但本质上是常量,具有常量值不能改变的性质。#definePI3.14//constdoublePI=3.14#includeiostreamusingnamespacestd;intmain(){floatr=3.0,s,l;l=2*PI*r;s=PI*r*r;coutl=l,s=sendl;system(pause);return0;}例2-1112.3运算符和表达式2.3.1基本概念运算符具有三个属性:优先级:指运算的先后次序,共分15个级别。(见p27表1.2.4)结合性:指相同优先级运算符连续出现时的计算顺序,分自左向右和自右向左两种,除特别声明外,皆指自左向右。目数:指运算符要求的操作数的个数,包括单目、双目和三目,一般目数越少,优先级越高。表达式:由常量、变量、函数调用和运算符按一定规律组合在一起构成的式子。如:a+14/(3+2)-sqrt(17)122.3.2运算符1.算术运算种类:+(加法或取正)-(减法或取负)*(乘法)/(除法)%(求余数)++(自增)--(自减)其中:++和--的结合性则是自右向左优先级:(从高到低)(++、--、+、-)(*、/、%)(+、-)正、负加、减13说明:•在除法运算中,当两个操作数都是整数时,商也为整数,小数部分一律舍去。如:1/201.0/20.5•%(求余运算)要求两个操作数都是整型,结果为整除后余下的整余数。•自增、自减运算符(++、--)++i,--i(在使用i之前,先使i的值加减1)i++,i--(在使用i之后,使i的值加减1)若i的值为3,则:j=++i;j的值为4,i的值为4j=i++;j的值为3,i的值为4注意:自增、自减运算符只能用于变量,而不能用于常量和表达式。()5++、(a+b)++142.关系运算种类:(小于)、=(小于等于)、(大于)==(等于)、=(大于等于)、!=(不等于)优先级:(从高到低)(、=、、=)(==、!=)关系运算描述的是一种“判断关系”,其结果有“真(true)”和“假(false)”两种。用“1”代表“真”,用“0”代表“假”例如:53的结果为1,aB的结果为0思考:x为0到100之间的数能否表示为0=x=100?153.逻辑运算种类:&&(逻辑与)、||(逻辑或)、!(逻辑非)优先级:(从高到低)!&&||其中,“!”是单目运算符,优先级高于算术运算符。“&&”和“||”低于关系运算符。逻辑运算通常用来连接关系运算,逻辑运算符两端的操作数如为“非0”,就当作“真”来处理,如果是“0”,便当作“假”来处理。逻辑运算的结果也只有0(false)和1(true)两种。16运算符说明优先级说明例结果!取反2当操作数为假时,结果为真!01&&与11操作数均为真时,结果才为真2&&05&&301||或12操作数中有一个为真时,结果为真0||10||010说明:当多个&&连续出现时,如表达式1&&表达式2&&表达式3从左到右,只要一个操作数为0,结果就为0,不进行后续运算。当多个||连续出现时,如表达式1||表达式2||表达式3从左到右,只要一个操作数为1,结果就为1,不进行后续运算。17#includeiostreamusingnamespacestd;intmain(){intm,n=10;m=2&&n++;coutm=m,n=n;system(pause);return0;}例2-21.分析运行结果2.改为m=0&&n++,结果又如何。4.条件运算形式:e1?e2:e3一般而言,e1为条件表达式,当其成立时,将e2的值作为整个表达式的值,不再计算e3的值;否则取e3的值作为整个表达式的结果,而不计算e2的值。18如:max=(xy?x:y);//将x和y中较大的一个数赋值给变量max条件运算符的结合性是由右向左思考题:对n(0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?(试用条件运算符表达)n%k0?n/k+1:n/k5.赋值运算格式:作用:将一个数据赋给一个变量,并以变量的值作为整个式子的值。变量赋值运算符表达式19其中赋值运算符可以是“=”,也可以是复合赋值运算符,如“+=”、“-=”、“*=”、“/=”和“%=”等等。复合赋值运算符的等价形式:(以“+=”为例)例如:b/=a+2等价于:b=b/(a+2)•结合性自右向左•若两端类型不同,则系统自动将右端类型转换为左端类型。例如:有定义inta=3.78;则a中存放的值为3•左端只能是变量(或数组元素),不能为表达式或常量,如:a+2*=b()a=b+2=c+5()变量+=表达式变量=变量+表达式是一个整体206.逗号运算形式:e1,e2,e3,……其中e1、e2、e3均为表达式,从左向右依次计算各个表达式的值,而将最后一个表达式的值作为整个表达式的值,逗号运算符常用于循环语句的表达式中,将多个表达式连接成一个表达式,如:for(i=0,j=n;ij;i++,j--)逗号运算符的优先级别最低。217.数据类型的转换数据类型的转换分为显式(强制)转换和隐式(自动)转换。强制转换格式:或:将一种数据类型的值强制转换为另外一种数据类型。常用于对函数的参数及返回值的操作。假设x、y为float型数据,则(int)(x+y)强行将x+y的值转换成整型,x和y仍为float型。自动转换:在不同类型数据进行混合运算时,系统自动进行的类型转换。(类型名)表达式类型名(表达式)22charshortint→unsigned→long→unsignedlong→float→double→longdouble必定的转换混合运算时由低向高转换自动转换还包括赋值运算时赋值号右端类型向左端类型的转换8.内部函数C/C++中提供了多种内部函数供用户编程序时直接调用,只需把包含内部函数的头文件,通过#include预处理命令装入到程序中。例如,程序中要使用平方根函数sqrt,应该在程序加入:#includemath.h“232.4指针1.基本概念每个变量在内存中存放都对应一段地址,第一个字节的地址就是变量的地址,将存放地址的变量称为指针变量。&求地址变量的地址在编程阶段是不知道的在程序中可以使用&运算符求得变量的地址。intx;&x就是变量的地址24取内容**(地址)表示根据地址取内容如图中所示,*(&x)的值为4指针指针是一种变量,存放另一个变量的地址。intx=4;int*p;p=&x;p就是一个指针,存放x的地址。p指向x,*p的值为4,*p就是x。出现x的地方可以用*p代替,出现*p的地方可以用x代替。10014px252.定义及初始化定义例如:int*p;float*q;指针所指对象的类型。初始化在定义的同时赋初值,称为指针变量的初始化。例如:floatd=1.5,*p=&d;可改写为:floatd=1.5,*p;p=&d;//注意不能写做*p=&d数据类型*标识符;不是指针名的一部分&d1.5pd26假定有定义:int*p,a;•p=NULL;指针的值为NULL(0)表示不指向任何对象。•p=&a;p指向变量a。•p1=&a;p2=p1;相同类型的指针变量可以相互赋值例,假设有定义:inta,*p;floatf;则以下形式不允许:()p=&f;()p=100;3.运算赋值运算27算术运算•p+n(或p-n):p+n:指向后面的第n个元素。p-n:指向前面的第n个元素。p+n的值为:p的值+n*sizeof(p指向的类型)如,有定义:inta,*p=&a;假设a的地址为1000,则:p的值为1000p+3的值为:1000+3*sizeof(int)=1000+3*4=101228•自增(++)和自减(--)p++、++p、p--、--p自增或自减后p指向前一个或后一个元素指针相减两个类型相同的指针可以相减,结果为这两个地址差之间能够存放的数据个数(数据类型为指针所指的类型)。如,有定义:int*p1,*p2;假设p1