软考(程序语言基础知识)课件_第1页
软考(程序语言基础知识)课件_第2页
软考(程序语言基础知识)课件_第3页
软考(程序语言基础知识)课件_第4页
软考(程序语言基础知识)课件_第5页
已阅读5页,还剩204页未读 继续免费阅读

下载本文档

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

文档简介

第6章程序语言基础知识第6章程序语言基础知识6.1程序语言基础知识6.1.1程序语言的基本概念6.1.2程序设计语言的分类和特点6.1.3程序语言的基本成分6.2语言处理程序基础6.2.1汇编程序基本原理6.2.2编译程序基本原理6.2.3解释程序基本原理低级语言和高级语言低级语言机器语言使用0、1序列效率低,可读性差,难以理解汇编语言使用容易记忆的符号可读性有所提高,但书写格式在很大程度上取决于特定计算机面向机器6.1.1程序语言的基本概念编译程序和解释程序语言处理程序的分类汇编程序将用汇编语言编写源程序翻译成目标程序后,再执行解释程序直接执行源程序,或者将源程序翻译成某种中间表示形式后再加以执行编译程序先将源程序翻译成目标语言程序,然后在计算机上运行目标程序6.1.1程序语言的基本概念编译程序和解释程序解释程序和编译程序的根本区别在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程;在解释方式下,解释程序和源程序要参与到程序的运行过程中,运行程序的控制权在解释程序。解释器翻译源程序时不产生独立的目标程序,而编译器则需将源程序翻译成独立的目标程序。6.1.1程序语言的基本概念程序设计语言的定义语法由程序语言基本符号组成程序中的各个语法成分(包括程序)的一组规则。包括词法规则和语法规则语法可以通过形式语言进行描述语义程序语言中按语法规则构成的各个语法成分的含义分为静态语义和动态语义6.1.1程序语言的基本概念程序设计语言的定义语用表示了构成语言的各个记号和使用者的关系,涉及符号的来源、使用和影响。语境理解和实现程序设计语言的环境包括编译环境和运行环境6.1.1程序语言的基本概念程序设计范型根据程序设计的方法,可分为命令式程序设计语言面向对象的程序设计语言函数式程序设计语言逻辑型程序设计语言6.1.2程序设计语言的分类和特点面向对象的程序设计语言包含几个主要概念对象:人们要进行研究的任何事物,具有状态和操作。类:面向对象语言必须提供的由用户定义的数据类型,它将具有相同状态、操作和访问机制的多个对象抽象成一个对象类。继承:实现了一般与特殊的关系,达到概念复用和代码复用的目的。代表语言:C++、Java等6.1.2程序设计语言的分类和特点逻辑型程序设计语言逻辑型语言是一类以形式逻辑为基础的语言。适用于书写自动定理证明、专家系统和自然语言理解等问题的程序。代表语言:PROLOG6.1.2程序设计语言的分类和特点练习(2008年上)计算机程序=算法+数据结构+程序设计方法+语言工具和环境,其中关于程序设计的叙述,正确的是(30)。

A、程序设计语言与程序设计方法是一一对应的关系

B、面向对象的程序设计语言只能支持面向对象的程序设计方法

C、面向对象的程序设计技术与结构化程序设计技术是相互排斥的

D、过程式程序设计是一种传统的程序设计方法练习(2008年上)计算机能直接识别和执行机器语言程序,该语言的基本元素是(31)。

A、汇编代码 B、0和1

C、扩展ASCII码D、BCD码练习(2008年下)开发微型嵌入式应用系统,采用(29)更合适。

A、C语言或汇编语言

B、HTML或XML语言

C、脚本语言

D、SQL语言练习(2009年上)

(29)属于标记语言。 A、PHP B、Lisp C、XML D、SQL

练习(2010年上)通过程序设计活动求解问题时,通常可以分为问题建模、算法设计、编写代码和编译调试四个阶段。(39)阶段的工作与所选择的程序语言密切相关。

A、问题建模和算法设计

B、算法设计和编写代码

C、问题建模和编译调试

D、编写代码和编译调试语言处理程序主要作用将高级语言或汇编语言编写的程序翻译成某种机器语言程序,使程序可在计算机上运行。分类汇编程序编译程序解释程序6.2语言处理程序基础汇编语言指令语句(机器指令语句)指令语句经过汇编产生的机器代码,能被CPU直接识别并执行相应的操作。基本指令如:ADD、SUB和MOV等。可分为:传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令和处理机控制指令等类型。6.2.1汇编程序基本原理汇编语言伪指令语句伪指令语句指示汇编程序在汇编源程序时完成某些工作。伪指令语句与指令语句的区别伪指令语句经汇编后不产生机器代码,而指令语句经汇编后产生相应的机器代码;伪指令语句所指示的操作是在源程序被汇编时完成的,而指令语句的操作必须在程序运行时完成。6.2.1汇编程序基本原理汇编程序功能:将汇编语言所编写的源程序翻译成机器指令程序。基本工作将每一条可执行汇编语句转换成对应的机器指令;处理源程序中出现的伪指令和宏指令。6.2.1汇编程序基本原理汇编程序汇编程序一般需要两次扫描源程序才能完成翻译过程。第一次扫描的主要工作是定义符号的值并创建一个符号表ST。第二次扫描的任务是产生目标程序。在第二次扫描中,可执行汇编语句应被翻译成对应的二进制代码机器指令。6.2.1汇编程序基本原理练习(2008年上)关于汇编语言,以下叙述中正确的是(28)。

A、汇编语言源程序可直接在计算机上运行

