第二章数据类型运算符和表达式_第1页
第二章数据类型运算符和表达式_第2页
第二章数据类型运算符和表达式_第3页
第二章数据类型运算符和表达式_第4页
第二章数据类型运算符和表达式_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章数据类型、运算符和表达式VC++的数据类型基本运算符表达式语句、空语句及自增、自减运算符VC++的数据类型关键字标识符标点符号分隔符C++的基本数据类型常量变量2.1关键字(keyword)在C++语言中,已有特殊含义和用途的英文单词称为关键字或保留字C++中有48个关键字,其中5个不适用VC++VC++中增加了19个关键字,它们不适用C++C++与VC++兼容的43个关键字表2-12.1.1标识符标识符的定义以字母或下划线开始的字母、数字以及下划线组成的字符序列称为标识符。标识符的有效长度VC++中,标识符的有效长度为1~247个字符标识符的命名方法Windows标准命名法(匈牙利法)意义法 2.1.2标点符号C++中的标点符号共有9个:#、(、)、{、}、,、:、;、…标点符号不表示任何操作同一个符号在不同的应用场合,其作用与含义是不同的例如“,”既可做为标点符号,又可作为运算符使用2.1.3分隔符C++源程序中每一个词法符号之间必须用分隔符分隔开C++中的分隔符有:运算符、空格、标点符号、回车键和Tab键注解也可以用作分隔符2.1.4C++的基本数据类型描述一个数据需要两方面的信息:一是数据所占用的存储空间的大小(字节数),二是该数据所允许执行的操作或运算。为了便于对数据进行操作和加工,需要对数据进行分类,这种分类称为数据类型。C++中数据类型分为两大类:基本数据类型和导出数据类型。基本数据类型2.1.5基本数据类型基本数据类型:字符型(char)、整型(int)、实型(float)、双精度型(double)和无值型(void)。可以在这些基本数据类型前加上以下几个修饰词而形成一种新的基本数据类型:有符号(signed)、无符号(unsigned)、长(long)、短 (short)。以上四个修饰词来修饰int时,关键字int可以省略。无修饰词的int和char,编译程序认为是有符号的。常量在程序的执行过程中,值保持不变(也不能被改变)的量称为常量。字面常量标识符常量2.1.6字面常量整型常量实型常量字符型常量字符串常量整型常量十进制常量:第一位为1~9的任意整数(由0~9之间的整数构成),比如123,-45八进制常量:以0开头的整数(由0~8之间的整数构成),比如043,071十六进制常量:以0X或0x开头的整数(由0~9之间的整数以及A~F之间的字母构成),比如,0X32,0xA3F长整型常量:以L

或l

结尾的整数,比如:123L,824l无符号整形常量:以U或u结尾的整数,比如:123u,824U实型常量十进制小数形式:比如,1.23指数形式:格式为<小数>E(或e)<指数>,比如,2e3表示2000,2E-4表示0.0002字符型常量用单引号括起来的单个字符叫字符型常量。字符常量在计算机内是采用该字符的ASCII编码值来表示的,其数据类型为char。注意三个字符:‘“\,不能直接表示为‘‘’,‘”’,‘\’,而必须采用转义序列方法。

转义序列方法反斜杠+字母:表示控制字符,比如‘\a’表示响铃,‘\n’表示回车符。反斜杠+特殊字符(‘,“,\),表示该字符。比如,’\\‘表示反斜杠“\”,’\‘’表示单引号“‘”。反斜杠+整型常量:此时整型常量必须是一个八进制或十六进制数(以X或x开头),其取值通常在0~255之间,此时,如果在整数之前没有0,表示八进制。比如:‘\141’、‘\X61’都与‘a’等价。字符串常量用双引号括起来的若干个字符。当双引号(“)或反斜杠(\)作为字符串中的一个字符时,必须采用转义序列法;而单引号(‘)出现在字符串中时,可采用或不采用转义序列法。字符串常量和字符常量的区别在每一个字符串常量的末尾,存储时都要存放一个“0”,表示字符串的结束符字符串常量不能直接运用一些运算,比如算术运算、比较运算等,而字符常量可以标识符常量用标识符表示的常量。可用两种方法定义标识符常量:利用编译预处理指令。利用关键字define,以如下形式定义常量: #definePI3.14159利用常量说明符const。比如:

