版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C++语言程序设计第一章概述本课程的配套教材为:龚尚福,贾澎涛主编.《C/C++语言程序设计》西安电子科技大学出版社2012本课程的学时安排为:理论学时48实践学时32学习目标Hi~,Mr.computer.I’mhumanbeing~.
计算机语言是人与计算机交流的工具。所以要学好C语言,就是要做到让人与计算机相互理解对方。怎样成为一名优秀的程序员热情,热情,还是热情具备独立设计的能力运用计算机语言的能力具备创造力(从模仿他人开始,但不能养成惰性,要学会独立思考,独立解决问题)严谨踏实的作风(编程序最耗费时间的地方是调试与查错,严谨可以确保我们少犯错误,犯了错误容易改正)具体步骤Step1:掌握数据类型、控制结构、语法规则。(识字、造句,授课为主)
Step2:掌握程序分析、算法、编程。(体裁、布局。多看多练)
Step3:循序渐进,先模仿,后分析。
Step4:重视上机,有效利用宝贵的上机时间,切实掌握调试手段。第一章概述1.1计算机语言及其发展1.2算法与流程1.3程序设计方法1.4C/C++的特点1.5C与C++程序实例1.6C/C++程序上机步骤1.7小结1.1计算机语言及其发展算法为解决某一应用问题而采用的解题步骤。对一个一元二次方程,若求其实数解,算法应为:计算方程的判别式;如判别式小于零,则输出方程没有实根的信息;否则,计算方程的实根,并输出计算结果。计算机能理解上述自然语言描述的算法么?计算机语言的发展经历了三个阶段:机器语言机器指令(由0和1组成),可直接执行难学、难记依赖机器的类型汇编语言用助记符代替机器指令,用变量代替各类地址。克服记忆的难点其他与机器语言类似高级语言类似数学语言、接近自然语言、具有通用性和可移植性,不依赖具体的计算机类型。00100011111011010110000101110110机器语言程序MOVAX,
300HADDBX,AXMOV[2100H],BX
HLT汇编语言源程序main(){inta,b,c;a=300;b=18;c=a+b;printf(“a+b=%d\n”,c);}高级语言源程序(C)1.2算法与流程程序设计的灵魂是算法,而语言只是形式。可以说计算机语言只是一种工具,用来描述处理问题的方法和步骤。但是只要有正确的算法,可以利用任何一种语言编写程序,使计算机进行工作,得出正确的结果。所谓“算法”,指为解决一个问题而采取的方法和步骤,或者说是解题步骤的精确描述。算法应具备有穷性、确定性、有效性、有零个或多个输入(即:可以没有输入,也可以有输入)、有一个或多个输出(即算法必须得到结果)的特性。1.2.1算法的概念1.2.2算法的表示形式常用的算法表示方法有自然语言、传统流程图、结构化流程图(N-S流程图)、伪代码、计算机语言等。(1)传统流程图常用的流程图符号【例1.1】求5!①
算法分析:实际上是在做1×2×3×4×5的运算。②
算法步骤可以分为:步骤1:设变量p,被乘数,p=1;步骤2:设变量i,代表乘数,i=2;步骤3:使p×i,乘积放在被乘数变量p中,可表示为:p×i⇒p;步骤4:使i的值加1,即i+1⇒i;步骤5:如果i不大于5,返回重新执行步骤3以及其后的步骤4、步骤5;否则,算法结束。最后得到的p就是5!的值。③
绘制流程图开始p=1i=2p×i⇒pi+1⇒i结束i>5真假(2)N-S流程图基本结构的顺序组合可以表示任何复杂的算法结构,于是基本结构之间的流程线就属于多余的了,于是美国学者I.Nasii和B.shneiderman于1973年提出了一种新的流程图形式:将全部算法写在一个矩形框内,完全去掉了带箭头的流程线。这种流程图称为N-S结构化流程图,也称盒图。例1.2求5!的算法用N-S图表示N-S图不能表示非结构化算法,而且当问题很复杂时,N-S图可能很大。1.3程序设计方法结构化程序设计方法(SP—StructuredProgramming)是由E.Dijkstra等人于1972年提出来的,它建立在Bohm、Jacopini证明的结构定理的基础上。结构定理指出:任何程序逻辑都可以用顺序、选择和循环三种基本结构来表示。在结构定理的基础上,Dijkstra主张避免使用goto语句(goto语句会破坏这三种结构形式),而仅仅用上述三种基本结构反复嵌套来构造程序。在这一思想指导下,进行程序设计时,可以用所谓“自顶向下,逐步求精”的方式,对问题进行分解。
1.3.1结构化的程序设计方法
一个结构化程序应符合以下标准:(1)程序仅由顺序结构、分支结构和循环结构三种基本结构组成,基本结构可以嵌套。(2)每种基本结构都只有一个入口和一个出口,即一端进,一端出。这样的结构置于其他结构之间时,程序的执行顺序必然是从前一结构的出口到本结构的入口,经本结构内部的操作,到达本结构的唯一出口,体现出流水化特点。(3)程序中没有死循环(不能结束的循环)和死语句(程序中永远执行不到的语句)。
AB(a)PPA(b)(c)成立不成立成立不成立AB结构化程序设计方法遵循的原则自顶向下,逐步求精。模块化设计。程序结构化。结构化程序设计过程
分析问题(Question)设计算法(Algorithm)编写程序(Program)简称QAP方法。1.3.2面向对象的程序设计方法在结构化的程序设计中,解决某一个问题,就是要确定这个问题能够分解为哪些函数,数据能够分解为哪些基本的类型,如int、double等。也就是说,思考方式是面向机器结构的,而不是面向问题结构的,需要在问题结构和机器结构之间建立联系。面向对象的程序设计方法的思考方式是面向问题的结构,它认为现实世界是由一个个对象组成的。面向对象的程序设计方法解决某个问题时,要确定这个问题是由哪些对象组成的。对象由数据和操作构成消息由三个部分组成:①接受消息的对象;②要执行的函数的名字;③函数需要的参数。面向对象的主要特性:①封装②继承③多态对象数据操作面向对象程序设计过程(1)面向对象的分析(OOA)。(2)面向对象的设计(OOD)。(3)面向对象的实现(OOI)。结构化程序设计与面向对象程序设计的比较ProgramFunctionFunctionFunctionProgramOperationsDataOperationsData1.4C/C++的特点1.C语言的特点语言结构化语言简洁功能强大数据结构丰富运算符丰富生成的代码质量高可移植性好2.C++的特点与C语言兼容,既支持面向对象的程序设计,也支持结构化的程序设计。修补了C语言中的一些漏洞,提供更好的类型检查和编译时的分析功能。生成目标程序质量高,程序执行效率高。提供了异常处理机制,简化了程序的出错处理。函数可以重载及可以使用缺省参数。提供了模板机制。1.5C与C++程序实例例1.3简单的C语言程序。#include<stdio.h>/*预处理命令*/main()/*主函数*/{printf("MyfirstCprogram!\n");/*输出双引号中的内容*/}1.5.1C语言程序实例【例1.4】求两个整数之和#include<stdio.h>main()/*主函数*/{ inta,b,sum;/*设置变量的数据类型*/ a=1;/*给变量赋初值*/ b=2; sum=a+b;/*加法运算*/ printf("sum=%d\n",sum);}重点C程序的基本结构是函数,函数是完成某个整体功能的最小单位。C函数从左花括号开始,到对应的右花括号结束。main()可以在程序的任何位置上,但C程序执行时,总是从main()函数开始。1.5.2C++程序实例例1.5简单的C++程序。#include<iostream.h>voidmain(){ cout<<"Hello!MyfirstC++program!\n";}例题解析1.一个C程序由若干个C函数组成.各个函数在文件中的书写位置为——。
A)任意
B)第一个函数必须是主函数.其他函数任意
C)必需完全按调用的顺序排列
D)其他函数必须在前,主函数必须在最后
你能回答下面问题吗?2.在一个C程序中——。
A)main函数必须出现在所有函数之前
B)main函数必须出现在所有函数之后
C)main函数可以在任何地方出现
D)main函数必须出现在固定位置上3.以下叙述中正确的是——。
A)C程序中注释部分可以处现在程序中任何合适的地方
B)花括号“{”和“}”只能作为函数体的定界符
C)构成C程序的基本单位是函数,所有函数名都可以由用户命名
D)分号是C语句之间的分隔符,不是语句的一部分4.以下叙述中正确的是——。
A)C语言的源程序不必通过编译就可以直接运行
B)C语言中的函数不可以进行单独编译
C)C源程序经编译形成的二进制代码可以直接运行
D)C语言中的每条可执行语句最终都将被转换成二进制的机器指令5.以下说法中正确的是——。
A)C语言程序总是从第一个定义的函数开始执行
B)C语言程序总是从main()函数开始执行
C)C语言程序中的main()函数必须放在程序的开始部分
D)一个C函数中只允许一对花括号1.6C/C++程序上机步骤一般情况下,开发一个C或C++应用程序可以按照如下步骤来进行:创建一个项目;编辑项目中的源代码;编译项目中的文件;纠正编译中出现的错误;运行可执行的文件。1.6.1MicrosoftVisualC++6.0集成环境简介VisualC++6.0提供了一个支持可视化编程的集成开发环境:VisualStudio(又名DeveloperStudio)。DeveloperStudio是一个通用的应用程序集成开发环境,它不仅支持VisualC++,还支持VisualBasic,VisualJ++,VisualInterDev等Microsoft系列开发工具。DeveloperStudio采用标准的多窗口Windows用户界面,包含项目工作区、ClassWizard、AppWizard、WizardBar、ComponentGallery等。DeveloperStudio提供了许多工具,包含一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用DeveloperStudio,可以完成创建、调试、修改应用程序等各种操作。1.6.2C程序上机步骤(1)启动VisualC++6.0进入DeveloperStudio编译环境(2)单击主窗口菜单栏中的“File”(文件)菜单项,单击下拉式菜单中的选项“New”(新建),弹出新建对话框。(3)在“New”(新建)对话框上选择“Projects”(工程)选项卡,选择“Win32ConsoleApplication”(Win32控制台应用程序)(4)在“ProjectName”(工程名称)文本框内输入工程名称为exam1。工程文件存放的位置可点击按钮
,选择路径,点击确定按钮。(5)在弹出的对话框(如下图所示)中,选择一个建立一个空项目的单选按钮,再点击“Finish”(完成)按钮。(6)在弹出的对话框中,给出了新建工程的一些信息,点击“OK”(确定)按钮。(7)再单击“File”菜单中的“New”命令,选择“Files”选项卡,选择“TextFile”,注意“Addtoproject”应勾选。(8)在“File”文本框内输入文件名称“1.c”,点击“OK”按钮。(9)逐行输入源程序直至完毕,如下图所示。然后点击“File”菜单的“Save”(保存)命令。#include"stdio.h"main(){ printf("MyfirstCprogram!\n");}(10)单击工具栏上的红色叹号或按“Ctrl+F5”执行程序,出现如图所示对话框,此时显示程序运行结果。1.5.2C++程序上机步骤(1)按照C程序上机步骤(1)~(6)操作,建立一个工程exam2,再单击“File”菜单中的“New”命令,选择“Files”选项卡,选择“C++SourceFile”,如下图所示。注意“Addtoproject”应勾选。(2)在“File”文本框内输入文件名称“1”,点击“OK”按钮。(3)逐行输入源程序直至完毕。然后点击“File”菜单的“Save”(保存)命令。#include<iostream.h>voidmain(){ cout<<"Hello!\n"; cout<<"WelcometoC++!\n";}(4)单击工具栏上的红色叹号或按“Ctrl+F5”执行程序,出现下图所示对话框,此时显示程序运行结果。1.7小结本章介绍了计算机语言的基本概念;计算机程序设计的特点及其一般方法;C/C++语言的发展及其特点;通过示例使读者建立C/C++语言程序结构的概念。最后,对MicrosoftVisualC++6.0集成环境及C/C++程序上机步骤作了简单介绍。C/C++语言程序设计第二章数据类型和表达式龚尚福,贾澎涛主编《C/C++语言程序设计》西安电子科技大学出版社第2章数据类型和表达式2.1词法构成2.2数据类型2.3常量与变量2.4指针类型2.5运算符和表达式2.6小结第2章数据类型和表达式2.1词法构成字符集标识符关键字注释符字符集C语言的字符集是ASCII字符集的一个子集,由字母,数字,标点符号和特殊字符构成。(1)英文字母:a~z,A~Z(2)数字:0~9(3)空白符:空格符,制表符,换行符等统称为空白符。(4)特殊字符:①标点符号②转义字符字符集表2.1常用转义字符表名称符号名称符号空字符(null)\0换行(newline)\n换页(formfeed)\f回车(carriagereturn)\r退格(backspace)\b响铃(bell)\a水平制表(horizontaltab)\t垂直制表(verticaltab)\v反斜线(backslash)\\问号(questionmark)\?单引号(singlequotationmarks)\'双引号(doublequotationmarks)\”1到3位8进制数所代表的字符\ddd1到2位16进制数所代表的字符\xhh标识符C语言规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且第一个字符必须是字母或下划线。注意(1)C语言中标识符严格区分大小写
(2)ANSIC标准规定标识符的长度可达31个字符
(3)标识符命名应“见名知义”; (4)变量名都要“先定义,后使用”。关键字ANSIC定义的关键字共32个,根据关键字的作用,可将其分为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类MicrosoftC在ANSIC基础上扩展的关键字有(19个)注释符C语言的注释符是以“/*”开头,并以“*/”结尾,其间的内容为注释,一般出现在程序语句行之后,用来帮助阅读程序。数据类型基本类型构造类型指针类型(
)空类型(void)字符型(char)枚举类型(enum)数组类型([])结构体类型(struct)共用体类型(union)整型实型单精度型(float)双精度型(double)2.2数据类型基本整型长整型短整型无符号整型整数类型 整型数就是通常使用的整数,分为带符号整数和无符号整数两大类。 1.基本类型定义
类型说明符:int例如,inta,b,c; 说明变量a,b,c被同时定义为基本整型数据类型。整数类型 2.整型数据的存储与取值范围表2.2VisualC++6.0环境中整型数据属性表数据类型占用字节数二进制位长度值域int432-2147483648~2147483647short[int]216-32768~32767long[int]432-2147483648~2147483647[signed]int216同int[signed]short[int]216同short[signed]long[int]432同longunsigned[int]2160~65535unsignedshort[int]216同unsignedintunsignedlong[int]4320~4294967295整数类型3.整型数据的表示形式十进制整数:254,-127,0都是正确的,而0291(不能有前导0)、23D(含有非十进制数码)都是非法的;八进制整数:021,-017都是正确的,它们分别代表十进制整数17,-15,而256(无前缀0)、03A2(包含了非八进制数码)是非法的;十六进制整数:0x12,-0x1F都是正确的,它们分别代表十进制整数18,31,而5A(无前缀0x)、0x3H(含有非十六进制数码)是非法的。实数类型
1.基本类型定义类型说明符:float(单精度型),double(双精度型),longdouble(长双精度型) 2.实数存储与取值范围 在计算机中,实数是以浮点数形式存储的,所以通常将单精度实数称为浮点数。例如单精度实型数据在计算机中的存放形式见图2.1所示。其中,小数部分一般都采用规格化的数据形式。
图2.1单精度实型数据在计算机中的存放形式1位7位1位23位阶符阶码数符尾数指数部分小数部分实数类型表2.3MicroSoftC中实型数据属性表数据类型比特数(字节数)有效数字数的范围float32(4)6~7|-3.4E-38~3.4E+38|double64(8)15~16|-1.7E-308~1.7E+308|longdouble64(8)18~19|-1.7E-308~1.7E+308|实数类型 3.浮点数的表示形式 在C语言中,实数表示只采用十进制。它有二种形式:十进制数形式和指数形式。(1)十进制数形式。由整数、小数部分和小数点组成,整数和小数都是十进制形式。例如,0.123,-125.46,.78,80.0等都是合法形式。(2)指数形式。由尾数、指数符号e或E和指数组成,尾数是小数点左边有且只有一位非零数字的实数。e或E前面必须有数字,e或E后面必须是整数。指数形式用于表示较大或者较小的实数。字符类型 1.基本类型定义
类型说明符:char 2.字符型数据存储与取值范围 字符型数据的取值范围:ASCII码字符集中的可打印字符。字符数据存储占1个字节,存储时实际上存储的是对应字符的ASCII码值(即一个整数值)。字符类型 3.字符型数据的表示方法字符型数据在计算机中存储的是字符的ASCII码值的二进制形式,一个字符的存储占用一个字节。因为ASCII码形式上就是0到255之间的整数,因此C语言中字符型数据和整型数据可以通用。字符类型字符数据:指用单引号括起来的单个字符数据,如'A','%',':','9'等。而'12'或'abc'是不合法的字符数据。字符串数据:指用双引号括起来的单个或一串字符数据,如"good"、"0132"、"w1"、"a"等。注意"a"是字符串数据而不是字符数据。 为了便于C程序判断字符串是否结束,系统对每个字符串数据存储时都在末尾添加一个结束标志——即ASCII码值为0的空操作符'\0',它既不引起任何动作也不会显示输出,所以存储一个字符串的字节数应该是字符串的长度加1。字符类型例如"hello"在计算机中表示形式如图2.3所示:'h''e''l''l''o''\0'1041011081081110图2.3"hello"在计算机中的存储示意图2.3常量与变量2.3.1常量常量程序运行过程中不能被改变的量。整数在计算机中是准确表示的,可以用十进制、八进制和十六进制数表示。当用八进制数表示时,第一位数字前面必须加0;当用十六进制数表示时,第一位数字前而必须加0x:无符号整数的末尾必须加字母u或U;长整数的末尾必须加字母I或L。字符型常数是用单引号括住的单个字符。用转义字符表示不可显示字符。转义字符以“\”开头,后跟一个特定的字母或八进制数或十六进制数表示的ASCII代码值。2.3常量与变量符号常数是用标识符表示的常数,它具有变量的外表和常量的内涵。用#define定义的符号常数没有类型和值的含义。在预编译时由编译系统将宏名用宏体替换。define是编译预处理命令,不属于C语言关键字。用const定义的符号常数既有值又有类型的含义。该定义是在编译阶段完成的。2.3.2变量1.变量的有关概念在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为变量名。变量必须“先定义后使用”系统为变量分配存储单元,存储变量的值。编写程序时通过变量名来存、取变量值。x98变量值为变量分配的存储单元变量名例如:有变量x它的值是982.变量定义变量定义的一般格式:例如:inti,j;
longk,m;
floatx,y;
charch1,ch2;必须使用合法的标识符作变量名不能使用关键字为变量命名分号是语句的组成部分C语言的变量名和它的类型无关;在函数或复合语句中必须把要定义的变量全部定义,即不允许在后面的执行语句中插入变量的定义。
【类型修饰符】数据类型变量表;5.变量的初始化允许在说明变量的时候对变量赋初值。例如:inta=5,b=10+2;
doublex=23.568,y;
charch1='a',ch2=66,ch3='\142';表示定义变量并对变量存储单元赋值。错误的初始化:inta=3+b,b=5;floatm=n=23.16;5.变量的初始化(1)注意变量在赋值或运算时,其值要在该数据类型的值域内,否则会产生数据溢出。(2)由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。(3)字符型数据与整型数据可通用,增加了程序设计的自由度,例如对字符作多种转换就比较方便。但也需注意,字符型数据与整型数据的通用是有条件的,即在0~255的范围之内才可以通用。5.变量的初始化【例2.1】整型数据的溢出。
#include"stdio.h" voidmain() {
shortinta,b; a=32767; b=a+1; printf("a:%d,b:%d",a,b); }
运行结果为: a:32767,b:-327685.变量的初始化【例2.2】实型数据的舍入误差。
#include"stdio.h" voidmain() {floata,b,c,d; a=12345.6789e3; b=12345.6784e3; c=a+10;/*理论值应是12345688.900000*/ d=b+10;/*理论值应是12345688.400000*/ printf("c=%f\n",c);
/*实型变量只能保证的有效数字是7位有效数字,运行结果是理论结果四舍五入得到的*/
printf("d=%f\n",d);
}
运行结果 c=12345689.000000 d=12345688.0000005.变量的初始化【例2.3】计算字符'B'与整型数据20的和。
#include"stdio.h" voidmain() {chara;/*说明a为字符型变量*/ intb;/*说明b为整型变量*/ a='B';/*为a赋字符常量'B'*/ b=a+20;/*计算66+20并赋值给字符变量b*/ printf("%c,%d,%c,%d\n",a,a,b,b);/*分别以字符型和整型两种格式输出a、b*/} 程序运行的输出结果如下: B,66,V,862.4指针和指针变量main(){floatx;inty;
…}2.4.1指针和指针变量的概念变量的两个物理意义200020012002200320042005…xy变量的内容变量的地址2.4.1指针和指针变量的概念
voidmain(){inta,b,c;a=5;b=3;c=a
+b;
…}200020012002200320042005abc5直接将整数
5
存入变量a3直接将整数
3
存入变量b8
直接将变量a、b
的值取出,相加后存入变量
c利用变量名存取数据的方式称为“直接存取”方式。2.4.1指针和指针变量的概念
C语言还提供了对内存单元的“间接存取”方式p20002001200220032004200520062007abc532004a和b相加的结果(*p=a+b)存放到变量p所指向的内存单元中去。此时c称为指针变量p的目标变量。P2004cp=&c8voidmain(){inta=5,b=3,c,*p;
p=&c;*p=a+b;
…}●变量的地址称为变量的指针●存放地址的变量称为指针变量2.4.2指针变量的定义
voidmain(){inta,*p=&a;floatx,*q=&x;
…}2000200120022003200420052006200720082009apxq20042000
void
main(){inta,*p;floatx,*q;
p=&a;q=&x;
…}指针变量定义的形式指针变量初始化2.4.2指针变量的定义 指针变量的引用 关于对指针变量的引用,通过上述已经出现的两个相关的运算符进行说明。 (1)*:称为指针运算符或称为“间接访问内存地址”运算符;在定义时,通过它标明某个变量被定义为指针变量,而在使用时,*p则表示p所指向变量的内容。 (2)&:称为取地址运算符,通过它获得目标变量所在存储单元的地址。2.5运算符和表达式主要内容:算术运算符和算术表达式赋值运算符和赋值表达式关系运算符和关系表达式逻辑运算符和逻辑表达式位运算符和位运算表达式条件运算符和条件表达式逗号运算符和逗号表达式其他运算符及其运算运算符的有关概念作用:对运算对象完成规定的操作运算类型:按运算对象分:单目、双目、三目按功能分:算术、赋值、关系、逻辑条件、逗号、位、其他运算符的优先级和结合性优先级指各种运算符号的运算优先顺序例如:算术运算优先于关系运算算术运算中先*/后+-结合性指运算符号和运算对象的结合方向分为:从左向右(左结合)和从右向左(右结合)例如:算术运算符为左结合a-b+4赋值运算符为右结合a=b=5运算符的优先级和结合性表2.6
运算符优先级和结合性优先级运算符名称操作数个数结合规则1()[]->﹒圆括号运算符数组下标运算符指向结构指针成员运算符取结构成员运算符->(从左至右)2!~++---(类型)*&sizeof逻辑非运算符按位取反运算符自增运算符自减运算符负号运算符强制类型转换运算符取地址的内容(指针运算)取地址运算符求字节数运算符1(单目运算符)<-(从右至左)运算符的优先级和结合性优先级运算符名称操作数个数结合规则3*/%乘法运算符除法运算符求余运算符2(双目运算符)->4+-加法运算符减法运算符2(双目运算符)->5<<>>左移运算符右移运算符2(双目运算符)->6<<=>>=小于运算符小于等于运算符大于运算符大于等于运算符2(双目运算符)->7==!=等于运算符不等于运算符2(双目运算符)->运算符的优先级和结合性优先级运算符名称操作数个数结合规则8&按位“与”运算符2(双目运算符)->9^按位“异或”运算符2(双目运算符)->10|按位“或”运算符2(双目运算符)->11&&逻辑与运算符2(双目运算符)->12||逻辑或运算符2(双目运算符)->13?:条件运算符3(三目运算符)<-优先级运算符名称操作数个数结合规则14=+=-=*=/=%=>>=<<=&=^=|=赋值运算符2(双目运算符)<-15,逗号运算符(顺序求值运算符)->运算符的优先级和结合性表达式的有关概念什么是表达式表达式由运算符和操作数组成,操作数是运算符的操作对象,可以是常量、变量、函数和表达式。表达式的书写C语言的表达式采用线性形式书写。数学表达式应该写成1/6-i+j*j*j*j*j*j。C语言的表达式只能使用C语言中合法的运算符和操作数2πr应该写成2*3.14159*r例如:表达式:150+'b'*2-12.456b=(++a)-2a/=a*=(a=2)f=a>b>c--a||++b&&c++max=a>b?a:ba=3,a+=3,a*a 1/(float)a+6算术运算算术运算符的优先级
()+-++--
*/%
+-
同级同级同级
单目双目
高
低算术运算没有乘方运算符,要计算a3要写作a*a*a的连乘,或用标准库函数pow(a,3)“/”的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据“%”要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同。自增自减运算++--是单目运算符有前缀和后缀两种形式前缀形式:先自增(自减)再引用;后缀形式:先引用再自增(自减);功能:前缀形式++a等价于a=a+1
--
a
等价于a=a–
1后缀形式a++等价于a=a+1
a--
等价于a=a–
1例如:当a=5时⑴++a表达式的值为6,且
a=6⑵
a++表达式的值为5,且a=6⑶b=++a
等价于a=a+1;b=a表达式的值为6,且a=6,b=6⑷b=a++等价于b=a;a=a+1表达式的值为5,且a=6,b=5
说明:自增、自减运算符只能用于整型变量,而不能用于常量或表达式。例如:5++、(a+2)++不合法。具有右结合性,结合方向为从右到左。例如:
–a++
等价于-(a++)
C语言的表达式中“++”,“--”运算符,如果使用不当,很容易导致错误。例如:设i=3,表达式k=(++i)+(++i)+(++i)”不同的C编译系统结合方式不一样,所以不同的编译系统中,针对上述表达式得出的答案并不一定同编程者的原意相同。说明:
【例2.6】自增自减运算的应用。
#include“stdio.h” voidmain() {inti,j; i=j=5; printf(“i++=%d,j--=%d\n”,i++,j--); printf(“++i=%d,--j=%d\n”,++i,--j); printf(“i++=%d,j--=%d\n”,i++,j--); printf(“++i=%d,--j=%d\n”,++i,--j); printf(“i=%d,j=%d\n”,i,j);
}运行结果:i++=5,j--=5++i=7,--j=3i++=7,j--=3++i=9,--j=1i=9,j=1关系运算关系运算符(左结合)
>>=<<=
==!=较高较低关系表达式用关系运算符将运算对象连接成的式子例如:12<'C'+1(字符型数据比较ASCII值)a==b>=c等价于a==(b>=c)与(a==b)>=c不等价关系运算符优先于赋值,低于算术说明:关系运算的结果应该是逻辑值。C语言用数值用1表示逻辑真,0表示逻辑假例如:7>5的值是1,5>7的值是0
'a'>'b'的值是0,'a'<'b'的值是1即关系表达式的值:0或1实型数可进行大于或小于比较,但通常不进行==或!=的关系运算逻辑运算符逻辑运算符&&||!逻辑运算符的运算规则运算对象逻辑运算结果aba&&ba||b!a非0非0110非000100非001100001逻辑表达式逻辑表达式用逻辑运算符将运算对象连接成的式子例如:0&&'b'a&&b||c&&da||b-5||c/4!x+y>=z逻辑运算符的优先级和结合性:!是单目运算符,右结合,高于算术&&和||是双目运算符,左结合,高于赋值运算符,低于关系运算符逻辑运算规则从左到右依次进行逻辑计算运算对象为非0表示逻辑真运算对象为0表示逻辑假逻辑运算的结果为0或1例如设:a=15,b=0,c=-2
a&&b&&c结果为0a||b||c结果为1(a+c)||b&&c结果为1逻辑运算规则(续)运算按照从左至右的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算——逻辑运算的短路性质例如设:a=1,b=0,c=-2a&&b&&c(a++)||++b&&--c为0,运算终止,表达式值为0为非0,运算终止,表达式值为1且a为2,b为0,c为-2(b,c保持原值)关系与逻辑运算符的应用表示数学公式a>b>c判断a,b,c三条线段能否组成一个三角形
a,b不同时为负
a+b>c&&a+c>b&&b+c>aa>=0||b>=0!(a<0&&b<0)(a<0&&b>=0)||(a>=0&&b<0)||(a>=0&&b>=0)a>b&&b>c条件表达式运算条件运算符:?:条件表达式的一般形式表达式1?表达式2:表达式3例如:m<n?x:a+3a++>=10&&b-->20?a:bx=3+a>5?100:200C语言中唯一的三目运算符,要正确区分用?和:分隔的表达式涉及条件运算符的优先级与结合性条件运算符优先级条件运算符优先级高于赋值、逗号运算符,低于其他运算符例如:⑴m<n?x:a+3⑵a++>=10&&b-->20?a:b⑶x=3+a>5?100:200等价于:(m<n)?(x):(a+3)等价于:(a++>=10&&b-->20)
?a:b等价于:x=
((3+a>5)
?100:200)条件运算符的结合性
条件运算符具有右结合性当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。例如:w<x?x+w:x<y?x:y
与w<x?x+w:(x<y?x:y)等价
与(w<x?x+w:x<y)?x:y不等价条件运算符的结合性
【例2.7】条件表达式的应用——判断整数的正负
#include"stdio.h" voidmain() {intx; scanf("%d",&x); x>0?printf("%s","Positive"):printf("%s","Negative"); }逗号表达式运算逗号表达式的一般形式
表达式1,表达式2,……,表达式n逗号表达式的值从左向右,依次对表达式求值,最后得到表达式n的值就是逗号表达式的值例如:⑴a=5,
a++,
a*3
表达式值为18,且a=6⑵t=1,t+5,t++表达式值为1,且t=2⑶x=(a=3*5,a*4)赋值表达式的值为60,且x=60,a=15赋值运算赋值运算符(右结合)
=+=-=*=/=%=&=|=^=>>=<<=赋值表达式将表达式的值存入变量对应的内存单元中m=12b=(++a)-2m%=3+n等价于m=m%(3+n)x*=(x=5)说明:赋值号左边必须是变量,右边可以是C语言任意合法的表达式例如:n=t+2<s合法
a+b=15
不合法赋值运算符仅优先于“,”,且具有右结合性例如:
a=b=b*c>10等价于:a=(b=(
(b*c)>10)
)赋值号与数学中的等号含义不同例如:数学中a=b等价于b=a
C语言中a=b不等价于b=a说明:【例2.8】赋值运算应用实例。 #include"stdio.h" voidmain() {inti,j; floatx,y; i=j=1; x=y=1.1f; printf("i=%d,j=%d\n",i,j); x=i+j; y+=1;/*等价于y=y+1*/ printf("x=%4.2f,y=%4.2f\n",x,y); i=i+++j; x=2*x+y; printf(“i=%d,x=%4.2f\n”,i,x); }运行结果为:i=1,j=1x=2.00,y=2.10i=3,x=6.10位运算符~&^|<<>>位逻辑运算符移位运算符单目位运算符的运算对象只能是整型数据或字符型数据,不能是实型数据运算对象一律按二进制补码参加运算,并按位进行运算位运算的结果是一个整型数据低于单目、算术运算符,高于其他运算符低于单目、算术和关系运算符,高于其他运算符位运算符(1)位逻辑运算按位取反运算 按位取反运算符:~按位取反运算用来对一个二进制数按位求反,即“1”变为“0”,“0”变为“1~运算常用于产生一些特殊的数。~运算还常用于加密子程序。例如:初始字节内容00000101取反后
11111010位运算符按位与运算按位与运算符:& 按位与运算的规则是当两个操作数的对应位都是1时,则该位的运算结果为1,否则为“0“。例如:0x29&0x37的运算0x29:001010010x37:00110111与运算结果为:00100001,即0x21。位运算符按位与运算主要用途是清零、指定取操作数的某些位或保留操作数的某些位。
例如:
a&0运算后,将使数a清0。
a&0xF0运算后,保留数a的高4位为原值,使低4位清0。 a&0x0F运算后,保留数a的低4位为原值,使高4位清0。位运算符按位或运算按位或运算符:| 按位或运算的规则是当两个操作数的对应位都是0时,则该位的运算结果为0,否则为1。例如:0x29|0x37的运算0x29:001010010x37:00110111按位或结果:00111111,即等于0x3f。位运算符
利用或运算的功能可以将操作数的部分位或所有位置为1。例如:a|0x0F运算后,使操作数a的低4位全置1,其余位保留原值。a|0xFF运算后,使操作数a的每一位全置1。位运算符按位异或运算按位异或运算符:^ 按位异或运算的规则是当两个操作数的对应位相同时,则该位的运算结果为0,否则为1。例如:0x29^0x37的运算0x29:001010010x37:00110111按位异或结果:00011110,即等于0x1e位运算符 利用^运算的功能可以将数的特定位翻转,保留原值,不用中间变量就可以交换两个变量的值。例如:a^0x0F运算后,将操作数a的低4位翻转,高4位不变。a^0x00运算后,将保留操作数a的原值。a=a^b;b=b^a;a=a^b;运算后,不用中间变量交换a、b的值,就可以实现操作数a和b的交换。位运算符
移位运算向左移位运算左移位运算符:<<左移位运算的左操作数是要进行移位的整数,右操作数是要移的位数。左移位运算的规则是将左操作数的高位左移后溢出并舍弃,空出的右边低位补0。例如:15<<2运算15:00001111左移2位的结果为:00111100,等于60。使用左移位运算可以实现快速乘2运算。位运算符右移位运算右移位运算符:>>右移位运算的左操作数是要进行移位的整数,右操作数是要移的位数。右移位运算规则是低位右移后被舍弃,空出的左边高位,对无符号数补入0;对带符号数,正数时空出的左边高位补入0,负数时空出的左边高位补入其符号位的值(算术右移)。例如:15>>2的运算,15:00001111右移2位的结果:00000011结果为3;-15>>2的运算-15:11110001右移2位的结果为:11111100,结果为-4。
使用右移位运算可以实现快速除2运算。位运算符【例2.9】取一个正整数a(用二进制数表示)从右端开始的4~7位(最低位从0开始)。
#include"stdio.h" voidmain() { unsignedinta,b,c,d; scanf("%o",&a);/*八进制形式输入*/ b=a>>4;/*a右移四位*/ c=~(~0<<4);
/*得到一个4位全为1,其余位为0的数*/ d=b&c;/*取b的0~3位,即得到a的4~7位*/ printf(“a=%o,a(4~7)=%o”,a,d); }输入数据:331运行结果为:a=331,a(4~7)=15取地址运算符&为单目运算符运算对象只能是变量运算结果是变量的存储地址例如有定义:inta,student;charch;可以对变量a、ch、student进行&运算:&a&ch&student长度运算符sizeof为单目运算符运算对象只能是变量名或数据类型标识符
运算结果为该变量或该数据类型的长度voidmain(){inta=5;doublex;printf("%d%d",sizeof(int),sizeof(a));printf("%d%d",sizeof(double),sizeof(x));printf("%d%d\n",sizeof(float),sizeof(char));}TC环境中输出结果:2288
4
1运算中数据类型的转换1.数据类型的自动转换转换原则:自动将精度低、表示范围小的运算对象类型向精度高、表示范围大的运算对象类型转换
char,shortdoublelongfloatunsignedint高精度低精度例如有定义:inta;char
ch;表达式:a-ch*2+35La-ch*2+35.2.数据类型的强制转换强制转换的一般形式例如:
(int)('b'+3*x)%31/(float)a+6注意:(float)
22/5与(float)
(22/5)
不同错误的类型转换:(int)b=a+5b=int(3*a)(类型名)表达式3.赋值表达式中的类型转换将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(32位)中。但应注意数值范围不能溢出。字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节(TC环境下),因此将字符数据(8位)放到整型变量低8位中。3.赋值表达式中的类型转换 在某些编译环境下,将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中,如果int型数据为正值(符号位为“0”),则long型变量的高16位补“0”;如果int型变量为负值(符号位为“1”),则long型变量的高16位补“1”,以保持数值不改变。反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。3.赋值表达式中的类型转换将unsignedint型数据赋给longint型变量时,不存在符号扩展问题,只需将高位补“0”即可。将非unsigned型数据赋给长度相同的unsigned型变量,也是原样照赋(连原有的符号位也作为数值一起传送)。3.赋值表达式中的类型转换
【例2.10】赋值表达式中的类型转换。
voidmain(){ inti=43; floata=55.5,a1; doubleb=123456789.123456789; charc='B'; printf("i=%d,a=%f,b=%f,c=%c\n",i,a,b,c);
/*输出i,a,b,c的初始值*/ a1=i;/*int型变量i的值赋值给float型变量a1*/ i=a;
/*float型变量a的值赋给int型变量i,会舍去小数部分*/3.赋值表达式中的类型转换a=b;/*double型变量b的值赋值给float型变量a,有精度损失*/ c=i;
/*int型变量i的值赋值给char变量c,会截取int型低8位*/ printf("i=%d,a=%f,a1=%f,c=%c\n",i,a,a1,c);
/*输出i,a,a1,c赋值以后的值*/ }运行该程序的输出结果如下:i=43,a=4.500000,b=123456789.123457,c=Bi=55,a=123456792.000000,a1=43.000000,c=7
小结1.C的数据类型(基本类型,构造类型,指针类型,空类型)及其定义方法。2.C运算符的种类、运算优先级和结合性。3.C表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。4.不同类型数据间的转换与运算。134第三章程序设计基础C/C++语言程序设计龚尚福,贾澎涛主编《C/C++语言程序设计》西安电子科技大学出版社第3章程序设计基础3.1程序结构和语句3.2数据的输入和输出3.3顺序结构的程序设计3.4选择结构的程序设计3.5循环结构的程序设计3.6程序设计的风格3.7小结3.1程序结构和语句顺序结构136N-S结构图流程图ABAB选择结构YNABP成立?PTFAB3.1.1三种程序结构3.1程序结构和语句循环结构137NYP成立?A当P成立时
A直到型循环
A直到P成立时NYAP成立?当型循环N-S结构图流程图3.1.1三种程序结构3.1.2C语句概述138程序包括数据描述和数据操作。数据描述主要定义数据结构(用数据类型表示)和数据初值。数据操作的任务是对已提供的数据进行加工。C程序对数据的处理和加工是通过语句的执行来实现的。3.1.2C语句概述139C语言数据操作语句简单语句特殊语句流程控制语句表达式语句(表达式;)函数调用语句(函数名(参数表);)空语句(;)复合语句({一条或多条语句})注释语句(/*注释文本*/)结构化语句非结构化语句条件语句(if语句,switch语句)循环语句(while语句,do-while语句,for语句)限定转向语句(break语句,continue语句,return语句)非限定转向语句(goto语句)说明性语句对程序中使用的变量、数组、函数等操作对象进行定义、声明的描述语句只起说明作用,不产生可执行的机器指令代码。
例如:inta,b;floatfunction(int,int);140C程序由函数组成。函数的格式:函数名(参数表){说明部分;执行部分;}数据类型说明语句可执行语句简单语句表达式后面加一个分号,构成表达式语句x=3;y=y+5;x=a-b&&c||d;printf("x=%d,y=%d\n",x,y);sort(a,10);141赋值语句函数调用语句分号是语句必不可少的一部分简单语句是程序中使用最频繁的语句,来自于一个表达式或者函数调用,结尾用分号就构成一个语句。简单语句142表达式语句中最常用的是赋值语句,有以下三种常用形式:①简单赋值:变量=表达式;例如:x=2*y+1;s=sqrt(5);②多重赋值:变量1=变量2=…=变量n=表达式;例如:a=b=c=2;i=j=k=m+1;③复合赋值:变量双目操作符=表达式;例如:sum+=i;等价于sum=sum+i;特殊语句空语句、复合语句都属于特殊语句。(1)如果语句只有一个分号,就是空语句。
程序执行空语句时不产生任何动作。它可以作为循环语句中的空循环体;或代替模块化程序设计中还尚未实现的以及暂不加入的部分。程序中有时需要加上一个空语句来表示存在一条语句,但是随意加上分号有时会造成逻辑上的错误,因此,用户应该慎用或去掉程序中不必要的空语句。143复合语句用一对花括号“{}”括起来的若干条语句花括号中可以是说明语句、表达式语句、控制语句,也可以是复合语句例如:⑴if(a>b){max=a;min=b;}
⑵for(n=1;n<10;n++)
{p=n+p;if(p>=100)
{printf(“%d\n”,p);break;
}
}
144复合语句(续)复合语句中如果有说明性语句,应该写在可执行语句的前面。145例如:
main(){inta,b;a=b=100;{floatc=10.23;printf("%f\n",c);}printf("%d%d\n",a,b);}要特别注意:花括号的配对花括号的位置C语言学习的难点之一控制语句1.选择分支控制语句if()…else… switch(){…}
2.循环控制语句for()… while()…do…while()3.其他控制语句break、continue、gotoreturn1463.1.3程序设计的步骤(1)分析问题。分析清楚输入、输出和处理要求。即确定要产生的数据(称为输出);确定要进行输入的数据(称为输入);要解决的问题等。(2)确定算法。研究确定一种算法,从有限步的输入中获取输出。也就是拟定处理的方法和步骤,包括用什么公式或进行怎样的运算。(3)编写源程序。把解题的算法表示成C程序。(4)调试运行。把C程序输入计算机,编辑成C源程序文件;然后进行编译、链接和运行,修改错误,直到输出正确结果。1473.2数据的输入与输出数据的输入输出是程序设计中使用最普遍的基本操作。程序运行所需的数据通常要从外部设备(如键盘、文件、扫描仪等)输入,程序的运行结果通常也要输出到外部设备(如打印机、显示器、绘图仪、文件等)。因此,输入、输出是用户与程序之间交互的主要手段。1483.2数据的输入与输出
C语言本身虽然没有直接提供用于输入和输出的语句,但提供了输入和输出标准库函数(简称标准函数或库函数)。由于标准输入输出函数的原型放在头文件stdio.h中,因此在编写程序时,要用编译预处理命令“#include”将头文件stdio.h包括到用户源文件中。
#include<stdio.h>或
#include"stdio.h"149格式输出函数函数调用的一般形式:
printf(格式控制字符串,输出项表);
功能:将各输出项的值按指定的格式显示在标准输出设备(如屏幕)上。例如有程序段:inta=123,b=100;printf("%d%d%d\n",a,b,a+b);printf("c=%d+%d=%d\n",a,b,a+b);150格式控制字符串用双引号括起的字符串,用于指定输出数据的类型、格式、个数包括:普通字符和格式说明符151照原样输出
printf("c=%d+%d=%d\n",a,b,a+b);格式说明符:指定输出3个十进制整型数,分别为变量a、b、a+b的值输出格式说明符在%和格式符之间可以使用格式修饰符152整型数据%d以有符号十进制形式输出整型数%o以无符号八进制形式输出整型数%x以无符号十六进制形式输出整型数%u以无符号十进制形式输出整型数实型数据%f以小数形式输出实型数%e以指数形式输出实型数%g按数值宽度最小的形式输出实型数字符型数据%c输出一个字符%s输出字符串其他%%输出字符%本身格式修饰符例如:%ld——输出十进制长整型数%m.nf——右对齐,m位域宽,n位小数或n个字符%-m.nf——左对齐153l输出长整型数(只可与d、o、x、u结合用)m指定数据输出的宽度(即域宽).n对实型数据,指定输出n位小数;对字符串,指定左端截取n个字符输出+使输出的数值数据无论正负都带符号输出-使数据在输出域内按左对齐方式输出整数位数+小数位数+小数点自动对n位后小数四舍五入例3.2
不同类型数据的输出。#include<stdio.h>voidmain(){inta=-2;floatb=123.456;charc='a';printf("a=%d,%3d,%-3d\n",a,a,a);printf("a=%o,%x,%u,%3o,%3x,%3u\n",a,a,a,a,a,a);printf("b=%f,%10.2f,%.2f,%5.2f,%-10.2f\n",b,b,b,b,b);printf("b=%e,%10.2e,%.2e,%5.2e,%-10.2e\n",b,b,b,b,b);printf(“c=\‘%3c\’,\‘%-3c\’,%d\n”,c,c,c);printf("%3s,%7.2s,%.3s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA");}154程序输出:a=-2,□-2,-2□a=3777
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校内部会计监督制度
- 鹰潭职业技术学院《竞赛机器人设计》2024-2025学年第二学期期末试卷
- 机关内部人事调整制度
- 浙江理工大学科技与艺术学院《office高效办公》2024-2025学年第二学期期末试卷
- 机关科室内部制度
- 机构内部管理制度汇编
- 构建存货内部控制制度
- 某公司单位内部会计制度
- 检测站内部管理制度
- 民宿服务内部管理制度
- 高校党支部2025年度支部书记抓党建工作述职报告
- 2026年江西高职单招试题新版
- 药剂科处方培训课件
- 九师联盟2026届高三上学期第五次质量检测地理(1月联考)(含答案)
- KDIGO慢性肾脏病贫血管理临床实践指南(2026年)解读课件
- 护理评估与患者安全
- 2026年鄂尔多斯职业学院单招职业适应性测试题库及答案详解一套
- 2025年会东县事业单位联考招聘考试历年真题带答案
- 焊接与热切割安全操作规程
- 2026年岳阳职业技术学院单招职业倾向性测试模拟测试卷附答案
- 小学语文命题策略及试题设计建议
评论
0/150
提交评论