C++编程基础教程_第1页
C++编程基础教程_第2页
C++编程基础教程_第3页
C++编程基础教程_第4页
C++编程基础教程_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、C+程序设计C+是一门面向对象的程序设计语言,语法丰富,概念全面,兼顾易用和效率,在游戏开发、网络软件、分布式(服务器集群)、移动(手持)设备、嵌入式系统等领域有着广泛的应用。C+是由C语言发展而来,保留了C语言原有的所有优点,增加了面向对象的机制。C+与C语言兼容,用C语言写的程序基本上可以不加修改地用于C+。一. C+基础知识1.C+语言概述2.简单的C+程序实例3.C+的词法单位4.C+的数据类型5.变量和常量6.运算符和表达式7.C+语句8.算术类型转换和赋值类型转换9.求值次序与副作用10.数组与字符数组11.输入输出12.输入输出格式的控制二. 基本控制结构1.算法的概念与表示方法

2、2.分支结构-if语句3.分支结构-if语句的嵌套4.分支结构-条件运算符5.分支结构-switch语句6.循环结构-while语句7.循环结构-do-while语句8.循环结构-for语句9.循环结构-循环的嵌套10.转向语句11.结构化程序设计思想12.常用算法的应用实例13.枚举类型14.文件操作三. 函数函数的定义与调用参数传递、返回值及函数声明全局变量和局部变量函数调用机制作用域与标识符的可见性变量存储类型与标识符生命期函数的递归调用函数的重载、内联和默认参数头文件与多文件结构编译预处理四. 类与对象1.类和成员函数的定义2.C+对象的创建与使用3.从面向过程到面向对象4.构造函数和

3、析构函数5.引用与复制构造函数6.运算符重载7.友元8.静态成员9.结构五. 数组与指针1.数组2.多维数组3.指针与地址4.指针与地址5.this 指针6.数组与指针的关系7.字符串和string类8.多级指针与多维数组六. 模板与数据结构C+模板-函数模板C+模板-类模板与线性表常用的查找方法常用的排序方法索引查找与指针数组函数指针与指针识别七. 动态内存分配1.自由存储区内存分配2.浅复制与深复制3.链表-单链表的基本算法4.链表-单链表类型模板5.链表-双向链表6.栈与队列-栈的基本操作和应用7.栈与队列-队列及其操作8.二叉树八. 继承与多态1.继承与派生的概念2.派生类的构造函数与

4、析构函数3.多重继承与派生类成员标识4.虚基类5.派生类应用讨论6.多态性与虚函数九. 输入/输出流类库C+的基本流类体系输入输出的格式控制标准设备的输入/输出文件-文件的打开与关闭文件-文件的读/写文件-文件的随机访问字符串流文件与对象十. 异常处理1.异常的概念和处理机制2.栈展开与异常捕获3.异常的重新抛出和catch_all4.异常与继承5.异常规范6.C+标准库的异常类层次结构十一. 标准模板库1.标准模板库简介2.迭代子类3.顺序容器类4.泛型算法与函数对象5.关联容器类6.容器适配器一、C+基础知识C+语言是目前广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一

5、席。本章作为C+程序设计的入门章节,首先结合实例介绍C+程序的概貌;然后针对其特点,介绍C+中的基本词法单位、数据类型、相关运算、以及常量、变量、表达式、语句等基础知识,为编程做好准备;最后介绍简单的输入输出方法。本章内容:1、C+语言概述C+语言是广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一席。C语言的发展· 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发出C语言,最初是作为UNIX的开发语言。· 20世纪70年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步成为独立的程序设计语言。·

6、; C语言版本很多,为了让开发出来的代码能够在多种平台上运行,1988年ANSI(美国国家标准协会)对C语言进行了标准化,产生了ANSI C。C语言的特点· 既有高级语言的结构和编程环境,又有类似于低级语言(如汇编语言)的系统资源操纵能力;· 目标代码的执行效率只比汇编低1020% ,比其他高级语言高,适合解决有实时要求的问题;· 有丰富的运算符、数据类型和表达式,对程序设计有良好的适应性;· 支持以函数为基础结构化程序设计、多文件构成及文件独立编译,适合大型复杂程序设计;· 语言简洁、紧凑,使用方便、灵活,书写形式自由;· 代码及可