constI=2;注意,标识符常量一经定义,在其后继的程序中就不能改变其值。例2-1变量在程序的执行过程中,可改变其值的量称为变量。根据其取值不同,变量可分为不同类型的变量:比如,整型变量、实型变量、字符型变量、构造型变量、指针型变量等。对于任一变量,编译程序要为其分配若干个字节(连续的)的内存单元,以便保存该变量的值,分配内存的大小由变量的类型决定。不管是什么类型的变量,通常是变量的说明在前,变量的使用在后。变量说明变量的赋值与初始化2.1.7变量说明说明变量的一般格式为:《storage》<type><var_name1>《,<var_name2>,…..,<var_namen>》;在C++中,变量说明是作为一条语句来处理的,称为变量说明语句。变量说明可以出现在程序语句可出现的任何位置。同一个变量只能作一次定义性说明。给一个变量取一个新值时,称为对变量的赋值;取一个变量的值时,称为对变量引用;变量的赋值与初始化变量的值可以通过赋值语句而得到改变。比如,假设有一个整型变量a,则通过如下语句就可以改变a的值: a=2;当引用某个变量时,该变量必须有一个唯一确定的值。首次给变量赋值称为对变量赋初值,或变量的初始化。可以用三种方法给变量赋初值:在变量说明时,直接赋初值;使用赋值语句赋初值;通过输入流cin等其它方法。基本运算符在C++中,对数据(变量或常量)进行运算或处理是通过运算符进行的。所谓运算符就是表示某种特定运算形式简单的记号。参与运算的对象称为操作数。数据与运算符一起构成表达式,它描述对哪些数据

、以何种顺序进行什么样的操作。要正确掌握运算符,必须要注意的几点基本运算符表达式类型转换2.2要注意的几点每个运算符的功能和作用运算符与操作数的关系 运算符的操作数的个数、操作数的类型运算的优先级与结合性(表1.3)

运算符的结合性规定了优先级相同的运算符的计算顺序。有两种结合性:右结合:操作数按从左到右的顺序进行运算,绝大多数运算符都是右结合的左结合:操作数按从右到左的顺序进行运算基本运算符基本运算符是指完成算术运算、关系运算、逻辑运算、位运算的运算符

算术运算符

关系运算符

逻辑运算符

位运算符

赋值运算符

sizeof()运算符

2.2.1算术运算符C++中有单目运算符:+-(正负号)C++中有双目运算符:+-*/%算术运算符都是右结合的,它们之间的优先级与数学中一致。可用括号()来改变运算符的优先顺序,先计算括号内的值,再计算括号外的值对于双目运算符来说,两个整数的运算结果还是整数;但当其中有一个操作数为实型或double型时,则运算结果为实型或double型运算符%的操作数只能是整型或字符型关系运算符关系运算是对两个操作数进行的比较运算,C++中有六个关系运算符:<<=>>===!=关系运算符都是二目运算符。运算结果是一个整数,即当关系成立时,结果为1,而当关系不成立时,结果为0关系运算符的两个操作数可以是任意基本类型的数据在应用关系运算符时,要注意计算机存储和运算的精度误差逻辑运算符逻辑运算符用来表示操作数之间的逻辑关系,其运算结果为0或1,即当逻辑关系成立时,运算结果为1,否则,为0(表1.4)C++中,逻辑运算符有三种:!:逻辑非,单目运算符&&:逻辑与,双目运算符||:逻辑或,双目运算符逻辑运算符的操作数可为任意一种基本数据类型的变量和常量,在运算过程中,将非0数转化为1参与运算。

表1.4ab!a!bA&&ba||b110011100101011001001100位运算符位运算符是对其操作数按二进制数形式逐位进行的逻辑运算或移位运算。位运算符的操作数只能是整数类型的数据。C++中共有六种位运算符:注意,在进行位运算时,如果其中一个操作数为变量,在经过运算后操作数的值并没有改变,只是将运算结果作为位运算的返回值按位取反(~)按位与(&)按位或(|)按位异或(^)左移(<<)右移(>>)按位取反(~)