B、将汇编语言源程序转换成目标程序的软件称为解释程序

C、在汇编语言程序中,不能定义符号常量

D、将汇编语言源程序翻译成机器语言程序的软件称为汇编程序编译过程概述 编译程序的功能是把某高级语言书写的源程序翻译成与之等价的目标程序(汇编语言程序或机器语言程序)。6.2.2编译程序基本原理编译过程概述词法分析任务:对源程序从前到后(从左到右)逐个字符地扫描,从中识别出一个个“单词”符号。分析依据:语言的词法规则分析结果:常以二元组方式输出,即单词的种类和单词自身的值6.2.2编译程序基本原理编译过程概述例如,对于某PASCAL源程序中的语句: VARX,Y,Z:real; X:=Y+Z*60; 词法分析阶段将语句分割成如下的单词序列: (1)保留字VAR (2)标识符 X (3)逗号, (4)标识符 Y (5)逗号, (6)标识符 Z (7)冒号: (8)标准标识符real (9)分号; (10)标识符X (11)赋值号:= (12)标识符 Y (13)加号+(14)标识符Z (15)乘号*(16)整常数60 (17)分号;6.2.2编译程序基本原理VARid1,id2,id3:real;id1:=id2+id3*60;编译过程概述语法分析任务:在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如表达式、语句、程序等。分析结果:如果源程序中没有语法错误,则能正确地构造出其语法树;否则就指出语法错误,并给出相应的诊断信息。6.2.2编译程序基本原理编译过程概述6.2.2编译程序基本原理对语句:

VARid1,id2,id3:real; id1:=id2+id3*60;进行语法分析后形成如下语法树:编译过程概述语义分析任务:检查源程序是否包含语义错误,并收集类型信息供后面的代码生成阶段使用。分析依据:语言的语义规则注意:只有语法和语义都正确的源程序才能被翻译成正确的目标代码。6.2.2编译程序基本原理编译过程概述例如,对语句id1:=id2+id3*60进行语义分析后得到如下的语法树:6.2.2编译程序基本原理编译过程概述中间代码生成任务:根据语义分析的输出生成中间代码。中间代码是一种简单且含义明确的记号系统特征:与具体的机器无关设计原则:一是容易生成;二是容易被翻译成目标代码。最常用的一种中间代码是三地址码,其实现方式常采用四元式:运算符,运算对象1,运算对象2,运算结果6.2.2编译程序基本原理编译过程概述例如,对语句X:=Y+Z*60,可生成以下四元式序列:(inttoreal,60,-,t1)(*,id3,t1,t2)(+,id2,t2,t3)(:=,t3,-,id1)6.2.2编译程序基本原理编译过程概述代码优化优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。代码优化一般建立在对程序的控制流和数据流分析的基础之上,与具体的机器无关。优化原则:程序的等价变换规则例如,6.2.2编译程序基本原理(inttoreal,60,-,t1)(*,id3,t1,t2)(+,id2,t2,t3)(:=,t3,-,id1)优化(*,id3,60.0,t1)(+,id2,t1,id1)编译过程概述目标代码生成任务:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这个阶段与具体的机器密切相关。例如,使用两个寄存器R1和R2,可对上述的四元式生成如下的目标代码:MOVFid3,R2MULF#60.0,R2MOVFid2,R1ADDFR2,R1MOVR1,id16.2.2编译程序基本原理编译过程概述符号表管理作用:记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效的查找、插入、修改和删除等操作。符号表的建立可以始于词法分析阶段,也可以放到语法分析和语义分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。6.2.2编译程序基本原理编译过程概述出错处理静态错误发生在程序编译时分为语法错误和静态语义错误动态错误也称为动态语义错误发生在程序运行时6.2.2编译程序基本原理字母表、字符串、字符串集合及运算字母表∑:元素的非空有穷集合。字符:字母表∑中的一个元素。字符串:字母表∑中字符组成的有穷序列。字符串的长度:字符串中的字符个数。空串ε:由0个字符组成的序列。连接:字符串S和T的连接是指将串T接续在串S之后,表示为S·T,连接符号“·”可省略。空集:用符号Φ表示。∑*:指包括空串ε在内的∑上所有字符串的集合。字符串的方幂:把字符串α自身连接n次得到的串,称为字符串α的n次方幂,记为αn。6.2.2编译程序基本原理字母表、字符串、字符串集合及运算字符串集合的运算或(合并):A∪B={α|α∈A或α∈B}积(连接):AB={αβ|α∈A且β∈B}幂:An=A·An-1=An-1·A(n>0),并规定A0={ε}正则闭包+:A+=A1∪A2∪A3∪…∪An闭包*:A*=A0∪A+。显然, ∑*=∑0∪∑1∪∑2∪…∪∑n6.2.2编译程序基本原理词法分析器词法分析的任务是把构成源程序的字符串依据词法规则转换成单词符号序列。词法规则可用3型文法(正规文法)或正规表达式描述,它产生的集合是语言基本字符集∑(字母表)上的字符串的一个子集,称为正规集。6.2.2编译程序基本原理正规表达式和正规集定义ε是一个正规式,表示集合L(ε)={ε}。若a是∑上的字符,则a是一个正规式,它所表示的正规集为L(a)={a}。若正规式r和s分别表示正规集L(r)和L(s),则r|s是正规式,表示集合L(r)∪L(s)。r·s是正规式,表示集合L(r)L(s)。r*是正规式,表示集合(L(r))*。(r)是正规式,表示集合L(r)