7、执行程序的可移植性好。C+语言的发展20世纪80年代初,继面向对象语言smalltalk后,许多程序设计语言都向面向对象的方向发展。C+就是以C语言为基础而发展起来的以面向对象为主要特征的语言。C+语言的特点· 继承了C语言的优点,又扩充了数据类型,使编译系统可检查出更多类型错误;· 支持面向对象程序设计,通过继承、重载和多态性等特征实现了软件重用和程序自动生成;· 加强了一致性(Consistency)检查机制,提高了软件开发的效率和质量;· 完全兼容C,多数C编写的库函数和应用程序都可为C+所用,加快了C+和面向对象技术的推广;· 既支持面

8、向对象程序设计,也支持面向过程设计,不是纯正的面向对象的语言;· C+有许多版本,国内较为流行的有Microsoft公司的Visual C+。2、简单的C+程序实例下面通过一个简单的程序例子来分析C+程序的基本构成及主要特点。程序举例【例1.1】 一个简单的C+程序:输入两个整数,通过调用函数求两个数中的较大值。#include <iostream.h>using namespace std;int max(int i, int j)      /*定义max()函数*/    if (i>=j) retu

9、rn i;    else      return j;int main(void)                                                    /*定义main()函数*/   cout<&

10、lt;"输入i,j:"                                            /显示提示信息   int i, j;                           

11、0;                                    /说明变量   cin>>i>>j;                                      

12、;                   /从键盘上输入变量的值                                                             

13、60;                                        cout<<"最大数是:"<<max(i, j)<<'n'          /输出提示信息和结果   return 0;上面的示例代码中,黑色字体为程序主体,深

14、绿色字体为注释。组成结构及特点C+的程序结构由注释、编译预处理指令和程序主体组成。  注释:注释内容不参与编译,仅供程序阅读使用,编写程序时可根据需要选取。注释有两种形式:· 以“/”开头,至所在行结尾处(换行符之前)之间的内容。· 以“/*”开头和“*/”结尾,两者之间的内容均为注释,可占多行。  编译预处理:以符号“#”引出,一条指令也需在一行内写完。上例中的#include命令,称为“文件包含指令”,它使得后面被包含文件成为本程序的一个组成部分,被包含文件中的代码可以直接被使用。编译预处理是C+提供的组织程序的工具,有关内容在第

15、3章 函数中介绍。  程序主体:一般由一个或多个函数组成,但只有一个函数是程序入口,即代码执行的起点。如本例由max()和main()两个函数组成,函数main()是所有控制台程序程序的入口。· 在传统的Windows操作系统编程中,入口由系统定义为Winmain()函数。· 任一函数的描述都是包括在一对 “”和“”中的语句序列,每个语句以“;”结束。关于函数的详细知识将在第3章 函数中介绍 。· C+中严格区分大小写,但不严格限制程序的书写格式,不过从可读性角度出发,程序书写应采用内缩格式,一般一个语句占一行。执行过程· 上例给出的

16、是源程序代码,以扩展名为.cpp的文件形式保存在磁盘上,经编译、连接生成可执行程序,即扩展名为.exe的文件。· 运行可执行程序后,显示器显示: 输入i,j:· 若用户从键盘上输入两个整数10 20并按回车键,显示器上将显示结果: 最大数是:20· 这种编程方式称为“控制台编程”,即通过键盘和显示器,用文本方式对程序进行编辑、运行和调试,是最初的编程方式。3、C+的词法单位本节将分为4个小节介绍C+语言使用的字符集、关键字、标识符及标点符号。C+的字符集· ASCII码字符集是计算机中的常用字符集。它包括英文字母及阿拉伯数字等128个字符,存储一个ASC

17、II码占用一个字节单元。· 由于汉字处理的需要,又出现了汉字国标码等对应于不同语言的字符集。国标码的存储占用两个字节单元。· 为了对各类字符进行统一编码,Unicode字符集应运而生。它包括了世界上多种语言的基本字符,共有65536个字符。 ASCII码字符集国标码字符集都是它的子集。Unicode字符集对所有字符进行统一的双字节编码。C+语言使用下列基本字符来构成词法单位:26个小写字母abcdefghijklmnopqrstuvwxyz26个大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZ10个阿拉伯数字0 1 2 3 4 5 6 7 8 9其他符号

18、0;+ - * / = , . _ : ; ? " ' | ! # % & () < > 空格C+关 键 字关键字(keyword)又称保留字,是系统定义的具有特定含义的英文单词,不能另作它用。C+区分大小写,关键字全部由小写字母组成。标准C+(ISO14882)定义了74个关键字,具体的C+编译器还会做一些增删。常用关键字及分类见下表:数据类型说明符与修饰符bool、char、wchar_t、class、const、double、enum、float、int、long、short、signed、struct、union、unsigned、void、vol