将操作数的各个二进制位取反。即0变1,1变0。该运算符为单目运算符

比如:对于整型数a,其二进制值为110101,则~a为0xffffffca。计算过程如下:由于a是整型,故在存储空间中占4个字节,共32位,因此a的低8位为00110101,而高位都为0,因此按位取反之后高位都为1,而低8为为11001010,即0xffffffca按位与(&)将两个操作数的对应的二进制位分别进行逻辑与运算。该运算符为双目运算符。按位逻辑与的运算规则是只有当两个操作数都为1时,结果才为1,否则为0比如,整型变量a和b的二进制形式的值分别为:11001和11110000,则a&b的二进制值为00010000。该运算用竖式表示如下:

a00011001b&)11110000a&b00010000按位或(|)将两个操作数对应的二进制位分别进行逻辑或运算。该运算符为双目运算符。按位或的运算规则是只有当两个操作数都为0时,结果才为0,否则为1比如,整型变量a和b的二进制形式的值分别为:11001和11110000,则a|b的二进制值为11111001。该运算用竖式表示如下:

a00011001b|)11110000a|b11111001按位异或(^)将两个操作数的对应的二进制位分别进行逻辑异或运算。该运算符为双目运算符。逻辑异或的运算规则为:仅当两操作数的在某位对应不同时,该位的运算结果为1,否则为0。

比如,整型变量a和b的二进制形式的值分别为:11001和11110000,则a^b的二进制值为11101001。该运算用竖式表示如下:

a

00011001b^)11110000a^b11101001左移(<<)将一个二进制数向左移位指定的位数。该运算符为二目运算符,其一般格式为: <操作数1><<<操作数2>其中<操作数1>(设为a)为任一类型的整型变量,而<操作数2>(设为b)通常为一正整数,表示将a的二进制形式中的各位依次向左移动b位,移动的结果作为该运算的返回值,但a的值保持不变。比如:

inta=34,b=2,c; c=a<<b;//将a的二进制形式的各位数向左移位2位。

此时a的值保持不变,依然为34,而将移位后的结果136赋给c。

右移(>>)将一个二进制数向右移位指定的位数,该运算符为二目运算符,其一般格式为:

<操作数1>>><操作数2>其中<操作数1>(设为a)为任一类型的整型变量,而<操作数2>(设为b)通常为一正整数,表示将a的二进制形式中的各位依次向右移动b位,移动的结果作为该运算的返回值,但a的值保持不变。对一个整数右移n位,相当于将该数除以2n,并忽略小数部分

赋值运算符C++中赋值运算符分为两种:

单一赋值运算符。即等号“=”。该运算符为二目运算符,且结合性为左结合。其功能为将右操作数赋给左操作数。例如:

a=10//把10赋给变量a复合赋值运算符。在单一的赋值运算符“=”前加上其它运算符(算术运算符或位运算符),可以构成复合的赋值运算符。C++提供了如下10种复合的赋值运算符:+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=sizeof()运算符sizeof()运算符是用来计算某种类型或数据所占用的字节数,它为单目运算符。该运算符与其它类型的基本运算符稍有不同,它的操作数必须在括号内,其使用格式为:

sizeof(<类型>)或sizeof(<表达式>)其中前一种格式中<类型>可以是任意一种基本数据类型或用户自定义类型。后一种格式用于计算<表达式>结果所属类型所占用的字节数。例如

sizeof(int) //对32位计算机,其值为4sizeof(char) //其值为1sizeof(longdouble) //其值为8

doublea=2.0; floatb=3.4;sizeof(b+3)//其值为4,因为b+3的结果为实型数

sizeof(b+3.4)//其值为8,因为b+3.4的结果为双精度型数

sizeof(a+3.4)//其值为8,因为a+3.4的结果为双精度型