。仅由有限次地使用上述上述三个步骤定义的表达式才是∑上的正规式。6.2.2编译程序基本原理正规表达式和正规集设∑={a,b}6.2.2编译程序基本原理正规式正规集ab符号串ab构成的集合a|b符号串a、b构成的集合a*由0个或多个a构成的符号串集合(a|b)*所有字符a和b构成的串的集合a(a|b)*以a为首字符的a、b字符串的集合(a|b)*abb以abb结尾的a、b字符串的集合【练习】1、(ab|b)*c与以下哪些串匹配?

ababbcababcbabcaaabc答案:ababbccbabc

2、ab*c*(a|b)c与以下哪些串匹配? acacacbbcabbcacabcacc

答案:acacabbcacabc3、(a|b)a+(ba)*

与以下哪些串匹配?

babbaababaaabaa

答案:baaabaa6.2.2编译程序基本原理【练习】4、正规式(1|3|5)(202)(c|de)表示的正规集合中元素数目为①,②是该正规集合中的元素。①A、6B、7C、8D、无穷②A、135202cdeB、1202cC、302cdeD、52c6.2.2编译程序基本原理练习(2008下)设正规式S=(a|ba)*,则其对应正规集的字符串(30)。 A、长度必须是偶数 B、长度必须是奇数 C、a不能连续出现 D、b不能连续出现6.2.2编译程序基本原理有限自动机定义有限自动机是一种识别装置的抽象概念,它能准确地识别正规集。分类确定的有限自动机不确定的有限自动机6.2.2编译程序基本原理有限自动机确定的有限自动机(DFA)一个确定的有限自动机是个五元组:(S,∑,f,s0,Z),其中:S是一个有限集合,它的每个元素称为一个状态。∑是一个有穷字母表,它的每个元素称为一个输入字符。f是S×∑→S上的单值部分映像。f(A,a)=Q表示当前状态为A、输入为a时,将转换到下一状态Q。称Q为A的一个后继状态。s0∈S,是唯一的一个开始状态。Z是非空的终止状态集合,ZS。6.2.2编译程序基本原理有限自动机【例】DFAM1=({s0,s1,s2,s3},{a,b},f,s0,{s3}), 其中f为: f(s0,a)=s1, f(s0,b)=s2, f(s1,a)=s3, f(s1,b)=s2, f(s2,a)=s1, f(s2,b)=s3, f(s3,a)=s36.2.2编译程序基本原理终态abs0s1s2s1s3s2s2s1s3s3s3-状态转换矩阵状态输入字符初态有限自动机对于∑中的任何字符串ω,若存在一条从初态节点到某一终态节点的路径,且这条路径上所有弧的标记符连接成的字符串等于ω,则称ω可由DFAM识别(接受或读出)。若一个DFAM的初态节点同时又是终态节点,则空字ε可由该DFA识别(或接受)。DFAM所能识别的语言L(M)={ω|ω是从M的初态到终态的路径上的弧上标记所形成的串}。6.2.2编译程序基本原理有限自动机例如,对于字符串“ababaa”在上面的状态转换图的识别路径是s0→s1→s2→s1→s2→s1→s3。而“abab”和“baab”不能被该DFA接受。6.2.2编译程序基本原理有限自动机不确定的有限自动机(NFA)一个不确定的有限自动机也是个五元组:(S,∑,f,s0,Z),它与DFA的区别如下:f是S×∑→2S上的映像。对于S中的一个给定这台及输入符号,返回一个状态的集合。即当前状态的后继状态不一定是唯一确定的。有向弧上的标记可以是ε。6.2.2编译程序基本原理有限自动机【例】NFAN=({s0,s1,s2,s3},{a,b},f,s0,{s3}), 其中f为: f(s0,a)=s0, f(s0,a)=s1, f(s0,b)=s0, f(s1,b)=s2, f(s2,b)=s3abs0{s0,s1}{s0}s1-{s2}s2-{s3}s3--6.2.2编译程序基本原理状态转换矩阵显然,DFA是NFA的特例。练习(2009年上)下图所示的有限自动机中,s0是初始状态,s3是终止状态,该自动机不能识别(31)。

A、ababB、aaaaC、babbD、abba练习(2009年下)某有限自动机的状态图如下图所示,其特点是(31)。

A、仅识别以0开始以1结尾的0、1串

B、仅识别含有3个0的0、1串

C、仅识别含有偶数个1的0、1串

D、仅识别以0开始以1结尾且0和1交错出现的0、1串练习(2010年上)某有限状态自动机的状态图如下图所示(状态0是初态,状态2是终态),则该自动机不能识别(30)。

A、abab B、aabb C、bbaa D、bbab词法分析器手工构造词法分析器的方法用正规式描述语言规定的单词符号;构造相应有限自动机的状态转换图;从状态转换图出发编写词法分析器(程序)。6.2.2编译程序基本原理语法分析程序语言的语法常采用上下文无关文法描述。文法不仅规定了单词如何组成句子,而且刻画了句子的组成结构。形式文法是一个规则(或称产生式)系统,它规定了单词在句子中的位置和顺序,也刻画了句子的层次结构。6.2.2编译程序基本原理练习(2008年上)对高级语言源程序进行编译时,可发现源程序中的(29)错误。

A、堆栈溢出 B、变量未定义

C、指针异常 D、数组元素下标越界

练习(2008年下)编译型程序设计语言若规定程序中的变量必须先定义(或声明)再引用,那么违反此规定的程序在(28)时报错。

A、编辑 B、编译

C、链接 D、运行