19、atile存储类型说明符auto、extern、inline、register、static访问说明符friend、private、protected、public其它说明符asm、operator、template、this、typedef、virtual语句与标号break、case、catch、continue、default、do、else、for、goto、if、return、switch、throw、try、while运算符及逻辑值delete、false、new、sizeof、trueVC+中还有一些专用的关键字,它们都以双下划线开头:_ _asm、_ _based、_ _cde

20、cl、_ _emit、_ _export、_ _far、_ _fastcall、_ _fortran、_ _huge、_ _interrupt、_ _loadds、_multipile_inheritance、_ _near、_ _pascal、_ _saveregs、_ _segment、_ _signal_inheritance、_ _self、_ _stdcall、_ _virtual、_ _inheritance除以上之外的一些关键字本书不作介绍,可查阅相关手册。C+标识符标识符(Identifier,ID)是程序员定义的英文单词,用来给变量、常量、数据类型、函数等命名。合法标识符由字

21、母或下划线开始,由字母、数字、下划线组成,其有效长度为131个字符,长度超过31个字符者只识别前31个字符,VC+标识符长度为1247个字符。建议使用有一定含义的英文单词或拼音序列作标识符,以提高可读性;另外,尽量不用下划线或双下划线打头,以免与系统定义的关键字冲突。例如:判断下面哪些是合法的标识符(非 标红 部分之外均为合法的标示符)94Salary $amountf3.5Num_of_StudentSalary 94amountMyFilevoidSalary94   标点符号c+中的标点符号包括 #、 (、 )、 、 、 ,、

22、:、 ;、 " 、 '等。标点符号的作用:· 有一定的语法意义。例如字符和字符串常量分别用 ' ' 和 " "引起来。· 对语法符号起分隔作用。例如 ;等。4、C+的数据类型C+语言是广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一席。C+中的数据类型C+中的数据类型分为两大类:基本数据类型和非基本数据类型,如图1.1所示。图1.1 C+的数据类型说明:图中“type”表示任一种非void的类型,英文为关键字或程序中的表达方式。VC+中各种基本数据类型的详细说明VC+中各种基本数据类型的详细说明如下表

23、所示:类 型名 称占用字节数取 值 范 围bool布尔型true,false(signed) char有符号字符型1-128127unsiged char无符号字符型10255(signed)short(int)有符号短整型2-3276832767unsignedshort(int)无符号短整型2065535(signed) int有符号整型4-(2的31次方)2的31次方-1unsigned (int)无符号整型40(2的32次方-1)(signed)long (int)有符号长整型4-(2的31次方)(2的31次方-1)unsigned long(int)无符号长整型40(2的32次方-1

24、)float实型4-(10的38次方)10的38次方double双精度型8-(10的308次方)10的308次方long double长双精度型*8-(10的308次方)10的308次方void无值型0无值说明:· IEEE754定义长双精度型为10个字节,-(10的4932次方) 10的4932次方。· 表中用( )括起来的部分在书写时可以省略。例如:int和char默认为有符号的,等同于加修饰词signed。· short、long、signed和unsigned修饰int时,int可以省略。例如:unsigned short即是说明无符号短整型。5、C+变量

25、和常量变量和常量是用来在程序中表示数据的。常量是指取值在程序的执行过程中始终保持不变的量,又分为文字常量(Literal constant)和常变量(也称“符号常量”)。本节将分三小节来介绍。变 量  变量:在程序中是指可以改变值的量。  变量名:用于标识变量的标识符。而且变量必须用标识符进行标识。  变量的类型:变量有类型之分,如整形变量、字符变量等。  变量的说明:任何变量都必须先说明后使用。目的:一是便于编译程序为变量分配空间,二是便于编译时进行语法检查。格式:在C+中,变量说明的一般格式为:  &

26、#160; 存储类型<数据类型> <变量名1>,<变量名2>,<变量名n>;举例,下面是变量说明的几个例子:    int i, j, k;    /说明3个整型变量i,j,k    float x,y,z;    /说明3个实型变量x,y,z    char c1, c2;    /说明2个字符型变量c1,c2    double dx;  

27、60;     /说明1个双精度型变量dx  变量的使用:变量使用的第一步,是给变量赋初始值,称为“初始化”。有两种方法:· 变量说明时直接赋初值:    int a=3, b=4, c=5;    float x=3.0;· 用赋值语句赋初值:    float x, e;    x=3.5;    e=2.71828;文字常量文字常量指程序中直接给出的量。文字常量存储在程序区,而不是数据区;对它的访问不是通过数据