表达式 表达式是由运算符和操作数组成的,能够求出值的式子。操作数可以为常量、变量、函数调用或其它表达式等等。最简单的表达式是常量和变量。根据运算符的类型的不同,可将表达式分为五类:算术表达式逻辑表达式关系表达式赋值表达式逗号表达式2.2.2算术表达式算术表达式是由算术运算符和操作数组成的,能求出其值的式子。操作数可以是任意基本类型的数据。

在求算术表达式的值的过程中,要按运算符的优先级别高低次序执行,即先算乘除,后算加减。相邻两个运算符的优先级相同,则按规定的“从左到右”的次序运算。最后表达式的值就是该表达式的算术运算的结果,表达式的类型按混合运算的类型转换规则确定。例如inta=2,b=2,c=4,d=5,e=6;intf=a+b-c/d*e;

等价于intf=((a+b)-((c/d)*e));intg=++a*a+a*a; //Ag的值为18inth=b*b+++b*b; //Bh的值为13A、B两行反映了算术运算符的结合性。在A行,先将a加1变为3,再计算++a*a,结果为9,然后计算a*a,结果为9,最后将这两者相加得g得值为18。对于B行,先计算b*b,结果为4,然后计算++b*b,在计算该式之前,先将b加1变为3,然后再计算得结果为9,最后将这两式相加,得到h的值为13。

逻辑表达式用逻辑运算符将操作数连接起来的式子称为逻辑表达式。逻辑表达式的值为1或0。例如:

inta=2,b=3,c=4,d=5,e;e=!a;//e的值为0e=a>b||a<c;//等价于e=((a>b)||(a<c)),e的值为1e=a>b||a>!c&&b>=d-2//等价于e=(a>b)||((a>!c)&&(b>=(d-3))),e的值为1e=!a>b//等价于e=!(a>b),e的值为1逻辑表达式的副作用

逻辑表达式的副作用对于a&&b&&c,只有a为非0时,才需要计算b的值,因为当a为0时,不管后面的项如何,都能得到该表达式的值就为0。同样只有在a和b都为非0的情况下才需要计算c的值。

对于a||b||c,只要a为非0,就不需要判断b和c的值,而只有当a、b都为0时才需要计算c项。

例如:

inta=2,b=3,c=4,d=5,e;e=a>b&&++b; //Ae=a<b||b++类似e=a<1&&++c||++d; //B

关系表达式关系表达式是用关系运算符将两个操作数连接起来的式子。关系表达式的值为0或1,即当关系成立时,值为1;而当关系不成立时,值为0。例如

inta=2,b=3,c=4,d=5,e;e=a+b>c+d; //根据优先级,等价于 e=((a+b)>(c+d)),因此e值为0e=++a==b;//等价于e=((++a)==b),e的值为1。 试比较a++==b(值为0)e=5<=6 //e的值为1e=‘a’>=’b’ //e的值为0赋值表达式用赋值运算符(单一赋值运算符和复合赋值运算符)将两个操作数连接起来的式子称为赋值表达式,注意赋值表达式的左操作数必须为变量。赋值表达式的值为左操作数的值,因此赋值表达式还可进一步参与运算。例如

由于赋值运算符的结合性为左结合,因此运算方向是自右向左的,因此当出现连续赋值运算符时,表达式的值为最左边的变量的值。例如

inta,b;a+=4;a>(b=3);//表达式“b=3”(值为3)参与关系运算,注意:括号不能省

a&&(b*=4)//表达式“b*=4”参与逻辑运算

a+b=2;//错误,因为a+b不是变量。类似的错误还有a+2=4等

inta,b,c=2;a=b=c+=10;//等价于a=(b=(c+=10)),该表达式的为a的值,即12a=3+b=c;//错误,因为该表达式等价于a=((3+b)=c),3+b不是变量

a+=b=3;//等价于a+=(b=3)逗号表达式逗号表达式是用逗号运算符将表达式连起来组成的式子。逗号运算符的优先级为所有运算符中最低的。逗号运算符的结合性为右结合,且整个逗号表达式的值和类型与最后一个表达式的值和类型一致。例如

自增自减运算符在逗号表达式中的应用