解释程序工作原理在运行用户程序时,直接执行源程序或源程序的内部形式。不产生源程序的目标程序。6.2.3解释程序基本原理1:11:n解释程序基本结构分析部分 包括通常的词法分析、语法分析和语义分析程序,经语义分析后把源程序翻译成中间代码,中间代码采用逆波兰表示形式。解释部分 用来对分析部分产生的中间代码进行解释执行。6.2.3解释程序基本原理编译和解释工作方式的比较效率编译比解释方式可能取得更高的效率灵活性解释方式能够比编译方式更灵活可移植性只要对解释器进行重新编译,就可以使解释器运行在不同的环境中练习(2009年上)

(28)属于系统软件,它直接执行高级语言源程序或与源程序等价的某种中间代码。

A、编译程序 B、预处理程序

C、汇编程序 D、解释程序

练习(2009年下)

(30)的任务是将来源不同的编译单元装配成一个可执行程序。

A、编译程序B、解释程序

C、链接程序D、装入程序C语言的特点具有低级语言的功能,允许直接访问物理地址和进行位运算。具有高级语言的功能,有结构化控制语句流,是结构化程序设计语言。可用于系统软件的开发,也可用于应用软件的开发。安全性低,如:对指针没有适当的限制。指针错误,可能引起内存中的信息被破坏,如果经常出现这种错误,极有可能导致系统的崩溃。6.1.3程序语言的基本成分第一个程序/*该程序在屏幕上输出Hello,world!*/#include<stdio.h>voidmain(){printf("Hello,world!\n");}注释行预处理命令主函数语句6.1.3程序语言的基本成分说明函数是C语言程序的基本单位。一个C语言程序一般由一个主函数和若干其他函数组成。一个C语言程序必须包含且只能包含一个main函数。C语言程序从main函数开始执行,调用其他函数后再返回main函数。6.1.3程序语言的基本成分数据类型6.1.3程序语言的基本成分C语言的数据类型基本类型聚合类型指针类型

以*为标志整型int实型单精度型float双精度型double字符型char空类型void数组类型

以[]为标志结构体类型struct共用体类型union枚举类型enum基本类型的修饰符除void类型外,基本类型的前面可以有各种修饰符。signed(有符号)unsigned(无符号)long(长型符)short(短型符)适用于字符型和整型可用于double类型6.1.3程序语言的基本成分名称类型位数取值范围整型int16-32768~32767短整型short16-32768~32767长整型long32-2147483648~2147483647无符号整型unsignedint160~65535无符号短整型unsignedshort160~65535无符号长整型unsignedlong320~4294967295单精度型float32-3.4*1038~3.4*1038双精度型double64-1.7*10308~1.7*10308字符型char8-128~127标识符命名规则由英文字母或下划线开头。在第一个字符后,可以是任意的字母、数字和下划线的序列。长度不超过8个。不能跨行书写。区分大小写。自定义标识符不能与关键字同名。6.1.3程序语言的基本成分常量和变量常量在程序运行过程中,其值不能改变的量称为常量。分为整型常量、实型常量、字符型常量和符号常量。变量在程序运行过程中其值可以改变的量称为变量。变量名是用标识符来表示的。所有的C变量必须先定义后使用。6.1.3程序语言的基本成分变量的定义定义变量的一般形式:

变量类型变量名表; 其中,变量名表可以由一个或多个标识符名构成,中间用“,”分隔。 例如:inta,b,c; chars;

注意:此时变量的值为不定值。6.1.3程序语言的基本成分变量的初始化变量的初始化,即为变量赋值。例如:inta,b; a=1;b=2; 等价于:inta=1,b=2;6.1.3程序语言的基本成分整型常量十进制数:以非0数字开头的数。 例如:123、-45、0八进制数:以数字0开头的数。 例如:012表示八进制(12)8

,等于十进制数(10)10十六进制数:以0x或0X开头的数。 例如:0x12表示十六进制(12)16

,等于十进制数(18)106.1.3程序语言的基本成分整型变量三种类型:短整型(shortint)、普通整型(int)和长整型(longint)每种类型分为有符号型(signed)和无符号型(unsigned)。默认时为signed类型。无符号数:在整常数后加字母U或u。 例如: unsignedu; u=123U;长整型:在整常数后加字母L或l。 例如: longl; l=45L;6.1.3程序语言的基本成分实型常量十进制形式:由数字和小数组成(必须有小数点),但小数点前后的0可以省略。 例如:12.3、0.12、.45、1.指数形式:由整数部分、小数部分和指数部分构成。指数部分,即E(或e)后面的数必须是整数。 例如:1.2E2 表示 1.2×102,

3.E-2 表示 3.0×10-2,

.45e3 表示 0.45×1036.1.3程序语言的基本成分实型变量三种类型:单精度型(float)、双精度型(double)、长双精度型(longdouble)一个实型常数默认为double型。float型数:在实数后面加上字母f或F。 例如:floatf;f=12.45f;longdouble型数:在实数后面加上字母l或L。 例如:longdoubleld;ld=12.36L;6.1.3程序语言的基本成分字符常量字符常量是用单引号括起来的单个字符。 例如:'A'、'b'、'*'转义字符:以"\"开头的字符序列。

\n 回车换行\t 水平制表符\ddd 三位八进制数 例如:\101字母'A'(ASCII值:65)\xhh 两位十六进制数例如:\x42字母'B'(ASCII值:66)6.1.3程序语言的基本成分字符串常量字符串常量是由一对双引号括起来的字符序列。 例如:"Hello"、"123456"C语言编译器会自动在字符串的末尾加一个转义字符'\0',作为字符串常量的结束标志。 例如:'a'和"a"是完全不同的。前者是字符常量,占的字节数是1;后者是字符串常量,占的字节数是2。C语言中没有专门的字符串变量,字符串变量只能存放在字符型数组中。6.1.3程序语言的基本成分符号常量定义的一般形式:

