1、软件设计师-程序语言基础知识及答案解析(总分:32.00,做题时间:90 分钟)1.C 程序代码“while(c=getchar()!=a)putchar(c);”中存在_错误。(分数:1.00)A.调用B.语法C.逻辑D.运行图 7-17 是一有穷自动机的状态转换图,该自动机所识别语言的特点是 (1) ,等价的正规式为 (2) 。(分数:2.00)A.由符号 a、b 构成且包含偶数个 a 的串B.由符号 a、b 构成且开头和结尾符号都为 a 的串C.由符号 a、b 构成的任意串D.由符号 a、b 构成且 b 的前后必须为 a 的串A.(a|b)*(aa)*B.a(a|b)*aC.(a|b)*
2、D.a(ba)*a2.若有 C 语言语句“char r1=“abcd“,r2=a,b,c,d”,则下列说法正确的是_。(分数:1.00)A.数组 r1 和数组 r2 存放相同的字符串B.数组 r1 和数组 r2 的长度相同C.数组 r1 的长度小于数组 r2 的长度D.数组 r1 的长度大于数组 r2 的长度3.关于编译程序进行词法分析的说法中,不正确的是_。(分数:1.00)A.词法分析主要是扫描源程序并识别记号,指出出错行号B.词法分析阶段过滤掉了源程序中的注释C.词法分析阶段单词间的空白被过滤掉了D.词法分析阶段对制表或回车换行字符不作处理4.在 C 语言中,可以用 typedef 声明
3、新的类型名来代替已有的类型名,比如有学生链表结点:typedef struct nodeint data;struct node * link;NODE, * LinkList;下述说法正确的是_。(分数:1.00)A.NODE 是结构体 struct node 的别名B.* LinkList 也是结构体 struct node 的别名C.LinkList 也是结构体 struct node 的别名D.LinkList 等价于 node*5.高级程序设计语言中用于描述程序中的运算步骤、控制结构及数据传输的是_。(分数:1.00)A.语句B.语义C.语用D.语法函数 f()、g()的定义如下所示
4、,调用函数 f 时传递给形参 x 的值为 5,若采用传值(call by value)方式调用 g(a),则函数 f 的返回值为 (1) ;若采用传引用(call by reference)方式调用 g(a),则函数 f 的返回值为 (2) 。(分数:2.00)A.14B.16C.17D.22A.15B.18C.22D.246.在 C 语言中,main()函数可以带两个形参 argc 和 argv,其中 argv 可以定义为_。(分数:1.00)A.int argv;B.char*argy;C.char argv;D.char*argv;7.C+语言兼容 C 语言,因此,_。(分数:1.00)
5、A.C+的关键字与 C 语言的关键字完全相同B.C+的数据类型与 C 语言的数据类型完全相同C.CA+编译器能编译 c 语言程序D.C+编译器能把 C 语言程序翻译成 C+程序考查下列文法:G(VT,V N,E,P)其中:V T=+,*,(,),i);V N=E,T,F;E 是开始符号;P 为:EE+T|TTT*F|FF(E)|iF*F+T 是该文法的一个句型,其中 (1) 是句柄, (2) 是素短语, (3) 是该句型的直接推导, (4) 是该句型的最左推导, (5) 是该文法的一个句子。(分数:5.00)A.FB.F*FC.F+TD.F*F+TA.FB.F*FC.F+TD.F*F+TA.F
6、*F+iB.F*F+T*FC.F*F+F*FD.i*i+TA.F*F+T*FB.F*F+TC.F*(E)+TD.(E)*F+TA.T+(i+i)B.i+(i+F)C.iD.(E)在高级程序设计语言中, (1) 可以出现在赋值符号的左边。结构化程序的基本控制结构有 (2) 。(分数:2.00)A.变量B.常量C.函数名D.过程名A.赋值、子程序调用、输入输出B.条件语句、循环语句、过程语句C.顺序语句、选择语句、循环语句D.复合、分支、重复、递归根据乔姆斯基于 20 世纪 50 年代建立的形式语言的理论体系,文法被分为 4 种类型,即 0 型(短语文法)、1 型(上下文有关文法)、2 型(上下文
7、无关文法)和 3 型(正规文法)。其中,2 型文法与 (1) 等价,所以有足够的能力描述多数现今程序设计的语言的语法结构。一个非确定的有穷自动机必存在一个与之等价的 (2) 。从文法描述语言的能力来说, (3) 最强, (4) 最弱,由 4 类文法的定义可知 (5) 必是 2 型文法。(分数:5.00)A.确定的有穷自动机B.图灵机C.非确定的下推自动机D.非确定的有穷自动机E.有穷自动机F.线性有界自动机A.确定的有穷自动机B.图灵机C.非确定的下推自动机D.非确定的有穷自动机E.有穷自动机F.线性有界自动机A.0 型文法B.1 型文法C.2 型文法D.3 型文法A.0 型文法B.1 型文法
8、C.2 型文法D.3 型文法A.0 型文法B.1 型文法C.2 型文法D.3 型文法一种最早用于科学计算的程序设计语言是 (1) ;一种提供指针和指针操作且不存在布尔类型的、应用广泛的系统程序设计语言是 (2) ;一种适合在互联网上编写程序可在不同平台上运行的面向对象程序设计语言是 (3) ;一种在解决人工智能问题上使用最多、有较强表处理功能的函数程序设计语言是 (4) ;一种以谓词逻辑为基础的,核心是事实、规则和推理机制的实用逻辑程序设计语言是 (5) 。(分数:5.00)A.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.P
9、rologJ.FortranA.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.PrologJ.FortranA.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.PrologJ.FortranA.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.PrologJ.FortranA.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.Prolo
10、gJ.Fortran8.与正规式(a|b)*等价的正规式是_。(分数:1.00)A.a*b*B.b*a*C.(a*)|(b*)D.(a*b*)*9.下面的 C 程序代码段在运行中会出现_错误。int i=0;while(i10);i=i+1;(分数:1.00)A.语法B.类型不匹配C.变量定义D.动态语义某 C 语言程序中,x 是一个浮点型变量,m 是一个值为正整数的整型常量,表达式 x%m(x 被 m 除取余数)在 (1) 时会报错,这是一种 (2) 错误。(分数:2.00)A.编译B.预处理C.编辑D.运行A.词法B.语法C.语义D.运行软件设计师-程序语言基础知识答案解析(总分:32.0
11、0,做题时间:90 分钟)1.C 程序代码“while(c=getchar()!=a)putchar(c);”中存在_错误。(分数:1.00)A.调用B.语法 C.逻辑D.运行解析:getchar()用于接收键盘输入的字符,其值为键入的字符,putchar(c)用于在屏幕显示字符,c 可以是字符类型也可以是整型变量。C 语言中,不等号“!=”的优先级高于赋值符号“=”,因此c=getchar()!=a相当于 c=(getchar()!=a),而“getchar()!=a”是个逻辑表达式,如果键入的是a,则该表达式的值为 0,否则为 1。程序代码中的错误可分为语法错误和语义错误。程序语言的语法表
12、述的是语言的形式,或者说是语言的样子和结构。程序语言还有更重要的一个方面,就是附着于语言结构上的语义。语义揭示了程序本身的含义、施加于语言结构上的限制或者要执行的动作。程序语言的语义分为静态语义和动态语义。编译时进行的是静态语义的分析,主要包括:检查语言结构的语义是否正确,即是否结构正确的句子所表示的意思也合法;执行规定的语义动作,如表达式的求值、符号表的填写、中间代码的生成等。题目中 while 后面的括号显然没有匹配,少了一个右括号,这属于一种语法错误。运行错误是指程序能运行,在运行中出现错误。该代码不能通过编译,无法运行。图 7-17 是一有穷自动机的状态转换图,该自动机所识别语言的特点
13、是 (1) ,等价的正规式为 (2) 。(分数:2.00)A.由符号 a、b 构成且包含偶数个 a 的串B.由符号 a、b 构成且开头和结尾符号都为 a 的串 C.由符号 a、b 构成的任意串D.由符号 a、b 构成且 b 的前后必须为 a 的串解析:A.(a|b)*(aa)*B.a(a|b)*a C.(a|b)*D.a(ba)*a解析:从图中可明显看出:从 0 状态输入 a 可以到达 1 状态,从 1 状态输入 a 或 b,可以回到 1 状态,同时输入 a 也可以到 2 状态。这样的过程可以用正规式 a(a|b)*a 来表达。这样的正规式的含义为:以 a 开头和结尾,中间部分由 a、b 组成
14、的串。所以此题的答案为:B,B。2.若有 C 语言语句“char r1=“abcd“,r2=a,b,c,d”,则下列说法正确的是_。(分数:1.00)A.数组 r1 和数组 r2 存放相同的字符串B.数组 r1 和数组 r2 的长度相同C.数组 r1 的长度小于数组 r2 的长度D.数组 r1 的长度大于数组 r2 的长度 解析:其实这道题所考查的知识点是大多数人在编写程序时常犯的一个错误。很多人觉得 r1 和 r2 只是赋值形式不同,其结果一致。这种想法是错误的,r1 的初值是一个字符串,所以系统会自动为其加上一个字符串结束符/0,因此 r1 的长度为 5,而 r2 的长度为 4。注意,这里
15、比较的是数组 r1 和 r2 的大小(长度),而不是存储在其中的字符串的有效长度。由于 r2 没有结束字符/0,因此 strlen(r2)输出不定,不是预期的 4,一般输出的是 8,依具体机器而定。利用 sizeof 运算符可以计算出 r1、r2 的长度,sizeof(r1)输出的是 5,sizeof(r2)则输出 4,表示r1、r2 分别占 5、4 个字节的内存空间。3.关于编译程序进行词法分析的说法中,不正确的是_。(分数:1.00)A.词法分析主要是扫描源程序并识别记号,指出出错行号B.词法分析阶段过滤掉了源程序中的注释C.词法分析阶段单词间的空白被过滤掉了D.词法分析阶段对制表或回车换
16、行字符不作处理 解析:在词法分析阶段,其任务是从左到右逐个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。这里所谓的单词,是指逻辑上紧密相连的一组字符,这些字符组合在一起才表示某一含义。比如标识符是由字母开头,后跟字母或数字组成的一种单词。保留字(关键字或基本字)也是一种单词,此外还有算符等。在词法分析阶段,空白(由单词间的空格、制表或回车换行字符引起的空白)和注释都被滤掉了。在识别保留字时,词法分析程序将每个标识符对照一张保留字表进行查询,若查着则为保留字,反之则认为是用户定义的标识符。可见,词法分析阶段是查不出拼错的保留字的。在词法分析阶段
17、,如果不符合词法规则,比如标识符不是以字母开头,就会进行错误处理,指出出错行号。从上述分析可知,D 错误。4.在 C 语言中,可以用 typedef 声明新的类型名来代替已有的类型名,比如有学生链表结点:typedef struct nodeint data;struct node * link;NODE, * LinkList;下述说法正确的是_。(分数:1.00)A.NODE 是结构体 struct node 的别名 B.* LinkList 也是结构体 struct node 的别名C.LinkList 也是结构体 struct node 的别名D.LinkList 等价于 node*解
18、析:其实题中的定义相当于下述两个定义:typedef struct nodeint data;struct node*link;NODE;typedef struct nodeint data;struct node*link;)*LinkList;前者给 struct node 取了个新名字 NODE,即 struct node 和 NODE 是等价的;后者把 struct node*命名为LinkList。5.高级程序设计语言中用于描述程序中的运算步骤、控制结构及数据传输的是_。(分数:1.00)A.语句 B.语义C.语用D.语法解析:高级程序设计语言中用于描述程序中的运算步骤、控制结构及
19、数据传输的是语句,例如 for 语句、switch 语句。程序设计语言的语法指的是该语言中的语句、声明及其他语言结构的书写规范或规则,例如 C 语言中一个完整的语句后面不得遗漏分号。语义指的是语法结构的含义。一般地,在程序语言手册中,先给出各种语句结构的语法,然后给出该结构的语义以描述其内在含义。语用是程序语言与其使用之间的关系,通俗地说就是如何使用程序语言。函数 f()、g()的定义如下所示,调用函数 f 时传递给形参 x 的值为 5,若采用传值(call by value)方式调用 g(a),则函数 f 的返回值为 (1) ;若采用传引用(call by reference)方式调用 g(
20、a),则函数 f 的返回值为 (2) 。(分数:2.00)A.14 B.16C.17D.22解析:A.15B.18C.22 D.24解析:在传值调用方式中,被调用函数的形参得到实参值的一份拷贝,在被调用函数内修改形参不影响实参。而在传引用调用方式中,被调用函数得到的是实参本身(地址和值),在被调用函数中修改其形参其实就是修改实参本身,因此会影响实参的值。调用函数 f 时传递给形参 x 的值为 5,若采用传值方式调用 g(a),对实参 a 不产生任何影响,在执行完“int a=2*x-1”之后,a 的值为 9,执行“g(a);”之后,a 的值仍为 9,所以函数 f 的返回值为9+5=14。若采用
21、传引用方式调用 g(a),则“int a=2*x-1”执行完之后,a 的值为 9,然后控制转入到 g(int y)中,在 g(int y)中对 y 的修改其实就是修改 a。在 g(int y)中传递过来的形参值为 9,执行“x=y-1”之后,x 的值为 8,接着执行“y=x+y”之后,y 的值就变为 17,反映到实参 a 中就使得 f(int x)中的 a 也为17,因此,这种情况下,函数 f 的返回值为 17+5=22。6.在 C 语言中,main()函数可以带两个形参 argc 和 argv,其中 argv 可以定义为_。(分数:1.00)A.int argv;B.char*argy; C
22、.char argv;D.char*argv;解析:在 C 语言中,main()函数可以带两个形参 argc 和 argv,其中 argc 存储参数个数,argv 存储参数表。它们的定义格式是:main(int argc,char*argv)。7.C+语言兼容 C 语言,因此,_。(分数:1.00)A.C+的关键字与 C 语言的关键字完全相同B.C+的数据类型与 C 语言的数据类型完全相同C.CA+编译器能编译 c 语言程序 D.C+编译器能把 C 语言程序翻译成 C+程序解析:C+由 C 语言发展而来,C+在 C 语言的基础上扩展了面向对象部分。C+的关键字与 C 语言的关键字不完全相同,C
23、+扩展了新的关键字,如关键字 new、const,C 语言中就没有 new、const;C+的数据类型与 C 语言的数据类型也不完全相同,如 C+中有逻辑布尔型 bool、类类型class,而 C 中没有。显然,C+编译器能编译 C 语言程序,但反之则不一定行。考查下列文法:G(VT,V N,E,P)其中:V T=+,*,(,),i);V N=E,T,F;E 是开始符号;P 为:EE+T|TTT*F|FF(E)|iF*F+T 是该文法的一个句型,其中 (1) 是句柄, (2) 是素短语, (3) 是该句型的直接推导, (4) 是该句型的最左推导, (5) 是该文法的一个句子。(分数:5.00)
24、A.F B.F*FC.F+TD.F*F+T解析:A.FB.F*F C.F+TD.F*F+T解析:A.F*F+iB.F*F+T*F C.F*F+F*FD.i*i+T解析:A.F*F+T*FB.F*F+TC.F*(E)+TD.(E)*F+T 解析:A.T+(i+i)B.i+(i+F)C.i D.(E)解析:句型 F*F+T 的推导过程如下:E*E+T*T+T*T*F+T*F*F+T,因为 E*T*F+T,E*F*F+T,TF,所以 F 是句型 F*F+T 相对于产生式 TF 的直接短语,又因为它是该句型的最左直接短语,所以 F 是该句型的句柄。同理,可分析出句型 F*F+T 的短语有 F、F*F、
25、F*F+T。由于素短语中至少应含有一个终结符,因此 F 不是素短语;由于 F*F+T 中包含了短语 F*F,因此它也不是素短语。所以该句型的素短语是 F*F。因为句型 F*F+T*F*F+T*F,所以 F*F+T*F 是该句型的直接推导。而 F*F+I、F*F+F*F 和 i*i+T 都不能由句型 F*F+T 直接推导出来。由于最左推导是对句型右部的最左非终结符进行推导,因此在第(4)空的选择答案中只有(E)*F+T 满足此条件。因为句子是仅含终结符的句型,所以第(5)空的选择答案中只有 i 有可能是句子,而 E*T*F*i,所以 i 是该文法的一个句子。在高级程序设计语言中, (1) 可以出
26、现在赋值符号的左边。结构化程序的基本控制结构有 (2) 。(分数:2.00)A.变量 B.常量C.函数名D.过程名解析:A.赋值、子程序调用、输入输出B.条件语句、循环语句、过程语句C.顺序语句、选择语句、循环语句 D.复合、分支、重复、递归解析:在高级程序设计语言中,变量可以出现在赋值符号的左边,称为左值。结构化程序有三种基本控制结构:顺序结构、选择(分支)结构和循环结构。任何结构化程序都可由这三者组成。根据乔姆斯基于 20 世纪 50 年代建立的形式语言的理论体系,文法被分为 4 种类型,即 0 型(短语文法)、1 型(上下文有关文法)、2 型(上下文无关文法)和 3 型(正规文法)。其中
27、,2 型文法与 (1) 等价,所以有足够的能力描述多数现今程序设计的语言的语法结构。一个非确定的有穷自动机必存在一个与之等价的 (2) 。从文法描述语言的能力来说, (3) 最强, (4) 最弱,由 4 类文法的定义可知 (5) 必是 2 型文法。(分数:5.00)A.确定的有穷自动机B.图灵机C.非确定的下推自动机 D.非确定的有穷自动机E.有穷自动机F.线性有界自动机解析:A.确定的有穷自动机 B.图灵机C.非确定的下推自动机D.非确定的有穷自动机E.有穷自动机F.线性有界自动机解析:A.0 型文法 B.1 型文法C.2 型文法D.3 型文法解析:A.0 型文法B.1 型文法C.2 型文法
28、D.3 型文法 解析:A.0 型文法B.1 型文法C.2 型文法D.3 型文法 解析:乔姆斯基把文法分成四种类型,即 0 型、1 型、2 型和 3 型。0 型文法也称短语文法,其能力相当于图灵(Turing)机,或者说任何 0 型语法都是递归可枚举的。1 型文法也称上下文有关方法,其能力相当于线性有界自动机。2 型文法也称上下文无关文法,其能力相当于非确定的下推自动机。3 型文法也称为线性文法,由于这种文法等价于正规式,因此也称为正规文法。3 型文法的能力相当于有穷自动机。自动机分为确定的自动机和非确定的自动机,一个非确定的自动机一定可以转化为一个与之等价的确定的自动机。0、1、2、3 型文法
29、是逐渐增加限制的,因此,0、1、2、3 型文法描述语言的能力依次递减。也正因为此,每一种 3 型文法也一定是 2、1、0 型文法,每一种 2 型文法也一定是 1、0 型文法,每一种 1 型文法也一定是 0 型文法。一种最早用于科学计算的程序设计语言是 (1) ;一种提供指针和指针操作且不存在布尔类型的、应用广泛的系统程序设计语言是 (2) ;一种适合在互联网上编写程序可在不同平台上运行的面向对象程序设计语言是 (3) ;一种在解决人工智能问题上使用最多、有较强表处理功能的函数程序设计语言是 (4) ;一种以谓词逻辑为基础的,核心是事实、规则和推理机制的实用逻辑程序设计语言是 (5) 。(分数:
30、5.00)A.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.PrologJ.Fortran 解析:A.PascalB.AdaC.SmalltalkD.SnobolE.C F.Alogo 68G.JavaH.LispI.PrologJ.Fortran解析:A.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.Java H.LispI.PrologJ.Fortran解析:A.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.Lisp I.P
31、rologJ.Fortran解析:A.PascalB.AdaC.SmalltalkD.SnobolE.CF.Alogo 68G.JavaH.LispI.Prolog J.Fortran解析:Fortran 是第一种被用于科学计算的高级语言,它出现于 20 世纪 50 年代中期,主要用于科学计算。Alogo 68 是另一种早期研制出来的高级语言,虽然没有被广泛使用,但其对后来的程序设计语言的发展有着重大影响。C 语言是目前应用最广泛的系统程序设计语言,它提供了指针与指针操作,且不存在布尔类型。C 语言还可提供很多底层系统调用,与硬件结合紧密,适用于编写系统软件。Java 语言是适应 Intern
32、et 发展的需要而产生的通用网络程序设计语言,它提供了更好的网络安全性和平台无关性,并且采用了面向对象的原理,便于扩展,适合在互联网上编写可在不同平台上运行的面向对象程序设计语言。Prolog 语言在人工智能领域应用较广泛,是一种以谓词逻辑为基础,借助于推理规则,从已有事实推出新的事实的实用的逻辑程序设计语言。Ada 和 Smalltalk 两种语言引入了一定的封装机制,实现了信息隐藏。Ada 的主要封装机制为程序包;Smalltalk 是一种纯面向对象的程序设计语言,它侧重于动态链接,不进行任何的类型检查,并且类和对象之间没有明显区别。Snobol 于 1962 年由贝尔实验室开发,它主要的
33、操作为字符串操作。该语言一般不作为通用语言使用,而是作为一种研究工具,用于对文艺作品、音乐等进行分析。Lisp 是一种在解决人工智能问题上使用最多、有较强表处理功能的函数程序设计语言。8.与正规式(a|b)*等价的正规式是_。(分数:1.00)A.a*b*B.b*a*C.(a*)|(b*)D.(a*b*)* 解析:如果两个正规式对应的正规集相同,那么它们是等价的。正规式(a|b)*对应的正规集为,a,b,aa,ab,所有由 a 和 b 组成的字符串,a*b*、b*a*、(a*)|(b*)对应的正规集都是其真子集,因此不可能等价。根据正规式代数运算法则,(a|b)*=(a*b*)*,注意,括号外
34、的“*”是必需的!9.下面的 C 程序代码段在运行中会出现_错误。int i=0;while(i10);i=i+1;(分数:1.00)A.语法B.类型不匹配C.变量定义D.动态语义 解析:这道题实际上是考 while 的循环体和空语句。若 while 的循环体只有一条语句,则可以不用花括号括起来,如果有多条就要用花括号括起来,表示这几条语句合起来是 while 的循环体。空语句指的是只有一个分号的语句“;”,该语句什么事都不做。程序语言中的错误一般分为语法错误、逻辑错误。语法错误指的是语句违反了形式规定而造成的错误,在这种情况下,不能通过编译而运行,编译器一般会给出错误信息并指出错误所在的行;
35、逻辑错误指的是程序含义上的错误,出现了逻辑混乱。逻辑错误经常在运行中才体现出来,称为动态语义错误。从题中“while(i10);”可看出,while 用一条空语句做循环体,没有循环终止条件,因此进入死循环,这是一种运行中出现的逻辑错误,为动态语义错误。题中将赋值语句“i=i+1;”用花括号括起来,引诱考生误将“i=i+1;)”看成 while 的循环体,这其实是“烟幕弹”。某 C 语言程序中,x 是一个浮点型变量,m 是一个值为正整数的整型常量,表达式 x%m(x 被 m 除取余数)在 (1) 时会报错,这是一种 (2) 错误。(分数:2.00)A.编译 B.预处理C.编辑D.运行解析:A.词
36、法B.语法C.语义 D.运行解析:动手编过 C 语言程序的人都知道在 x%m 中,要求 x、m 都为整数,若 x 为浮点型,在 TC 中编译时会报错“Illegal use of floating point”,所以根本不能运行。ANSI C 标准规定可以在 C 语言源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。这些预处理命令是由 ANSI C 统一规定的,但是它并非 C 语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常所说的编译(包括词法语法分析、代码生成及优化等)之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对
37、程序作相应的处理。C 语言提供的预处理功能主要有三种:宏定义(# define)、文件包含(# include)和条件编译(# ifdef# else# endif)。在编译过程的词法分析阶段,编译程序从左到右一个字符一个字符地读入源文件,对构成源文件的字符流进行扫描和分解,识别出一个个具有具体含义的单词,即逻辑上紧密相连的字符串。在此阶段查出的错误称为词法错误,比如,当读入 while 保留字时,源文件中写成了 while,错把 i 写成了 1。接下来是语法分析阶段,它是在词法分析的基础上将单词序列分解成各类语法短语,如分解出 ifelse语句、赋值语句等。在此阶段查出的错误属于语法错误。程
38、序代码中的错误可分为语法错误和语义错误。程序语言的语法表述的是语言的形式,或者说是语言的样子和结构。程序语言还有更重要的一个方面,就是附着于语言结构上的语义。语义揭示了程序本身的含义、施加于语言结构上的限制或者要执行的动作。程序语言的语义分为静态语义和动态语义。编译时进行的是静态语义的分析,主要包括:检查语言结构的语义是否正确,即是否结构正确的句子所表示的意思也合法;执行规定的语义动作,如表达式的求值、符号表的填写、中间代码的生成等。整除取余运算符“%”的有效运算对象是两个整数。在形式上,只要“%”的两个运算对象存在,其语法就是正确的;在语义上,“%”的运算对象中有浮点数则不符合整除取余运算的含义。因此,这是运算对象与运算符的类型不匹配错误,属于静态语义错误,在编译阶段可以发现该错误。运行错误指程序在运行过程中出现的错误。例如:int a,b,c;scanf(“%d%d“,c=b/a;printf(“c=%d/n“,c);程序没有错,能运行,但是如果输入 a 的值为 0,就会出现错误,在 TC 中会在屏幕上报错:Divide error。通过上面详细的分析,答案一目了然,分别选 A、C。