inta=1,b=3,c=2,d;d=(a=4,b=2,a>b); //先计算a=4,再计算b=2,最后计算a>b为1,因此d=1d=a=(b=3,c*2); //结果:a=c*2=4,b=3,d=4a=1;d=(a++,b+=a,c=b+2);先计算a++,然后将a增加以后的值2参与第二项b+=a的计算,得到b=5,再计算c=b+2,得到c=7,因此第三个表达式的值为7,即该逗号表达式的值为7。这里若用++a代替a++,则所得到的结果一样。

自增自减运算符在逗号表达式中与在其它表达式中的运算规则是不一样的。试比较:

inta=2,b;a++>(b=a);//执行该语句后,得到a=3,b=2。这里前置自增和后置自增的结果不同

类型转换在求表达式值的过程中,对于二目运算符,通常会出现两个操作数的类型不一致的情形,这时就要求将这两个操作数转换为同一类型,然后再进行运算。一般情况下,C++会进行自动转换,当然也可以强制转换。

不同类型数据运算的自动转换规则

不同类型之间赋值的自动转换规则

强制类型转换

2.2.3不同类型数据运算的自动转换规则当操作数的类型为字符型或短整型(包括加上signed、unsigned修饰词)时,系统自动转换为整型数参与运算。例如

当两个操作数不同时,将表示范围较小的数据类型转换成与另一操作数相同的类型后再参与运算。转换关系为:

int→unsigned→long→float→double

例如

shortinta=2,b=3;charx=’a’,y=’b’;

则在计算表达式a+b的值时先将a和b转换为整型,然后再进行计算,表达式的值类型也为整型。可以用运算符sizeof()进行验证,即sizeof(a+b)=4。

对x+y和a+x也采用同样的方法进行计算。

可以看到,当两个操作数的类型相同且都为字符型和短整型时,要进行类型转换。但当两个操作数的同为其它类型时,则不需要类型转换。

inta=3,b=4;charch=’s’;doublex=3.4;

在计算表达式a*ch+b/x时,首先计算a*ch,先将ch转换为整型数,再参与运算,假设得到结果为t1,然后计算b/x,先将b转换为double型,再参与运算,得到的结果为double型,假设为t2,最后计算t1+t2,先将t1转换为double型,再参与运算,得到一个double型的数,即为表达式的值。

不同类型之间赋值的自动转换规则 当赋值运算符右操作数的类型与左左操作数(变量)的类型不一致时,如果它们可进行转换(称它们相互兼容),则系统自动对它们进行转换。规则如下:将实型数(双精度型)赋给整型变量将字符型数据赋给整型变量其它情形对于以上的各种形式的自动转换,编译系统在编译时可能会给出一些警告信息。如要避免警告信息,可采取强制转换的方式。将实型数(双精度型)赋给整型变量将实型数(双精度型)赋给整型变量时,只取实型数的整数部分,舍去小数部分。当其整数部分超过整数的范围时,赋值的结果错误。

将字符型数据赋给整型变量 根据字符类型的不同,可分两种情况:

(a)对于无符号字符类型,将该字符型数据的二进制形式的八位数直接赋给整型变量二进制形式的低八位,再将整型变量的高位补0。

(b)对于有符号字符类型,若符号位为0,则与无符号字符类型的转换方式相同;如符号位为1,则将将该字符型数据的二进制形式的八位数直接赋给整型变量二进制形式的低八位,再将高位补1。例如

signedcharch=249;inta=ch;则a的值为-7。转换过程可用下图表示:

1111100111111001111111111111111111111111低八位高位字符型数据ch整型变量a其它情形对于其它情形,当将精度较低的数据赋给精度较高的变量时,可直接将前者转换为与后者精度相同,再赋值。当将精度较高的数据(设为a)赋给精度较低的变量(设为b)时,当a赋给b的值超出b所属类型的范围时,则赋值的结果错误。

强制类型转换强制类型转换是指把一个表达式的值强制转换为指定的类型。格式如下:

(<类型名>)<表达式>或<类型名>(<表达式>)

这种方法的功能是:先求表达式的值,再将该值强制转换为<类型名>所指定的类型。

对于第一种形式,要注意强制类型转换运算符“()”的优先级为第2级。例如

(float)3/4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论