#define标识符字符串说明:define是预编译命令,在编译之前中用对应的字符串替换程序中的标识符,然后再编译程序该定义必须放在程序的开头,每个定义独占一行;不是语句,尾部不跟分号。为了与变量区分,一般符号常量用大写表示。6.1.3程序语言的基本成分符号常量的使用#definePI3.14voidmain(){intr=3;floatc,s;c=2*PI*r;s=PI*r*r;printf("c=%f,s=%f\n",l,s);}6.1.3程序语言的基本成分

当开始编译前,系统先将程序中所有的PI标识符换成3.14,再进行编译。符号常量的使用#defineR10-7voidmain(){intx;x=3*R;printf(“x=%d\n",x);}6.1.3程序语言的基本成分运行结果:x=23枚举类型定义的一般形式:

enum类型标识符{枚举值名表};例如:

enumweekday {sun,mon,tue,wed,thu,fri,sat};说明:每一个枚举值都有一个序号,并规定从0开始编号。第一个枚举值的序号为0,以后顺序加1。6.1.3程序语言的基本成分枚举类型若想改变枚举值的序号值,可以在枚举类型定义中指定。例如:enumweekday{sun=7,mon=1,tue,wed,thu,fri,sat};6.1.3程序语言的基本成分指定枚举值sun的序号为7,mon的序号为1,tue的序号为2,……,sat的序号为6。枚举变量的定义例如:或者enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayd1;enumweekday{sun,mon,tue,wed,thu,fri,sat}d2;6.1.3程序语言的基本成分枚举类型判断下面的赋值是否正确:enumweekday{SUN,MON,TUE,WED,THU,FRI,SAT}workday;SUN=7;weekday=SUN;workday=MON;workday=1;workday=(enumweekday)1;×

×√×√6.1.3程序语言的基本成分类型定义定义格式:

typedef类型名新类型名;说明:给已有的类型名重新命名,原有的类型名仍然可用。typedef语句在编译时解释,而#define在预处理时解释,如:

typedefintINTEGER; #defineINTEGERint6.1.3程序语言的基本成分类型转换隐式转换:系统自动转换6.1.3程序语言的基本成分double

float

longunsignedint

char,short必须转换必须转换高低类型转换例:10+'a'+i*f-d/e 其中,

i:int f:float d:double e:long6.1.3程序语言的基本成分则运算时:①10+'a'

:结果为int;②i*f:结果为double;③①+②:结果为double;④d/e:结果为double;⑤③-④:结果为double。类型转换显式转换:强制类型转换 (类型名)(表达式)main(){floata=3.8;inti=(int)a;printf("%d",i);}运行结果:36.1.3程序语言的基本成分程序语言的运算成分运算成分指明允许使用的运算符号及运算规则。运算符号的使用与数据类型密切相关。运算符号要规定优先级和结合性,必要时可以使用圆括号。6.1.3程序语言的基本成分算术运算符* (乘)/ (除)%(取余)+ (加)- (减)结合性:自左向右6.1.3程序语言的基本成分优先级相同(高)优先级相同(低)算术运算符注意除法运算的两个操作数如果都是整数,则结果为整数,小数部分一律舍去;如果都是实数,则结果为实数。取余数运算的两个操作数必须是整数,其结果也为整数,符号以第一个操作数的为准。 例如,-5%3=-25%(-3)=26.1.3程序语言的基本成分关系运算符< (小于)<=(小于等于)> (大于)>=(大于等于)==(等于)!=(不等于)结合性:自左向右6.1.3程序语言的基本成分优先级相同(高)优先级相同(低)逻辑运算符! (逻辑非)&&(逻辑与)|| (逻辑与)结合性:“!”:自右向左“&&”、“||”:自左向右6.1.3程序语言的基本成分优先级最高,高于算术运算符优先级高优先级低低于关系运算符短路运算a&&b&&c求解方法:只有a为真(非0),才需要判断b的值,只有a和b都为真,才需要判断c的值。只要a为假,就不必判断b和c,运算立即中止。 例:intx=-1;

执行++x&&++x&&++x后,x的值是多少?

答案:x=06.1.3程序语言的基本成分短路运算a||b||c求解方法:只要a为真(非0),就不必判断b和c。只有a为假,才判断b;a和b都为假,才判断c。 例:intx=-1;

执行++x||++x||++x后,x的值是多少?

答案:x=16.1.3程序语言的基本成分自增和自减类型:++、--这两个都是单目运算符,其功能分别是操作数加1和减1。++i和--i是前缀表示法;i++和i--是后缀表示法。在语句中,前缀表示法和后缀表示法没有区别。 例如:i++;和++i;都是变量i加1。在表达式中,前缀表示法与后缀表示法是有区别的。6.1.3程序语言的基本成分自增和自减表达式前缀表示法:在引用操作数之前就先执行加1或减1操作;后缀表示法:先引用操作数的值,而后再进行加1或减1操作。例如:x=10;y=++x;x=10;y=x++;结果:x的值为11y的值为11x的值为11y的值为106.1.3程序语言的基本成分自增、自减的优先级自增/自减运算符的操作对象必须是一个变量。 例如:2++、(x/y)--都是非法的。自增/自减运算符的优先级高于算术运算符 例如:-i++等价于-(i++)6.1.3程序语言的基本成分【例2-1】自增、自减运算符的使用main(){inti=3,j=10,m,n,p,q;m=++i;n=i++;p=--j;q=j--;printf("i=%d,m=%d,n=%d\n",i,m,n);printf("j=%d,p=%d,q=%d\n",j,p,q);}运行结果:i=5,m=4,n=4j=8,p=9,q=96.1.3程序语言的基本成分练习(2009年上)C语言具有的“(34)”特性使其适用于系统级应用开发。