28、地址进行的。根据取值和表示方法的不同,可分为整型常量、实型常量、字符型常量和字符串常量。  整型常量:即整数,可以有多种表示方法。· 十进制表示法:是平时的习惯写法,例如:15 -24;· 八进制表示法:以0打头,由数字07组成。例如:    012      /八进制数12,即十进制数10    -6555    /八进制数-655,即十进制数-429· 十六进制表示法:以0X(大小写均可)打头,由数字09和字母AF(大小写均可)组成

29、,用来表示一个十六进制数。例如:    0x32A    /十六进制数32A,即十进制数810    -0x2fe0   /十六进制数-2fe0,即十进制数-12256· 其他表示法:还可以表示以 L或l结尾的长整数和以U或u结尾的无符号整数。以UL或LU(大小写均可)结尾则可表示无符号长整型常数。例如:    -84L        /十进制长整数-84    026U &#

30、160;     /八进制表示的无符号数26    0X32LU     /十六进制表示的无符号长整数32  实型常量:包含小数点和10的幂的数,有两种表示方法:· 一般形式:与平时书写形式相同,由数字0 9和小数点组成。例如:    0.23、 -125.76、 0.0、 .46、 -35.· 指数形式:即科学表示法,表示为尾数乘以10的次方形式,由尾数、E或e和阶数组成。要求在E或e前面的尾数部分必须有数字,后面的指数部分必须为整数。判断下列

31、实型常量表示是否合法:(答案:红色的不合法)123E12 、 E4 、 1.43E3.5 、 -.34e-2 ;  字符型常量:用单引号引起来的单个字符。· 保存形式:在内存中保存的是字符的ASCII码值。· 直接表示形式:对于可显示字符,通常用单引号直接引起来表示。例如:    'a'   /字符a            '4'   /字符4       

32、0;       ''   /字符               ' '   /空格字符· 转义序列表示法:对于不可显示的或无法从键盘输入的字符,如回车符、换行符、制表符、响铃、退格等;另外,还有几个具有特殊含义的字符,如反斜杠、单引号和双引号等,C+提供了一种称为“转义序列”的表示方法。例如:'a'   /响铃             'n&

33、#39;   /换行符                 ''   /字符   下表给出C+中预定义的转义序列字符及其含义。字符表示ASCII码值名 称功 能 或 用 途a0x07响铃用于输出b0x08退格(Backspace键)退回一个字符f0x0c换页用于输出n0x0a换行符用于输出r0x0d回车符用于输出t0x09水平制表符(Tab键)用于输出v0x0b纵向制表符用于制表00x00空字符用于字符串结束标志等0x5c反斜杠字符用于需要反斜杠字符的地

34、方0x27单引号字符用于需要单引号的地方0x22双引号字符用于需要双引号的地方nnn八进制表示 用八进制ASCII码表示字符xnn十六进制表示 用十六进制ASCII码表示字符说明:· 上表中最后两行是所有字符的通用表示方法,即用反斜杠加ASCII码表示。· 对于可显示字符,有三种表示方法。以字母a为例: a、141和x61· 显然,对于可见字符,第一种是最简单直观的表示方法。  字符串常量:由一对双引号引起来的若干个字符组成。例如:I am a Chinese.、 123、 a、 字符串常量与字符型常量的区别如下:· 字符串

35、常量a占两个字节,存放'a'和'0',如图左半部分,值为0x6100;· 字符型常量'a' 占一个字节,存放'a',如图右半部分,值为0x61。常变量用常量说明符const给文字常量命名所得的标识符就称为“标识符常量”。因为标识符常量的说明和引用形式很像变量,所以也称“常变量”。例如:    const float PI=3.14159;    /定义了常变量PI    const int Number_of_Student=100; /定义了常变量N

36、umber_of_Student在使用常变量时应注意以下几点:· 常变量必须也只能在说明时进行初始化。· 常变量初始化之后,不允许再被赋值。· 常变量必须先说明后使用。6、C+运算符和表达式程序中相当一部分数据处理和“语句”是通过“表达式”表达的,其中使用各种“运算符”。C+的运算符、优先级和结合性 在C+中对常量或变量进行运算或处理的符号称为“运算符”;参与运算的数称为“操作数”。 运算符的“优先级”指不同运算符在运算中的优先关系,可用序号表示,序号越小,优先级越高。比如:    加号“+”和减号“-”的优先级是6;乘号“*”和除号“/”的优

