1第2章C++编程基础程序设计工作主要包括数据结构(即数据类型)和算法(操作步骤)的设计。程序中最基本的元素是数据类型,确定了数据类型,才能确定变量空间的大小和其上的操作;算法是由一系列控制结构组成。每种语言都是用一组字符来构造有意义的语句,C++语言的字符集由下述字符构成:英文字母:A~Z,a~z数字字符:0~9特殊字符:空格!#%^&*_(下划线)+=:-~/\‘“;.(){}[]2.1数据类型与表达式一个程序要运行,就要先描述算法。描述一个算法应先说明算法要用的数据,数据以变量或常量的形式来描述,每个变量或常量都有数据类型。C++中的数据类型分为基本类型和非基本类型,见图2-1。基本类型是C++编译系统内置的,非基本类型也称是用户定义数据类型,即用户自己定义的数据类型,字符型char整型int整数integer短整形short长整形long基本类型逻辑型bool单精度型float实数floating双精度型double数据类型长双精度型longdouble枚举型enum数组型非空数据类型[]指针型非空数据类型*非基本类型空类型void结构体类型struct共用体类型union类class图2-1C++数据类型无符号数unsigned2数据类型的定义确定了其内存所占空间大小,也确定了其表示范围。表1-1列出了基本数据类型的取值范围。需要说明的是,在不同的系统中,每个变量类型所占的字节数目可能有所不同,这里列出的是在VC++编译环境中的情况。表2-1常用基本数据类型描述类型说明长度表示范围备注bool逻辑型1false,truechar字符型1-128~127-27~(27-1)unsignedchar无符号字符型10~2550~(28-1)short短整形2-32768~32767-215~(215-1)unsignedshort无符号短整型20~655350~(216-1)int整型4-2147483648~2147483647-231~(231-1)unsignedint无符号整型40~42949672950~(232-1)long长整型4-2147483648~2147483647-231~(231-1)unsignedlong无符号长整型40~42949672950~(232-1)float浮点型4-3.4×1038~3.4×10387位有效位double双精度8-1.7×10308~1.7×1030815位有效位longdouble长双精度8-1.7×10308~1.7×1030815位有效位2.1.1常量所谓常量是指在程序运行的整个过程中其值始终不可改变的量,常量有以下几种:1.整型常量整型常量即以数码形式出现的整数,包括正整数、负整数和零。整型常量的表示形式有十进制、八进制和十六进制。十进制整型常量的一般形式为:[±]若干个0~9的数字八进制整型常量的一般形式为:[±]0若干个0~7的数字十六进制整型常量一般形式为:[±]0x若干个0~9的数字及A~F的字母整型常量可以用后缀字母L(或l)表示长整型,后缀字母U(或u)表示无符号型,也可同时用后缀L和U(大小写无关)。2.实型常量实型常量又称浮点小数,在C++语言中,实型常量只使用十进制表示,有两种表示形式:一般形式例如:16.5,-13.5等。指数形式例如:0.565E+2表示0.565×102,-34.4E-3表示-34.4×10-3,实型常量默认为double型,如果后缀F(或f)则为float型。33.字符常量字符常量是单引号括起来的一个字符,如’a’,’G’,’?’,’$’等。另外,还有一些字符是不可显示字符,也无法通过键盘输入,例如响铃、换行、制表符、回车等等。这样的字符常量该如何写到程序中呢?C++提供一种称为转义序列的表示方法来表示这些字符,表2-2列出了C++预定义的转义序列。表2-2C++预定义的转义序列字符形式ASCII码(十六进制)功能\n0A换行\t09横向跳格(即跳到下一个输出区)\v0B竖向跳格\b08退格\r0D回车\a07响铃\\5C反斜杠字符“\”\’27单引号\”22双引号\dddddd(八进制)1到3位8进制数所代表的字符\xhhHh1到2位16进制数所代表的字符4.字符串常量字符串常量简称字符串,是用一对双引号括起来的字符序列,例如”China”就是一个字符串常量。5.布尔常量布尔型常量只有两个:false(假)和true(真)。2.1.2变量在程序的执行过程中其值可以变化的量称为变量,变量需要用标识符来命名。变量在使用之前需要首先声明其类型和名称。变量声明的形式如下:类型标识符变量名1,变量名2,…,变量名n;在声明一个变量的同时,也可以给它赋以初值。2.1.3引用引用是个别名,当建立引用时,程序用另一个变量或对象(目标)的名字初始化它。自此,引用作为目标的别名而使用,对引用的改动实际是对目标的改动。引用的声明形式为:类型标识符&引用名=目标名或类型标识符&引用名=目标名其中:①引用名是为引用型变量所起的名字,它必须遵循变量的命名规则。4②前面的数据类型就是它所引用目标的数据类型。在此要特别说明的是:引用在声明时必须进行初始化,即指出该引用是哪一个对象的别名,这里的目标名可以是变量名,也可以是以后将要介绍的对象名。而且引用一旦声明,就以对应目标的内存单元地址作为自己的地址,并且不再改变,从一而终。例如,引用一个整型变量:intsomeInt;int&rInt=someInt;声明rInt是对整数的引用,初始化为引用someInt。在这里,要求someInt已经声明或定义。引用不是值,不占存储空间,声明引用时,目标的存储状态是不会改变的。例2-1如何建立和使用引用例题。#includeiostream.hvoidmain(){intsomeInt;int&rInt=someInt;someInt=6;coutsomeInt:someIntendl;coutrInt:rIntendl;rInt=7;coutsomeInt:someIntendl;coutrInt:rIntendl;}程序运行结果为:someInt:6rInt:6someInt:7rInt:7在上述程序中,引用rInt用someInt来初始化。以后,无论改变someInt或rInt,实际上都是指someInt,两个的值都一样,对引用的理解可以见图2-2。someIntrInt图2-2引用与变量的关系需要注意的是,引用在声明时必须初始化,否则会产生编译错误。652.1.4表达式表达式由运算符、运算对象和括号组成。1.运算符C++语言中定义了丰富的运算符,如算术运算符、关系运算符、逻辑运算符等等,有些运算符需要两个操作数,使用形式为:操作数1运算符操作数2这样的运算符称为二元运算符(或二目运算符)。另一些运算符只需要一个操作数,称为一元运算符(或单目运算符)。运算符具有优先级与结合性。在表2-3中列出了C++中全部运算符的优先级与结合性。2.表达式在任何高级程序设计语言中,表达式都是最基本的组成部分,也就是说程序中的大部分的语句是由表达式构成的。可以简单地将表达式理解为用于计算的公式,它由运算符(例如:+-*/)、运算对象(也称操作数,可以是常量、变量等等)和括号组成。执行表达式所规定的运算,所得到的结果值便是表达式的值。表达式在使用时要注意以下几点:①一个常量或标识对象的标识符是一个最简单的表达式,其值是常量或对象的值。②一个表达式的值可以用来参与其它操作,即用作其它运算符的操作数,这就形成了更复杂的表达式。③包含在括号中的表达式仍是一个表达式,其类型和值与未加括号时的表达式相同。当表达式中出现了多种类型数据的混合运算时,首先需要进行类型转换,其次才计算表达式的值。表达式中的类型转换分为两种:隐含转换和强制转换。表2-3运算符优先级优先级运算符结合性1[]().-后置++后置--左→右2前置++前置--sizeof&*+(正号)-(负号)~!右→左3(强制转换类型)右→左4*-*左→右5*/%左→右6+-左→右7左→右8==左→右9==!=左→右10&左→右11^左→右12|左→右13&&左→右614||左→右15?:右→左16=*=/=%=+=-===&=^=|=右→左17,左→右(l)隐含转换在混合运算时,对于二元运算符要求两个操作数的类型一致,若参加运算操作数类型不一致时,系统自动对数据进行转换(即隐含转换),具体的规则如下:算术运算和关系运算转换的基本原则是将低类型数据转换为高类型数据。各种类型的高低顺序如下:charshortintunsignedlongunsigned-longfloatdouble低高逻辑运算符要求参与运算的操作数必须是bool型,如果操作数是其它类型,则系统自动将其转换为bool型。转换方法是:非0数据转换为true,0转换为false。位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,编译系统会自动进行类型转换。赋值运算要求左值(赋值运算符左边的值)与右值(赋值运算符右边的值)的类型相同。(2)强制类型转换强制类型转换又称为显式转换,是通过类型标识符和括号来实现的,其语法形式有两种:类型标识符(表达式)或(类型标识符)表达式2.2程序的控制结构2.2.1选择结构用if语句可以实现简单选择结构。其语法形式为:if(表达式)语句1else语句2执行顺序是:首先计算表达式的值,若表达式值为true,则执行语句1;否则执行语句2。if语句中的语句2可以为空,当语句2为空时,else可以省略,成为如下形式:if(表达式)语句17其中语句1和语句2不仅可以是一条语句,而且可以是大括号括起来的多条语句,即复合语句。2.2.2switch语句如果在算法中,虽然需要进行多次判断选择,但都是判断同一个表达式的值,这样就没有必要在每一个嵌套的if语句中都计算一次表达式的值,为此C++中有switch语句专门来解决这类问题。switch语句的语法形式如下:switch(表达式){case常量表达式1:语句1case常量表达式2:语句2…case常量表达式n:语句ndefault:语句n+1}使用switch语句应注意下列问题:①switch后面括弧内的括弧“表达式”的值只能是整型、字符型、枚举型。②各常量表达式的值不能相同,且次序不影响执行结果。③每个case分支可以有多条语句,但不必用{}。④每个case语句只是一个入口标号,通常我们只需执行一个case后的语句,因此,每个case分支的最后应该加break语句,用来结束整个switch结构,否则从入口点开始一直执行到switch结构的结束点。⑤当若干分支需要执行相同操作时,可以使多个case分支共用一组语句。2.2.3循环结构在C++中有三种循环控制语句:1.while语句while语句的语法形式:while(表达式)语句执行顺序是:判断一个条件表达式(循环控制栏件),以便决定是否应当进入和执行循环体,当条件满足时进入循环,不满足该条件时则不再执行循环。2.do-while语句语法形式:do语句while(表达式);执行顺序是:当流程执行到do后,立即执行循环体语句,然后在判断循环条件表达式的值。表达式为true时,继续执行循环体,表达式为false则结束循环,该语句结构使循环至少执行一次。3.for语句8for语句的使用最为灵活,既可以用于循环次数确定的情况,也可以用于循环次数未知的情况。for语句的语法形式如下:for(表达式1;表达式2;表达式3)语句for语句的执行流程为:①首先计算表达式1的值;②再计算表达式2,如果表达式2的值为false,则退出循环。③如果表达式2的值为true,则执行一次循环体,然后计算表达式3的值;④转回②,表达式2的值决定是否继续执行循环体。一个循环体内可以包含另一个完整的循环结构,构成多重循环。w