A、可直接对位、字节和地址进行运算

B、目标代码段,可移植性好

C、采用宏定义和条件编译

D、运算符丰富,关键字数量少练习(2009年下)以下关于C/C++程序变量的叙述中,错误的是(28)。

A、变量实际上是存储位置的名字

B、变量都具有类型属性

C、变量必须先声明,然后才能引用

D、除了赋值运算,其他运算都不能改变变量的值练习(2010年上)已知a是浮点变量,k是整型变量,对程序中的表达式“a+k”求值时,在不损失精度的要求下,通常需要(28)。

A、将k重新定义为浮点型变量

B、将a重新定义为整型变量

C、将k的值临时转换为浮点型

D、将a的值临时转换为整型练习(2008年下)对布尔表达式进行短路求值是指:无须对式中所有操作数或运算符进行计算就可确定表达式的值。对于表达式“bor((c>d)anda)”,(31)时可进行短路计算。

A、d为true

B、a为true

C、b为true

D、c为true

练习(2010年上)源程序中的(29)与程序的运行结果无关。

A、注释的多少

B、变量的取值

C、循环语句的执行次数

D、表达式的求值方式程序语言的控制成分控制成分指明语言允许表述的控制结构,程序员使用控制成分来构造程序中的控制逻辑。三种控制结构顺序结构按书写顺序,自上而下执行选择结构单分支、双分支和多分支循环结构当型循环和直到型循环6.1.3程序语言的基本成分复合语句复合语句是由一系列用“{”和“}”括起来的声明和语句。 例如, {t=x; x=y; y=t; }其主要作用是将多条语句组成一个可执行单元复合语句中最后一个语句的分号不能省略。复合语句是一个整体,要么全部执行,要么一条语句也不执行。6.1.3程序语言的基本成分选择结构——单分支结构语法:

if

(表达式)

语句1;说明:表达式必须用圆括号括起来,不能省略;表达式可以是任何表达式,常用的有关系表达式、逻辑表达式等。6.1.3程序语言的基本成分

注意:如果是多条语句作为内嵌语句1则要用花括号括起来,否则就把离它最近的一条语句看作是它的内嵌语句1。例1:#include<stdio.h> voidmain() {intx=4,y=5;if(x>y){printf("%d",x); printf("%d",y);} }例2:#include<stdio.h> voidmain() {intx=4,y=5;if(x>y)printf("%d",x); printf("%d",y); }(2)运行结果:5(1)运行结果:无输出内容选择结构——双分支结构语法:

if

(表达式)

语句1;

else 语句2;6.1.3程序语言的基本成分

if(表达式1)

语句1;elseif(表达式2) 语句2;else

语句3;

真假假真表达式1语句1

语句2

语句3表达式2if嵌套结构的流程图

选择结构——嵌套if语句内嵌if语句注意:

else与前面最近的且未配对的if配对。6.1.3程序语言的基本成分【练习】请写出下面程序的运行结果。#include<stdio.h>main(){intx=2,y=-1,z=2;if(x<y)if(y>0)z=0;elsez+=1;printf("z=%d\n",z);}运行结果:z=26.1.3程序语言的基本成分选择结构——多分支结构switch(条件表达式){case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

case常量表达式3:语句3;break;…

case常量表达式n:语句n;break;

default语句n+1;[break;]}说明:switch()中的表达式通常为整型、字符型、枚举类型;没有break,虽不出错,却不符合程序逻辑。6.1.3程序语言的基本成分例:设s=2switch(s){case1:printf("1");case2:printf("2");case3:printf("3");}结果??switch(s){case1:printf("1");break;case2:printf("2");break;case3:printf("3");break;}结果?2236.1.3程序语言的基本成分循环结构——while语句语法: while(表达式)

循环体语句;注意:循环次数的控制要正确。循环体包含一个以上的语句时,一定要用花括号括起来,否则,可能与程序要求不符。在循环体内要有使循环趋于结束的语句,否则,可能引起无限循环。循环表达式可以为真,通过循环体中加if语句对循环进行控制。6.1.3程序语言的基本成分循环结构——while语句6.1.3程序语言的基本成分/*在屏幕上依次输出整数1~20*/#include"stdio.h"main(){inti=1;while(i<=20){printf("%d",i);i++;}printf("\n");}循环变量赋初值循环条件循环体循环变量增值循环终值【练习】定义如下变量:intn=10; 则下列循环的输出结果是()。while(n>7)

{n--;

printf("%d",n);

}

A、10987B、9876 C、1098D、987D6.1.3程序语言的基本成分循环结构——dowhile语句语法:

do

循环体语句;while(表达式);注意:do-while总是要先执行一遍循环体,再做表达式的判断,因此循环体中的语句肯定要执行一次。循环结构——dowhile语句/*在屏幕上依次输出整数1~20*/#include"stdio.h"main(){inti=1;

do{printf("%d",i);i++;}while(i<=20);printf("\n");}6.1.3程序语言的基本成分【练习】1、下面程序段的运行结果是