37、先级是5.“*”和“/”的优先级高于“+”和“-”符合数学运算的规律。 运算符的“结合性”决定同优先级的运算符对操作数的运算次序。从左到右运算称为“右结合”,反之,从右到左称为“左结合”。比如,+、-的结合性是从左到右(右结合),则a+b+c-d的运算次序为:    (a+b)+c)-d    /先算a+b,再加c,最后减d又如,前置+和单目负-的结合性是从右到左(左结合),则-+a的运算次序为:    -(+a)    /先做+a,再取相反数(加负号)同一优先级的运算符有相

38、同的结合性。按照要求的操作数个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符:· 单目运算符只对一个操作数运算,如负号运算符“-”等。· 双目运算符要求有两个操作数,如乘号运算符“*”等。· 三目运算符要求有三个操作数,三目运算符只有一个“?:”。运算符与操作数是相关联的,相同的运算符对不同类型的操作数所执行的运算是有差异的。基本运算符及其表达式“表达式”就是由运算符、操作数及标点符号组成的,能取得一个值的式子。本小节介绍的基本运算包括算术运算、关系运算、逻辑运算、位运算等。  1、算术运算符及其表达式· 算术运算符:

39、包括:+(加)、(减)、*(乘)、/(除)和%(求余),如下表所示。优先级运算符名称3+正,单目 -负,单目5*乘,双目 /除,双目 %取余,双目6+加,双目 -减,双目· 算术表达式:由算术运算符连接的表达式称为“算术表达式”。   例如:a+b*3 和 (a+b)/4注意:· 表达式中每个变量都有确定的值时才能进行表达式求值。· 注意数据溢出问题,应避免两个很接近的数直接相减、除数是一个很小的数、整数的连续乘运算等情况。  2、赋值运算符与赋值表达式· 赋值:将数据存放在相应存储单

40、元中称为“赋值”。如果该单元中已有值,赋值使新值取代旧值。· 引用:从某个存储单元中取出数据使用,称为“引用”。引用也是对数据的使用,但不影响单元中的值,即一个量可以多次引用。· 赋值运算符:“”,其意义是将赋值号右边的值送到左边变量所标识的单元中。左操作数称为“左值”,而右操作数称为“右值”。· 赋值表达式:由运算符连接的表达式称为格式为:<变量> = <表达式>   例如:x=5+6;· 复合赋值运算:复合赋值运算符的要求与格式和赋值运算符完全相同,表示为:     

41、<变量> <复合赋值运算符> <表达式>它等同于:<变量> = <变量> <运算符> (<表达式>);例如:x+=5; 等同与 x=x+5;注意:赋值号不是等号,它具有方向性。“左值”必须放在内存中可以访问且可以合法修改值的存储单元,通常只能是变量名;“右值”则可以是常量,也可以是变量或表达式,但一定能取得确定的值。例如:下面的赋值运算是错误的:    3.1415926=pi;   /左值不能是常数    x+y=z;  

42、0;      /左值不能是表达式    设:const int N=30;    则:N=40;      /左值不能是常变量  3、自增、自减运算· 意义:使变量当前值加1或减1,再赋给该变量。· 要求:操作数只能是变量,不能是常量或表达式· 运算: 分前置和后置两种,例如:    int i=5, j=5, m, n;    m=i+; /后置+;相当于m=i; i=i+

43、1; 结果:i的值为6,m的值为5;    n=+j; /前置+;相当于j=j+1;n=j; 结果:j的值为6,n的值为6; 4、逻辑运算、逻辑表达式和逻辑表达式的求值优化· 逻辑运算用于判断分析,运算符包括关系运算符和逻辑运算符。· 关系运算符:包括:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、=(等于)和!=(不等于),用来完成两个操作数的比较,结果为逻辑值:true(真)或false(假)。· 逻辑运算符: 包括:!(逻辑非)、&&(逻辑与)和|(逻辑或),其操作数和运算结

44、果均为逻辑量。逻辑运算符优先级和语义如下表所示。优先级运算符名称语义2!逻辑非,单目操作数的值为真,则结果为假。12&&逻辑与,双目当两个操作数全部为真是,结果为真,否则为假。13|逻辑或,双目两个操作数中有一个为真,则结果为真。· 逻辑值:在c+中,逻辑值与整数有一个对应关系:true对应1,false对应0。反过来,0对应false,非0整数对应true。所以,逻辑运算的结果可作为整数参与其他运算;整型数也可参与逻辑运算。· 关系表达式:由关系运算符连接而成的表达式,结果为逻辑值。· 逻辑表达式:由逻辑运算符连接的表达式,结果为逻辑值。关系表达