。 x=2; do{ printf(“*”); x--;}while(!x==0);6.1.3程序语言的基本成分**【练习】2、下面程序段的运行结果是

。 main()

{ inty=2,x=1; while(y!=-1)

{do{x*=y;x++;}while(y--);x++;}

printf("%d,%d",x,y); }6.1.3程序语言的基本成分2,-1循环结构——for语句语法:

for(表达式1;表达式2;表达式3)

循环体语句;

等价于: 表达式1; while(表达式2) {

循环体语句;

表达式3; }6.1.3程序语言的基本成分循环结构——for语句/*在屏幕上依次输出整数1~20*/#include"stdio.h"main(){inti;

for(i=1;i<=20;i++)printf("%d",i);printf("\n");}6.1.3程序语言的基本成分【练习】1、下面程序段的运行结果是()。 main()

{inta;

for(a=1;a<=10;a++)

if(a%3==0)

a+=3;

printf("%d\n",a); }

A、10B、11C、12D、136.1.3程序语言的基本成分D【练习】2、下面程序段的运行结果是()。 main()

{ inti,j,n=0; for(i=0;i<2;i++) for(j=0;j<2;j++) if(j>=i) n+=1;n++; printf("%d\n",n); } A、4B、2C、1D、06.1.3程序语言的基本成分A循环结构——continue语句#include"stdio.h"voidmain(){inti,sum;for(i=1,sum=0;i<7;i++){if(i%2==0)continue;

sum+=i; }printf(“sum=%d",sum);}6.1.3程序语言的基本成分说明:遇到continue语句,则结束本次循环进入下一次循环。运行结果:sum=9循环结构——break语句#include"stdio.h"voidmain(){inti,sum;for(i=1,sum=0;i<7;i++){if(i%2==0)break;

sum+=i; }printf(“sum=%d",sum);}6.1.3程序语言的基本成分说明:遇到break语句,则结束整个循环。运行结果:sum=1【练习】#include"stdio.h"voidmain(){inti=0;while(i++<=5){if(i==3)continue;printf("%d",i);}}结果??#include"stdio.h"voidmain(){inti=0;while(i++<=5){if(i==3)break;printf("%d",i);}}结果?12124566.1.3程序语言的基本成分一维数组的定义定义格式: 元素类型名数组名[数组长度];说明:数组长度为常量表达式,其中可包含常量和符号常量。不允许用变量定义数组长度。6.1.3程序语言的基本成分#defineN3…inta[N];…intn=3;inta[n];一维数组的定义6.1.3程序语言的基本成分例如,定义一个一维数组 inta[5];

a是数组名,有5个元素,每一个元素都是int型。编译时为数组分配内存。对于数组,要分配一片连续内存空间。因此,要为数组a分配5个int型的内存单元,其大小为10个字节。?????ffd0a[0]ffd2a[1]ffd4a[2]ffd6a[3]ffd8a[4]ffd0a数组首地址数组地址图5.1内存单元和地址【练习】以下对一维整型数组a的正确说法是()。 A、inta(10);

B、intn=10,a[n];

C、intn; scanf("%d",&n); inta[n];

D、#defineSIZE10 inta[SIZE+10];6.1.3程序语言的基本成分D一维数组元素的引用引用格式: 数组名[下标]说明:数组下标可以是整型变量或整型表达式;数组下标从0开始,不能大于“数组长度-1”。6.1.3程序语言的基本成分【练习】若有说明:inta[10]; 则对a数组元素的正确引用是()。

A、a[10] B、a[3.5] C、a(5) D、a[10-10]D6.1.3程序语言的基本成分一维数组的初始化一般形式: 元素类型名数组名[数组长度]={元素初值类别};例如初始化所有元素inta[5]={1,2,3,4,5};inta[]={1,2,3,4,5};初始化部分元素inta[5]={1,2};

后3个元素均为06.1.3程序语言的基本成分一维数组的初始化6.1.3程序语言的基本成分intx[];x[]={1,2,3,4,5};intdata[5]=1;不能对整个数组初始化intdata[5]={1,2,3,4,5,6};元素初值数目不能多于元素数【练习】以下能对一维数组a进行正确初始化的语句是()。

A、inta[10]=(0,0,0,0,0); B、inta[10]={};

C、inta[]={0}; D、inta[10]={1,2}C6.1.3程序语言的基本成分一维数组的使用对数组的操作,只能是访问数组元素。例如:inta[5]={1,2,3,4,5},c,i;

for(i=0;i<5;i++)/*给数组元素赋值*/scanf("%d",&a[i]);for(i=0;i<5;i++)/*输出数组元素值*/ printf("%d",a[i]);a[4]=a[0]+a[3]*a[2];c=a[0]+a[4]>0&&a[1]||a[2];c=a[5]+a[6]; c=a[-1]*a[2];6.1.3程序语言的基本成分/*下标越界*/一维数组的使用不能对数组名进行操作,但数组名可作为函数的实参。例如:inta[5],b[5]={1,2,3,4,5};a=b;/*错误!数组名是存放数组首地址的,不能对首地址进行修改*/printf("%x\n",a);/*正确!输出十六进制的数组首地址*/6.1.3程序语言的基本成分二维数组的定义定义格式:

元素类型名数组名[行数][列数];例如:

inta[5][3]; 整型数组a有5行3列,共15个数组元素。6.1.3程序语言的基本成分二维数组的初始化6.1.3程序语言的基本成分inta[3][2]={{5,6},{7,8},{9,10}};

/*按行分段初始化*/inta[3][2]={5,6,7,8,9,10};

/*按行连续初始化*/思考:初始化的结果是否相同?inta[3][2]={{5},{7},{9}};

/*按行分段初始化*/inta[3][2]={5,7,9};

/*按行连续初始化*/思考:初始化的结果是否相同?相同不同!字符数组C语言无字符串数据类型,而是用字符数组表示,并以'\0'结束。字符数组就是定义一个字符类型的数组。定义格式:

char数组名[数组长度]={元素初值列表};6.1.3程序语言的基本成分字符数组初始化元素初值列表给出的字符数小于定义的数组长度时,补'\0'。chara[10]={'g','o','o','d'};charb[10]="good";不定义数组长度charc[]={'g','o','o','d'};数组长度为4,即{}中的字符数。chard[]="good";数组长度为5,系统自动加'\0'。6.1.3程序语言的基本成分【练习】1、以下对字符数组str赋值,不合法的是()。 A、charstr[]="Beijing"; B、charstr[20]={"Beijing"}; C、charstr[20];str="Beijing"; D、charstr[20]={'B','e','i','j','i','n','g'};C6.1.3程序语言的基本成分【练习】2、若有以下语句,则正确的描述是()。

charx[]="12345"; chary[]={'1','2','3','4','5'};

A、x数组与y数组的长度相同

B、x数组长度大于y数组长度

C、x数组长度小于y数组长度

D、x数组等价于y数组B6.1.3程序语言的基本成分字符数组的输入与输出用格式符%c逐个输入和输出字符main(){chard[10];inti;for(i=0;i<10;i++)scanf("%c",&d[i]);/*不会自动加结束符'\0'*/for(i=0;i<10;i++)printf("%c",d[i]);/*不自动检测'\0'*/printf("\n");}6.1.3程序语言的基本成分字符数组的输入与输出用格式符%s整体输入字符6.1.3程序语言的基本成分#include<stdio.h>main(){charstr[50];scanf("%s",str);/*不允许在数组名前加地址符&*/printf("%s",str);}如果输入:Youareastudent.<回车>则只会将You输入到str中,且只存了4个字符:'Y'、'o'、'u'、'\0'。gets(str);字符数组的输入输出用格式符%s整体输出字符数组main(){charc[5]={'a','b','\0','c','\0'};printf("%s",c);}运行结果:ab注意:如果数组中有多个'\0'

,输出时遇到第一个'\0'即结束。6.1.3程序语言的基本成分函数定义函数定义的一般格式:返回值类型函数名(形式参数表)/*函数说明*/{ 函数体;}说明:如果定义函数时不指定返回值类型,则默认为int型。无返回值的函数的返回值类型应指定为void空类型。6.1.3程序语言的基本成分函数定义在一个函数的定义中不允许定义另一个函数,也就是不允许函数的嵌套定义,但函数可以嵌套调用。 voidprint(){ putchar('*'); voidprnline()/*错误*/{putchar('\n');}}6.1.3程序语言的基本成分函数定义在一个函数的定义中不允许定义另一个函数,也就是不允许函数的嵌套定义,但函数可以嵌套调用。

6.1.3程序语言的基本成分voidprint(){ putchar('*');voidprnline(){putchar('\n');}}voidprnline(){putchar('\n');}voidprint(){ putchar('*'); prnline();}函数声明6.1.3程序语言的基本成分#include<stdio.h>main(){inta,b;scanf("%d,%d",&a,&b);

asb(a,b);}intasb(intx,inty){intz;z=x+y;printf(“%d”,z);}intasb(intx,inty);

函数必须先说明后使用。若函数的定义在函数调用之后或位于其它文件,则在调用之前给出函数原型(即函数说明)。函数调用在C语言中将函数分为带返回值的函数和不带返回值函数两种。6.1.3程序语言的基本成分例有返回值函数

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例无返回值函数voidsx,inty){inttemp;temp=x;x=y;y=temp;}调用:intz=max(5,3);调用:swap(5,3);函数的参数传递在函数调用时,将实参的值复制给对应的形参,而不能将形参的值反传给实参。参数传递结束,实参与形参就无任何联系了。6.1.3程序语言的基本成分形参表

(inta,floatx)floatx=20.5;(10,x)实参表10?a?x20.5x20.510函数的返回值6.1.3程序语言的基本成分floatabc(intx,inty){if(x>y)

returny;else

returnx;}main(){inta,b;floatc;a=1;b=2;

c=abc(a,b);printf("%f",c);}如果函数中return语句的表达式类型与函数定义的类型不同的时候,函数的返回值类型由函数定义的类型决定。【练习】下面程序段的运行结果是()。 #include<stdio.h>

intabc(intu,intv); main() {inta=9,b=6,c;

c=abc(a,b);printf("%d\n",c);} intabc(intu,intv) {intw;while(v){w=u%v;u=v;v=w;} returnu; } A、6B、3C、2D、96.1.3程序语言的基本成分B函数的递归调用在函数的执行过程中,直接或间接地调用该函数本身,这就是函数的递归调用。C语言中允许递归调用。递归调用的执行分两个阶段完成:第一阶段是逐层调用,调用的是函数自身。第二阶段是逐层返回,返回到调用该层的位置继续执行后续操作。递归调用需要设置条件来控制何时结束递归。6.1.3程序语言的基本成分函数的递归调用voidf(){…f();}

直接递归调用6.1.3程序语言的基本成分函数的递归调用6.1.3程序语言的基本成分

a(){…b();…}

间接递

温馨提示

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

评论

0/150

提交评论