45、式是一种最简单的逻辑表达式。计算时,逻辑非优先级最高,关系运算其次,逻辑与和逻辑或最低。· 逻辑表达式的求值优化:在逻辑表达式的求值过程中,并非先将所有逻辑运算都做完再得结果,而是一旦表达式的值能够确定,就不再进行后面的运算。(演示)下面是几个实例:例1:假定a=3, b=0,c=5,d=2,x=6,y=2; 试分析下面的关系表达式::    a>b>c    /先求a>b,结果为true,即1,再将结果1与c比较,结果为假    a+b>c+d  /等同于(a+b)>(c+

46、d),结果为假    a>b&&a<c|(x>y)-!a       /相当于(a>b)&&(a<c)| (x>y)-(!a),结果为true例2:假定a=2, b=0, c=3; 则逻辑表达式 a|b+|c- 产生的结果是:    【分析】:a=2,第一个操作数为1;1与任何值相或的结果总是1(true);所以不用再计算b+和c-,则此b的值仍为0,c的值仍为3;整个表达式的值为1。例3:假定x=0, y=2, z=3; 求表达式 x&

47、amp;&(y=y*y)&&(z=z+3)的结果?【解答】  5、位运算· 位运算:c+语言提供字位运算,直接对操作数的二进制位进行操作。· 位运算符:包括:(按位取反)、<<(左移)、>>(右移)、&(按位与)、|(按位或)、(按位异或)。其中,(按位取反)为单目运算符,其余均为双目运算符。· 位运算举例:请参见演示。  6、逗号运算符与逗号表达式· 逗号运算符:C+中,逗号既是分隔符,又是运算符,且优先级最低。· 逗号表达式:用逗号连接起来的表达式,其一般

48、格式为:    <表达式1>,<表达式2>,<表达式n>· 运算规则是:从左到右依次求出各表达式的值,并将最后一个表达式的值当做整个逗号表达式的值。例如:假定a=1,b=2,c=3; 以下逗号表达式的结果是:    c=b=(a=3,4*3) /结果为:a=3,b=12,c=12,表达式的值为12    c=b=a=3,4*3  /结果为:a=3,b=3,c=3,表达式的值为12    c=(b=a=3,4*3) /结果为:a=3,b=3,c=12,

49、表达式的值为12  7、sizeof( )运算符sizeof运算符:用于计算存储一种数据类型或一个变量所需的字节数。一般格式为:    sizeof (<数据类型>) 或 sizeof(<变量名>)关于sizeof()的几点说明:· 数据类型可以是标准数据类型,也可以是用户自定义类型。· 变量必须是已定义的变量。· 括号可以省略,运算符与操作数之间用空格间隔。sizeof()应用举例:    sizeof(int);    /值为4 

50、;   sizeof( float);    /值为4    设:double x;     则:sizeof(x);    /值为87、C+语句语句是程序的基本单位,必须以分号作为结束标记。C+中的语句分为以下几种:1. 表达式语句:是最简单的语句形式,一般格式为:表达式;2. 空语句:只由一个分号构成的语句,一般格式为: ;注意:· 空语句不执行任何操作,但具有语法作用。例如:for循环在有些情况下,循环体或者循环判别条件是空语句,详细内容请参见第二章。

51、3; 从程序结构的紧凑性与合理性角度考虑,尽量不要随便使用空语句。3. 复合语句:由“”括起来的一组语句,一般格式为: 若干语句序列 注意:· 复合语句描述一个块,在语法上起一个语句的作用。· 复合语句中的每个语句以“;”结束,而整个复合语句的结束符为“”。4. 流程控制语句:用来控制或改变程序的执行方向的语句,详细内容请参见第2章。8、C+算术类型转换和赋值类型转换运算过程中,当参与运算的操作数类型不同时,可进行类型转换。包括:自动转换和强制转换。自动类型转换指在算术运算以及在赋值过程中,如果运算符两边的操作数属于“类型相容”(指类型不同但系统可以自动进行转换)的情况,如

52、整数、字符和实数之间,系统会自动进行类型转换,然后再做运算。包括:算术类型转换、赋值类型转换。一.混合运算的类型转换当运算符两边的操作数类型不同但类型相容时,系统自动将不同的数据类型转换成相同类型,再进行运算。具体规则如下:· 字符可作为整数参与运算,整数值为其ASCII码。· 对于字符或短整型操作数,系统自动变换成整型。· 对于单精度型操作数时,系统自动变换成双精度型。· 当两操作数类型不同时,将精度低(或表示范围小)的操作数的数据类型变换成与另一操作数类型相同,再进行运算。变换关系如图1.2所示。图1.2 数据类型转换规则举例说明:例如,设有变量&#

53、160;   char c1, c2;    int i1, i2;    float x1, x2;则表达式 x2=c1*i1+c1*x1+c1*c2 的求值过程为:1. 将c1转换成整型,完成c1*i1,结果为t1;2. 将c1和x1转换成双精度型,完成c1*x1,结果为t2;3. 将c1和c2均转换成整型,完成c1*c2,结果为t3;4. 将t1转换成双精度型,完成t1+t2,结果为t4;5. 将t3转换成双精度型,完成t4+t3;6. 最后结果转化为单精度型,赋给x2。二.赋值类型转换当赋值号左值和右值类型不一致但类型相容时,系统将自动

54、进行类型转换。转换规则如下:· 实型数赋给整型变量时,仅取整数部分;若该部分超出整型变量取值范围,结果将溢出。· 整数赋给实型变量时,将整数转换成实数再赋值。· 字符数据赋给整型变量时,将字符转换为整型。转换分两种情况:· 对无符号字符数据,低位字节不变,高位字节补0;· 对有符号字符数据,若符号位为0,与无符号字符数据转换规则相同,若符号位为1,则低位字节不变,高位字节全部置1。· 绝对值较大的数赋给表达范围较小的数据时,注意溢出举例说明:例如:设有变量    signed char c1=250; 

55、  short int a;a=c1;【分析】:c1的值为11111010,转换成11111111 11111010赋给a,正是- 6的补码。所以,a的值为- 6。三.强制类型转换如果需要人为地将一种类型转换为另一种类型,必须使用C+提供的强制类型转换运算符。一般格式为:    (<type>) <表达式> 或: <type> (<表达式>)注意:对整个表达式作强制类型转换。举例说明:设有变量说明:int a=7, b=5; float x; 求表达式 x=a/b 的值。【分析】:因为a和b都是整数,该除法

56、将执行整除运算,再将整数结果1转换为单精度类型后进行赋值。所以,结果 x=1【转换】:将两个操作数或其中一个操作数进行强制类型转换。可表示为:    x=(float)a/(float)b或x=(float)a/b表达式将求出这两个整数相除的实数商1.4,并赋给x。关于强制类型转换需要注意的几点:· 上述(float)a/b与float(a/b)结果是不同的,后者是先进行整除运算,将结果(整数1)强制转换为单精度型数1.0,所以结果为 x=1.0。· 强制类型转换不改变表达式本身的值类型,而是产生一个临时变量,用来暂存转换后的值,该临时变量引用后即自动释

57、放。如上例,执行强制类型转换后变量a和b的值及类型都不变,而是各自产生一个临时变量,用这两个临时变量的值进行运算。· 强制类型转换符优先级较高,只对紧随其后的表达式起作用,而对其他部分不起作用。9、C+求值次序与副作用编译器在求解表达式时,首先要对表达式进行解析。在符合优先级和结合性的前提下,不同编译器在解析时可能存在差异,使得求值次序不同,将导致结果不同。例如,设有int a=2, b=5, c; 对表达式 c=a*b+(+a)+(b=10) 三个同级运算中,是先算a*b,还是+a,还是b=10,其次再算哪个?C语言的标准对表达式中各操作数的求值次序没有做统一规定。对于VC+,是按

58、照从前向后的顺序进行,则上述表达式的结果是23;而对有的C+编译器,则是从后向前进行,结果是43。如果某个操作数经历了求值运算,那么这个求值过程可能影响到其他操作数的值,这时就会产生出乎意料的结果,称为“副作用”(Side effect)。上例中,求表达式b=10改变了变量b的值,而求+a则改变了a的值,这些都将影响到表达式a*b的值,这就是所谓的副作用。由于编译器有求值次序,因此对于复合表达式,交换律不一定成立。求值次序带来副作用的主要原因是使用复合表达式,如果将复合表达式分开写成若干个简单表达式,就可以有效消除副作用。例如,可将上式按照从前向后的次序写成:    c=a

59、*b;+a;b=10;c=c+a+b;或按照从后向前的次序写成:    +a; b=10;c=a*b+a+b;10、C+数组与字符数组C+数组“数组”是有限个同类型元素的有序集合,这些元素有一个共同的名字,即“数组名”。每个元素以其在数组中的位置区分,位置用“下标”表示。例如:数列或向量就可以看作一个数组,其中的元素用一个下标即可确定;矩阵也可看作一个数组,其中的元素需要用“行”、“列”两个下标确定。数组下标的个数称“维数”,代表数列的数组和代表矩阵的数组分别称为一维数组和二维数组。  1、一维数组的定义定义一个一维数组的一般格式为:  

60、60; 存储类型 <数据类型> <数组名> <常量>;其中:· 数据类型指数组中元素的数据类型,可以是C+中定义的任何一种数据类型。· 常量写在中括号中,用来定义数组大小,即数组中元素的个数。举例:    int m5;    /定义整型数组m, 其中有5个整数    const int N=3;    float xN; /定义浮点型数组x,其中有3个实数注意:数组大小不能用变量定义,而只能是一个正整数常量。在C+中,数组大小在编译时确定

61、。编译系统根据数组的定义为其分配一段连续的存储单元,且一经分配不能改变。因此,数组大小不能用变量定义,而只能是一个正整数常量。例如,下列定义是非法的:    int count;    float scount;   /数组大小不能是变量;    const float Num=3;    int nNum;       /数组个数不能是实数  2、数组的初始化· 一般方法:在定义时用大括号列出元素的值,例

62、如:int score5=88, 92, 90, 85, 78;· 初始化值少于元素个数的用法:初始化值的个数少于定义的元素个数时,从第0个元素开始逐个取得初始化值,其余的元素初始化为0。例如:    float y5=3.4,4.2,7;/5个元素的取值分别为3.4,4.2,7,0,0· 缺省维数的用法:初始化时可以不指明元素个数,编译器会按照初始化值的个数确定数组大小。例如:    int n=1, 2, 3, 4; /数组n有4个元素    int nn; /非法定义,不是初始化时定义数组必须指明数组元素个数

63、  3、数组的使用· 数组的存储形式:数组在存储单元中是按下标的顺序连续存放的。例如,上面定义的数组m的存储如下图所示:· 访问方式:数组中任何一个元素都可以单独访问,访问的一般格式为:    数组名表达式其中,“表达式”用来计算下标值。C+中规定数组第一个元素的下标为0。注意:对数组的访问指的是对数组元素的访问,一般不能直接将数组名作为访问对象,对数组赋值也必须对每一个元素逐个赋值。字符数组如果数组中的元素为字符,就称为“字符数组”。例如:    char string110;   

64、 /可用来保存10个字符的字符数组    char city_name1='N','a','n','j','i','n','g' /7个字符的字符数组C+中字符数组可用来处理字符串,允许直接用字符串常量对字符数组初始化。此时,系统会自动加上一个串结束符0。例如:    char city_name2=”Nanjing”;则字符数组city_name2实际占用的内存比city_name1多一个字节。串结束符0在字符串操作中具有十分重要的意义,因此

65、,在定义字符数组大小时,应注意留出保存串结束符的空间。除了可以用字符串常量初始化外,字符数组的用法与一般数组是一样的。另外,C+中提供若干字符串处理函数,在头文件<cstring>中定义。其中包括strlen、strcpy等。· strlen(s) 返回字符串s的实际长度(不包括0)。· strcpy(s1,s2) 将字符串s2中0之前的所有字符依次赋值到字符串s1中,最后再加上一个0。由于不能直接对字符数组名赋值,所以将一个字符串的值赋给另一个字符串必须用字符串复制函数完成。例如:    char string220;  

66、0; string2=”VC+”;/非法    strcpy(string2, “VC+”); /合法11、C+输入输出程序执行期间,从外设接收信息的操作称为“输入”,向外设发送信息的操作称为“输出”。本节介绍从键盘向程序中的变量输入数据以及将程序计算的结果输出到显示器上的基本操作。C+输入输出简介C+中没有专门的输入输出语句,而是通过系统提供的输入输出流类来实现。· cin用来在程序执行期间给变量输入数据,一般格式为:    cin>> <变量名1>>> <变量名2> >

67、;>>> <变量名n>其中:>> 称为“提取运算符”,程序执行到这条语句便暂停下来,等待从键盘上输入相应数据,直到所列出的所有变量均获得值后,程序方继续执行。· cout实现将数据输出到显示器的操作,一般格式为:    cout<< <表达式1> << <表达式2> <<<< <表达式n>其中:<<  称为“插入运算符”,将紧跟其后的表达式的值输出到显示器上当前光标位置。cin和cout的书写形式很灵活,如果有多个变量,即使类型不相同,也可以写在同一个语句中或者分成若干个语句输入或输出。注意,使用cin和cout必须在程序开头增加一行:    # include

温馨提示

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

评论

0/150

提交评论