笔记来源
根据B站up: zst_2001 所教做的记录
第 2 章 程序设计语言
PS:
(1)上午题:一般占3~6分,题号分布在 20,21,22,48,49,50
(2)下午题:固定占15分
2.1 程序设计语言概述
2.1.1 程序设计语言的基本概念
2.1.1.1 低级语言和高级语言
-
低级语言:面向机器的语言,由机器语言和汇编语言组成。
(1)机器语言:计算机硬件只能识别0和1序列。缺点是为效率低、可靠性差、难维护和修改
(2) 汇编语言:汇编指令的集合。汇编指令即 ADD、SUB、MOV等,这些指令用来代替0、1序列 -
高级语言:面向各类应用的程序设计语言
(1)常见的语言:Java、C、C++、PHP、Python、C#、VB、Java等。
(2)优点:功能更强、更抽象,可提高程序设计的效率
2.1.1.2 编译程序和解释程序
-
语言处理程序
高级语言不是0、1序列,而计算机只能识别0、1序列。因此,存在一个翻译的过程:将高级语言翻译为0、1序列。担负这一任务的程序就称为“语言处理程序”。 -
“语言处理”基本的翻译方式:汇编、解释、编译
-
源程序:用某种高级语言或汇编语言编写的程序。不能直接在计算机上执行。
-
解释程序和编译程序
(1)解释程序,也称 “解释器”
执行方式:直接解释执行源程序 或 将源程序解释成中间代码,再执行
中间代码:后缀式、三元式、四元式->三地址码、树(图)**
例如:.py文件 ——> .pyc文件
脚本语言:PHP、Python、JavaScript等。(2)编译程序,也称“编译器”
执行方式:将源程序翻译为目标程序语言,直接在计算机上执行目标程序
例如: .java – .javac – .class (源程序-编译-目标程序。其中源程序和目标程序等价。源程序和解释程序不参与程序运行)
2.1.1 真题演练
- 将高级语言源程序翻译成目标程序的是(B)
A. 解释程序 B. 编译程序 C. 链接程序 D. 汇编程序
解析
A. 解释程序不生成直接的目标程序(不翻译为目标程序),两种方式:解释后直接执行或翻译为中间代码后执行。
B. 编译程序是把源程序翻译为目标程序后直接执行
D. 把汇编语言编写的源程序翻译为目标程序
-
以下关于解释程序和编译程序的叙述中,正确的是 (C)
A. 编译程序和解释程序都生成源程序的目标程序
B. 编译程序和解释程序都不生成源程序的目标程序
C. 编译程序生成源程序的目标程序,而解释程序则不然
D. 编译程序不生成源程序的目标程序,而解释程序反之 -
以下关于实现高级程序设计语言的编译和解释方式的叙述中,正确的是 (A)
A. 在编译方式下产生源程序的目标程序,在解释方式下不产生
B. 在解释方式下产生源程序的目标程序,在编译方式下不产生
C. 编译和解释方式都产生源程序的目标程序,差别是优化效率不同
D. 编译和解释方式都不产生源程序的目标程序,差别在是否优化 -
以下关于高级程序设计语言实现的编译和解释方式的叙述中,正确的是(A)
A. 编译程序不参与用户程序的运行控制,而解释程序则参与
B. 编译程序可以用高级语言编写,而解释程序只能用汇编语言编写
C. 编译方式处理源程序时不进行优化,而解释方式则进行优化
D. 编译方式不生成源程序的目标程序,而解释方式则生成
解析
B. 前对后不对。编译程序和解释程序也都能用高级语言编写
C. 前不对后对。编译方式和解释方式处理源程序时,都进行优化
D. 都不对。编译程序程序生成目标程序,而解释程序不生成
- 将高级语言源程序翻译为可在计算机上执行的形式有多种不同的方式,其中,(C)
A. 编译方式和解释方式都生成逻辑上与源程序等价的目标程序
B. 编译方式和解释方式都不生成逻辑上与源程序等价的目标程序
C. 编译方式生成逻辑上与源程序等价的目标程序,解释方式不生成
D. 解释方式生成逻辑上与源程序等价的目标程序,编译方式不生成
解析
1. 编译方式生成目标程序。源程序和目标程序等价(不过是机器能不能识别的问题(要将高级语言或汇编语言翻译成机器能识别的语言))
2. 解释方式不生成目标程序,可以直接解释执行源程序或将源程序翻译成某种中间代码后加以执行。因此没有等价不等价一说
2.1.2 程序设计语言的基本成分
- 基本成分:数据、运算、控制和传输等
2.1.2.1 程序设计语言的数据成分
- 常量和变量:程序运行时数据的值是否能改变
- 全局量和中间量:数据在程序代码中的作用范围(作用域)
- 数据类型:基本类型、用户定义类型、构造类型及其他
(1)基本类型:整型(int)、字符型(char)、实型(float/double)、布尔型(bool)
2.1.2.2 程序设计语言的运算成分
- 分类:算术运算、关系运算、逻辑运算
2.1.2.3 程序设计语言的控制成分
- 顺序结构
- 选择结构
- 循环结构
2.1.2.3.1 真题演练
-
程序的三种基本控制结构是 (B)
A. 过程、子程序和分程序
B. 递归、堆栈和队列
B. 顺序、选择和重复(循环)
D. 调用、返回和跳转 -
通用的高级程序设计语言一般都会提供描述数据、运算、控制和数据传输的语言成分,其中,控制包括顺序、 (A) 和循环结构。
A. 选择
B. 递归
C. 递推
D. 函数 -
许多程序设计语言规定,程序中的数据都必须具有类型,其作用不包括 (C)
A. 便于为数据合理分配存储单元
B. 便于对参与表达式计算的数据对象进行检查
C. 便于定义动态数据结构
D. 便于规定数据对象的取值范围及能够进行的运算
扩展: 参考链接
Java基本数据类型(四类八种)
(1)整型(不带小数的数字):byte、short、int、long
(2)浮点型(带小数的数字):float、double
(3)字符型(文字,单个字符):char
(4)布尔型(真和假):boolean
解析
A. 根据数据类型分配存储单元,这个存储单元是静态的,其大小及容量固定。例如
int n=1,分配时只分配 int 这个类型固定的存储单元
B. 即表达式的俩个对象是否能进行计算。例如:
数据类型相同 : int 1+ int1 √;
数据类型不同:int a=1 + Boolean b=true ×
C. 动态数据结构不会分配固定的空间,根据现有的元素动态分配地址和大小。其与类型无关,因为数据类型是固定好的
D. 以Java为例其 String int float bolean 等类型均有固定的取值大小,超过分配的最大值就会报错
- 许多程序设计语言规定,程序中的数据都必须具有类型,其作用不包括 (C)
A. 便于为数据合理分配存储单元
B. 便于对参与表达式计算的数据对象进行检查
C. 便于定义动态数据结构
D. 便于规定数据对象的取值范围及能够进行的运算 - 若一种程序设计语言规定其程序中的数据必须具有类型,则有利于_( B )_。
① 在翻译程序的过程中为数据合理分配存储单元
② 对参与表达式计算的数据对象进行检查
③ 定义和应用动态数据结构
④ 规定数据对象的取值范围及能够进行的运算
⑤ 对数据进行强制类型转换
A. ① ② ③ B.① ② ④ C. ② ④ ⑤ D. ③ ④ ⑤
解析
③ 数据类型是静态的分配,其大小和容量是固定的
⑤ 强制转换:显式转换、隐式转换。例如:
byte b = 127 和 int a = b
int a = b 隐式强制转换 √
b = (byte) a 显式强制转换 ×
原因:取值范围int 比 byte大。当int强制转为byte时 会溢出
-
某程序设计语言规定在源程序中的数据都必须具有类型,然而, (B) 并不是做出此规定的理由。
A. 为数据合理分配存储单元
B. 可以定义和使用动志数据结构
C. 可以规定数据对象的取值范围及能够进行的运算
D. 对参与表达式求值的数据对象可以进行合法性格查 -
在程序运行过程中, (C) 时涉及整型数据转换为浮点型数据的操作, (2018 年
下半年)
A. 将浮点型变量赋值给整型变量
B. 将整型常量赋值给整型变量
C. 将整型变量与浮点型变量相加
D. 将浮点型常量与浮点型变量相加
扩展:运行时,先统一数据类型,小向大看起,不会损失过大的精度
解析
A. 浮点型转为整型:double赋值给int,double的取值范围大于int,因此做了一个隐式转换。强制转为int型。
B. 未转换:int = final int (整型常量赋值给整型变量,还是整型)
C. 整型转浮点型:小的数据范围 int 向double转(类似小阶向大阶转,尾数向右移动)。
D. 未转换:double + double = double
- 以下关于变量和常量的叙述中,错误的是(B)
A. 变量的取值在程序运行过程中可以改变。常量则不行
B. 变量具有类型属性,常量则没有
C. 变量具有对应的存储单元,常量则没有
D. 可以对变量赋值,不能对常量赋值
解析
A. 变量:可以变化的值。常量:值固定,定义之后不能改变
B.变量和常量都有类型属性
C. 变量具有对应的存储单元 ;常量没有存储单元
:它分配在常量区
D. 常量已经固定,因此不能改变
- 以下关于程序设计语言的叙述中,错误的是 (C)
A. 程序设计语言的基本成分包括数据、运算、控制和传输等
B. 高级程序设计活言不依赖于具体的机器硬件
C. 程序中局部变量的值在运行时不能改变
D. 程序中常量的值在运行时不能改变
解析
B. 高级语言与机器无关
C. 局部变量:作用于某一段。如下python语言
无 global 输出的 b = 1;有 global 输出的 b = 2
-
对于逻辑表达式 “x and y or not z”,and、or、not分别是逻辑与,或、非运算,优先级从高到低为 not、and、or,and、or 为左结合,not 为右结合,若进行短路计算,则(C)
A. x 为真时,整个表达式的值即为真,不需要计算 y 和z 的值
B. x 为假时,整个表达式的值即为假,不需要计算 y 和z 的值
C. x 为真时,根据y 的值决定是否需要计算 Z 的值
D. x 为假时,根据y 的值决定是否要计算 Z 的值扩展:
(1)逻辑表达式的结果是:true 或 false
(2)左结合:从左向右执行,右结合:从右向左执行
(3)逻辑与 &:一假全假、全真才真
(4)逻辑或 ||: 一真全真、全假才假
(5)逻辑非 ! :真假取反(没短路运算)
解析
以上表达式为: “x & y || ! z”
D. x为假,则 x & y 就为假,因此不需要根据y的值计算z了,只需计算z的值即可
-
逻辑表达式求值时常采用短路计算方式。 “&&”、“l|”、“!”分别表示逻辑与、或、非运算,“&&”、“||”为左结合,“!”为右结合,优先级从高到低为“!”、“&&”、“||”,对逻辑表达式“x&&(y || !z )”进行短路计算方式求值时, ( B)_,(2016 年下)
A. x 为真,则整个表达式的值即为真,不需要计算 y 和z 的值
B. x 为假,则整个表达式的值即为假,不需要计算 y 和Z的值
C. x 为真,再根据Z的值决定是否需要计算 y 的值
D. x 为假,再根据y的值决定是否需要计算z 的值
解析
A. && : 全真才真
B. && : 一假全假
C. x为真时,根据y的值决定是否计算z
D. x为假,整个表达式都为假
- 对布尔表达式进行短路求值是指:无须对表达式中所有操作数或运算符进行计算就可确定表达式的值。对于表达式 ”a or ((c < d) and b)”, ( B) 时可进行短路计算。
A. d 为 true
B. a 为 true
C. b 为 true
D. c 为 true
扩展
优先级: && > || > !
解析
”a or ((c < d) and b)” 即 ” a || ( (c < d) && b )”。
逻辑或 || :一真全真
所以选 B
2.1.2.4 程序设计语言的传输成分
2.1.2.5 函数
- 函数定义及调用
(1)概念:描述了函数做什么和怎么做
(2)组成:函数首部和函数体
(3)形式:以 C/C++ 表示
(4) 举例
值调用:修改形参不影响实参的值
引用调用:修改形参的值同时也改变实参的值
// 值调用
int main(){
int n = 1;
f(n) // 实参,传的值为 1
count << n <<endl; // 打印结果:1
}
void f(int n){ // 接收到实参1,作为形参 1
n = 528
}
// 引用调用
int main(){
int n = 1;
f(n) // 实参,传的是一个地址 Ox1
count << n <<endl; // 528
}
void f(int &n){ // 接收到的实参是一个地址,作为形参 Ox1
n = 528 // 将528传给Ox1,这时会将内存中的数值1替换为528
}
值调用和引用调用的区别:
1. 传值调用
(1)实参可以是变量、常量和表达式;
(2)不可以实现形参和实参之间双向传递的效果;
2. 引用(地址)调用
(1)实参可以是变量,但不能是常量(值)和表达式 因为他们没地址(例如 &123 运行时会报错)
(2)可以实现形参和实参之间双向传递数据的效果,即:地址改变,则函数体的值也变。
2.1.2 真题演练
- 函数调用时,基本的参数传递方式有传值与传地址两种, (C)
A. 在传值方式下,形参将值传给实参
B. 在传值方式下,实参不能是数组元素 入
C. 在传地址方式下,形参和实参间可以实现数据的双向传递
D. 在传地址方式下,实参可以是任意的变量和表达式
A.
值调用:实参的值传给形参
B. 值调用:只要接收到的形参有值即可
C. 地址调用:传的是地址。 形参指向地址,形参变等价实参变 √
D. 地址调用:传的是地址。变量和表达式无地址,因此×
-
传值与传地址是函数调用时常采用的信息传递方式,©
A. 在传值方式下,是将形参的值传给实参
B. 在传值方式下,形参可以是任意形式的表达式
C. 在传地址方式下,是将实参的地址传给形参
D.在传地址方式下,实参可以是任意形式的表达式解析
A. 传值:实参的值传给形参
B. 传值:实参可以是任意形式的表达式
C. 地址:实参传给形参,实参和形参都指向同一地址即可实现双向地址传递
D. 错,例如 1+1 无地址,不可传 -
函数(过程) 调用时,常采用传值与传地址两种方式在实参与形参间传递信息。以下叙述中,正确的是_(D)_。
A. 在传值方式下,将形参的值传给实参,因此,形参必须是常量或变量
B. 在传值方式下,将实参的值传给形参,因此,实参必须是常量或变量
C. 在传地址方式下,将形参的地址传给实参,因此,形参必须有地址
D. 在传地址方式下,将实参的地址传给形参,因此,实参必须有地址
A. 传值:实参传给形参
B. 传值:表达式、数组元素、常量、变量等只要有值就可传
C.地址:实参的地址传给形参
,实参必须要有地址(实参无地址会报错)
- 以下关于传值调用与引用调用的叙述中,正确的是_(C )
① 在传值调用方式下,可以实现形参和实参间双向传递数据的效果
② 在传值调用方式下,实参可以是变量,也可以是常量和表达式
③ 在引用调用方式下,可以实现形参和实参间双向传递数据的效果
④ 在引用调用方式下,实参可以是变量,也可以是常量和表达式
A.① ③ B.① ④ C. ② ③ D. ② ④ - 程序运行过程中常使用参数在函数(过程)间传递信息,引用调用传递的是实参的(A)
A. 地址 B. 类型 C. 名称 D.值
④ 常量和表达式无地址,所以 ×
- 在引用调用方式下进行函数调用是将(B)
A. 实参的值传递给形参
B. 实参的地址传递给形参
C. 形参的值传递给实参
D. 形参的地址传递给实参 - 常用的函数参数传递方式有传值与传引用两种。 (C)
A. 在传值方式下,形参与实参之间互相传值
B. 在传值方式下,实参不能是变量
C. 在传引用方式下,修改形参实质上改变了实参的值
D. 在传引用方式下,实参可以是任意的变量和表达式 - 如下 ,选 B D
解析
int a = 5
int f(int r) // 引用时: f(int &r)
void t(){
int x = f(a) // 1. f(5) Ox123
count << a + x << endl // 6. 6 + 10 ; 12 + 12 = 24
int f(int r){ // 2. r = a = 5 ; r = a = Ox123,Ox123中保存的是5 引用时: f(int &r)
a = r + 1 // 3. r = 5 -> a = 6 ; r = 5 -> a = 6
r = r * 2 // 4. r = 5 -> r = 10 ; 到这里 因为r指向的是地址 由②可知r=6,所以为12
return r // 5. r = 10 ; 6
}
int main(){
t()
}
// 传值
t(int x){ // ① x= 5
int a
a = 3*x + 1 // ② a=3*5+1=16
f(x,a) // ③ f(5,16)
return a-x // 38-5=33
}
// 引用
f(int r,int &s){ // 第一个是值5,第二个是地址(执行时&s动态改变,r始终不变为5)
int x;
x= 2*s + 1;s = x + r // ④ x= 2*16+1=33;s=38=33+5
r= x-1 // r=33-1=32
return
}
// 传值
int x=1;
f(5,x) // ① f(5,1)
print(x)
// 传引用
f(int x,int &a){ // 传值(始终不变),传地址(动态改变)-> f(5,地址:地址中包含1)
x = 2*x + 1 // x = 2*5 + 1 = 11
a = a + x // a = 1 + 11 = 12
return
}
// 传值
int x=5;
f(x + 1,x) // f(6,5)
print(x) // 40
// 引用
f(int x,int &a){ // 传值,引用 即 f(6,地址 地址中存5)
x = x*x - 1 // x= 6*6 -1 = 35
a = x + a // a = 35 +5
return
}
// 传值
int x = 10
f(x,x) // f(10,10)
print(x)
// 传引用
f(int x,int &a){
x = 2*x - 1 // 2*10-1=19
a = a + x // 10 + 19 = 29
return
}
f(){
int a=5,c;
c = g(a) // g(5)
return a+c // 9+19
}
g(形参 x){ // 形参x其实就是地址,地址存的是5.因此x是动态改变的。也就是上述g(a)中的a
int m = 2
m = x * m // m = 5*2 = 10
x = m -1 // x = 10-1=9
return x + m // 9+10
}
表达式y=f(2),则
f(int x){ // x=2
int la = x+1; //la=3
g(la)
return la*x; // 引用调用 20*2;值调用 3*2
}
// 引用调用 ,传的参la=x=3
g(int &x){
x = x*x + 1 // la=x=10
return;
}
// 值调用 ,传的参la=x=3
g(int x){
x = x*x + 1 // x=10,但是la还是3
return; // la=3
}
foo(int args){
int x = 6;
hoo(args,x)
print(x)
}
hoo(int x,int &a){ // 传值args=x=5,引用x=a=6
x = x-1 // 5-1=4 传值调用
a = a * x // 6*4 = 24 引用调用 x=24
}
foo(int x){
int a=2
hoo(a,x)
print(a,x)
}
hoo(int &x,int y){ // 引用 a=x=2,值x=y=5
y = y + 10 // y=15
x = y - x // 15-2=13
return
}
2.2 语言处理程序基础
2.2.1 编译、解释程序翻译阶段
2.2.1 真题演练
- 以下关于高级语言程序的编译和解释的叙述中,正确的是 (C)
A. 编译方式下,可以省略对源程序的词法分析、语法分析
B. 解释方式下,可以省略对源程序的词法分析、语法分析
C. 编译方式下,在机器上运行的目标程序完全独立于源程序
D. 解释方式下,在机器上运行的目标程序完全独立于源程序
解析
A 和 B:编译和解释的 词法、语法、语义 这三阶段都不可省略
C. 编译:生成目标程序,且完全独立
D. 解释:不生成目标程序
- 编译和解释是实现高级程序设计语言翻译的两种基本形式。以下关于编译与解释的叙述中,正确的是 (C)
A. 在解释方式下,对源程序不进行词法分析和语法分析,直接进行语义分析
B. 在解释方式下,无需进行词法、语法和语义分析,而是直接产生源程序的目标代码
C. 在编译方式下,必须进行词法、语法和语义分析,然后再产生源程序的目标代码
D. 在编译方式下,必须先形成源程序的中间代码,然后再产生与机器对应的目标代码
解析
编译和解释方式:词法、语法、语义均不可省略
编译:可生成目标代码,可省略中间代码和代码优化
解释:只有词法、语法、语义三阶段
解析
20:略
21: 编译器生成目标程序,源程序和编译程序都不需要参与到控制当中。解释器不生成目标程序,所以会参与到运行控制,参与后程序执行速度变慢(因为也会有其他程序参与控制)。
2.2.2 符号表
- 作用:
(1)不断收集、记录和使用源程序中一些相关符号的类型和特征等信息,并将其存入符号表中
(2)记录源程序中各个字符的必要信息,以辅助语义的正确性检查和代码生成。
2.2.2 真题演练
- 编译过程中,对高级语言程序语句的翻译主要考虑声明语句和可执行语句。对声明语句,主要是将所需要的信息正确地填入合理组织的 (A) 中;对可执行语句,则是(C) (第二空了解即可)
(1)A. 符号表 B. 栈 C. 队列 D.树
(2)A. 翻译成机器代码并加以执行
B. 转换成语法树
C. 翻译成中间代码或目标代码
D. 转换成有限自动机
扩展
(1)声明语句:将语句中的符号存到符号表
(2)可执行语句:翻译成中间代码或目标代码
- 编译程序对高级语言源程序进行编译的过程中,要不断收集、记录和使用源程序中一些相关
符号
的类型
和特征
等信息,并将其存入 (A) 中。
A. 符号表
B. 动态查找表
C. 哈希表
D. 栈和队列
考点
符号表的概念
- 在对高级语言源程序进行编译或解释处理的过程中,需要不断收集、记录和使用源程序中一些
相关符号
的类型
和特征
等信息,并将其存入 (B) 中。
A. 哈希表
B. 符号表
C. 堆栈
D. 队列 - 对高级程序语言进行编详的过程中,使用 (B) 来记录源程序中各个
字符
的必要信息,以辅助
语义的正确性检查和代码
生成。
A. 决策表
B. 符号表
C. 广义表
D. 索引表
2.2.3 编译器的工作阶段
2.2.3.1 词法分析(干扰项)
- 阐述:源程序给了编译器之后,进入了词法分析
- 输入:源程序
(1)源程序可以被看作一个【多行字符串
】 - 输出:记号流
- 作用:
分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定
(1)对源程序从前到后 (从左到右) 逐个字符地扫描,从中识别出一个个“单词”符号。
(2)“单词”符号是程序设计语言的基本语法单位,如关键宁(或称保留字)、标识符、常数、运算符和分隔符(如标点符号、左右括号) 等 - 依据:语言的词法规则,即描述“单词”结构的规则。例如,对于某 PASCAI源程序中的一条声明语句和赋值语句
- 举例
2.2.3.2 语法分析
- 输入:记号流
- 输出:语法树(分析树)
- 作用:对各条语句的结构进行合法性分析;分析程序中的句子结构是否正确
(1)阐述:检查语句的结构是否正确
(2)举例:括号是否匹配、是否未定义
① 括号不匹配:let arr = [ {1,2,3}
② 未定义错误:如下 b 未定义但使用啦
int a;
b = 3
语法分析总结
(1)可以发现程序中所有的语法
错误
2.2.3.3 语义分析
- 输入: 语法树(分析树)
- 任务:分析哥语法结构的含义,检察源程序是否包含
静态语义错误
- 主要工作:进行类型分析和检查
- 举例:左右俩侧类型不匹配 会报错
(1)int a = true
(2)String a = {1,2,3}
(3)int a = “abc” + 1
语义分析总结
(1)可以在运行之前检查出静态
语义错误
(2)不能发现程序中所有的语义错误
(3)不能发现动态的语义错误
(4)动态语义错误运行时才能发现
2.2.3.4 目标代码生成
(干扰项)
- 关系:这阶段的工作
与具体的机器密切相关
- 任务:把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码
寄存器的分配处于目标代码生成阶段
阐述
(1)CPU中有寄存器,CPU访问寄存器的速度远快于访问内存的速度
(2)想尽可能多的使用寄存器存数据,但寄存器的个数有限, 因此如何分配及使用寄存器是目标代码生成时需着重考虑的
2.2.3 真题演练(一)
- 以下关于编译系统对某高级语言进行翻译的叙述中,错误的是(C)
A. 词法分析将把源程序看作一个线性字符序列进行分析
B. 语法分析阶段可以发现程序中所有的语法错误
C. 语义分析阶段可以发现程序中所有的语义错误
D. 目标代码生成阶段的工作与日标机器的体系结构相关
解析
C. 语义分析:只能发现运行程序前静态的语义错误,动态的语义错误只有在运行时才能发现
- 编译程序对 C 语言源程序进行语法分析时,可以确定 (A)
A. 变量是否定义(或声明)
B. 变量的值是否正确
C. 循环语句的执行次数
D. 循环条件是否正确
解析
A. 语法分析:能检查出程序中所有的语法错误,例如是否定义、括号是否匹配、赋值时类型是否一致
B. 语义阶段:变量的值是否正确,例如 int a = “abc”;
C. 语法分析:仅用来判断程序语句是否合法
int count = 0;
for (int; i<10;i++) { count++ }
System.out.print(count);
D. 判断不了循环条件是否正确,只检查语法是否有错
- 编详程序分析源程序的阶段依次是。(A)
A. 词法分析、语法分析、语义分析
B. 语法分析、词法分析、语义分析
C. 语义分析、语法分析、词法分析
D. 语义分析、词法分析、语法分析
解析
编译:词法、语法、语义、( 中间代码生成、代码优化)、代码生成
解释:词法、语法、语义
- 以下关于高级程序设计语言翻译的叙述中,正确的是 (D)
A. 可以先进行语法分析,再进行词法分析
B. 在语法分析阶段可以发现程序中的所有错误
C. 语义分析阶段的工作与目标机器的体系结构密切相关
D. 目标代码生成阶段的工作与目标机器的体系结构密切相关
解析
A. 词法、语法、语义 顺序不能改变
B. 语法分析:发现程序中所有的语法错误
C. 目标生成阶段与目标机器的体系结构密切相关
- 对高级语言源程序进行编译的过程可以分为多个阶段,分配寄存器的工作在 (D)阶段进行。
A. 词法分析
B. 语法分析
C. 语义分析
D. 目标代码生成
解析
寄存器的分配工作处在目标生成阶段
- 在以阶段划分的编译过程中,判断程序语句的形式是否正确属于(B) 阶段的工作。
A. 词法分析
B. 语法分析
C. 语义分析
D. 代码生成
解析
词法分析:扫描字符,识别出单词
语法分析:判断程序语句的形式,也会是结构/语法
语义分析:类型是否匹配, 例如 Int a = “abc” + 1
- 编译过程中进行的
语法分析
主要是分析 (B)
A. 源程序中的标识符是否合法
B.程序语句的结构是否合法
C. 程序语句的含义是否合法
D. 表达式的类型是否合法 - 在以阶段划分的编译器中,(B) 阶段的主要作用是分析程序中的
句子结构
是否正确。
A. 词法分析
B.语法分析
C. 语义分析
D. 代码生成
解析
A. 词法:扫描,识别出单词
B. 语法:检查语句结构是否正确
C. 语义:检查类型匹配
- 以编译方式翻译 C/C++源程序的过程中,(B) 阶段的主要任务是对各条语句的结构进行合法性分析。
A. 词法分析
B. 语法分析
C. 语义分析
D. 目标代码生成 - 在以阶段划分的编译器中, (A) 阶段的主要作用是分析构成程序的
字符
及由字符按照构造规则构成的符号是否符合程序语言的规定。
A. 词法分析
B. 语法分析
C. 语义分析
D. 代码生成
解析
A. 词法:扫描并分析构成程序的字符,识别出一个个单词
B. 语法:判断语句的结构是否正确
- 将编译器的工作过程划分为词法分析,语法分析,语义分析,中间代码生成,代码优化和目标代码生成时,语法分析阶段的输入是 (A) 。若程序中的
括号不配对
,则会在(B) 阶段检查出错误。
(1) A. 记号流 B,字符流 C. 源程序 D. 分析树
(2) A. 词法分析 B.语法分析
C. 语义分析 D. 目标代码生成
解析
语法:检查括号是否配对或结尾有无分号
语义:赋值时,左右俩侧类型是否匹配
- 以编译方式翻译 C/C++源程序的过程中,类型检查在 (B) 阶段处理。
A. 词法分析
B. 语义分析
C. 语法分析
D. 目标代码生成
2.2.3.5 动态的语义错误
- 语义分析:只能检测出程序的静态语义错误,不能检测出动态的语义错误
- 动态的语义错误:要到程序运行时才能检测出来
- 举例:语法、静态的语义无错,运行时动态的语义错误
(1)除数为0
int a = 1 / 0 ;
(2)死循环
while (i < 0) { i– ; }
2.2.3 真题演练(二)
- 若 C 程序的表达式中引用了未赋初值的变量,则 (
D
) ——了解即可
A. 编译时一定会报告错误信息,该程序不能运行
B. 可以通过编译并运行,但运行时一定会报告异常
C. 可以通过编译,但链接时一定会报告错误信息而不能运行
D. 可以通过编译并运行,但运行结果不一定是期望的结果
解析
链接:点击跳转
- 以下关于程序错误的叙述中,正确的是(A)
A. 编译正确的程序必然不包含语法错误
B. 编译正确的程序必然不包含语义错误
C. 除数为 0 的错误可以在语义分析阶段检查出来
D. 除数为 0 的错误可以在语法分析阶段检查出来
解析
A. 执行顺序:语法、语义、编译。而语法分析之后,所有的错误都被检查出来了
B. 必然不包含静态的语义错误 √
C. 语义分析:只能检查出静态的语义错误,动态的只有在运行时才能检查出来
D. 语法分析:主要解释语义的结构
- 在某 C/C++程序中,整型变量 a 的值为0 且应用在表达式“c = b/a”中,则最可能发生的情形是_(D)_。
A. 编译时报告有语法错误
B. 编译时报告有逻辑错课
C. 运行时报告有语法错误
D. 运行时产生异常
解析
A. c = b/a 从语法上来说,语句的结构没问题
B. 逻辑错误在编译时不会报错
C. 运行之前会检查语法错误,如若有错在运行前就已经报错了
D. 除以0是动态的语义错误,在运行时才能产生异常
- 某程序运行时陷入死循环,则可能的原因是程序中存在 (C)
A. 词法错误
B. 语法错误
C. 动态的语义错误
D. 静态的语义错误
解析
语义分析:当运行时才能检查出动态的语义错误,例如 死循环,除数为0等情况
解析
第三行有个分号,这一行是循环体,循环体一直为空。0<100,是一个死循环
运行时动态的意义错误:死循环
静态语义错误:可在编译时检查出来
2.2.3.6 中间代码生成
- 常见的中间代码:后缀式、三地址码、三元式、四元式、树(图)等形式
- 特征:与具体的机器无关(不依赖于具体的机器);可以将不同的高级程序翻译成同一种中间代码;可跨平台
- 优点:因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性
2.2.3 真题演练(三)
- 将高级语言源程序翻译为机器语言程序的过程中常引入中间代码。以下关于中间代码的叙述中,错误的是 (D) 。
A. 不同的高级程序语言可以产生同一种中间代码
B. 使用中间代码有利于进行与机器无关的优化处理
C. 使用中间代码有利于提高编译程序的可移植性
D. 中间代码与机器语言代码在指令结构上必须一致
解析
D. 中间代码与机器语言代码在指令结构上不一定一致
- 在对程序语言进行翻译的过程中,常采用一些与之等价的中间代码表示形式。常用的中间代码表示不包括(D)
A. 树
B. 后缀式
C. 四元式
D. 正则式
解析
常见的中间代码:后缀式、三地址码、三元式、四元式、树(图)等形式
- 将高级语言程序翻译为机器语言程序的过程中,常引入中间代码,其好处是(B)
A. 有利于进行反编译处理
B. 有利于进行与机器无关的优化处理
C. 尽早发现语法错误
D. 可以简化语法和语义分析
解析
编译顺序:词法、语法、语义、中间代码生成、代码优化、生成目标程序
A. 反编译:正编译 √ 反编译是不可以的,就算有也不再中间代码生成阶段
C. 语法在中间代码生成之前,因此 ❌
D. 中间代码生成是在语法、语义分析之后,因此❌
- 将高级语言源程序翻译成机器语言程序的过程中,常引入中间代码。以下关于中间代码的叙述中,不正确的是 (D) 。
A. 中间代码不依赖于具体的机器
B. 使用中间代码可提高编译程序的可移植性
C. 中间代码可以用树或图表示
D. 中间代码可以用栈和队列表示
解析
A. 中间代码:与具体的机器无关
D. 栈和队列:线性结构
- 将高级语言源程序先转化为一种中间代码是现代编译器的常见处理方式。常用的中间代码有后缀式、(B) 、树等。
A. 前缀码
B. 三地址码
C. 符号表
D. 补码和移码 - 将高级语言源程序通过编译或解释方式进行翻译时,可以先生成与源程序等价的某种中间代码。以下关于中间代码的叙途中,正确的是 (B) 。
A. 中间代码常采用符号表来表示
B. 后缀式和三地址码是常用的中间代码
C. 对中间代码进行优化要依据运行程序的机器特性
D. 中间代码不能跨平台
2.2.4 正规式
2.2.4 真题演练
解析
A. 当 * 依次等于 0 1 1 时,结果是 ab
C. z除(ba*)外,其余 * 依次等于 1 0 1时,结果是 ab
D. 当 * 依次等于 0 1 时,结果是 a|b
解析
正规集:正规式推导出来的字符串的特点
思路:从选项着手,套用该正规式
A. 开头和结尾都是0,其余” * “分别为1 1 时式子为 101,显而易见不是0开开头和结尾的,因此❌
C. 当第一个 “ * ” 为2时,0 就出现了俩次,因此❌
D. 如下
解析
思路:找a后边没有b的情况
A. 由已知得,” * “不为0且只能取右侧 ”ab“
B. ” * “依次为 0 1,结果 = a
C. ” * “依次为 1 0 1,结果 = a
D. (a|b)* 当 ” * “为 1 时,取左侧时,结果 = a
解析
A. a 不能连续出现
B. 除仅有一个b组成之外,其余都是a开头
C. b的后边不能跟a
参考链接:点我
2.2.5 有限自动机
- 有限自动机:词法分析的一个工具,能正确识别正规集
- 分类
(1)确定的
有限自动机(DFA):对于每一个状态来说识别字符后转移的状态是唯一
的
(2)不确定的
有限自动机(NFA):对于每一个状态来说识别字符后转移的状态是不确定
的 - 阐述:
(1)初态,一个圈,必有箭头指向初态;
(2)终态,两个圈;
(3)箭头,转移状态
(4)识别:识别串,如何才合法?
只能识别0和1;必须从初态开始识别,中间不能识别失败(包括无法识别的字符),最后停留在终态,
(5)存在多个终态:一个状态既可以是初态也可以是终态 - 分类举例 :
(1)DFA
成功 :0101
,失败 :1100
(2)NFA
失败:aab
解析
- q0:既是初态也是终态
- a 既可以从 q0 转到 q0,也可以从 q0 转到 q1
- 如下 a,b表示 “a|b” ,即识别 a 或 识别 b(二选一)
- 识别成功但最后未停留在终态,不合法,因此失败
2.2.5 真题演练
解析
举反例
A. 1 或 101
B. 1 或 01
C. 1001
D. √
解析
思路:给出一个串,只要NFA能识别,那么等价的选项也要能识别
例如:a
A. ✔ B. ❌ (未停留在终态) C. ❌ (未停留在终态)) D. ✔
例如ba
A. ✔ D. ❌ (初始识别不了 b)
解析
等价:上边可以识别的字符串,选项一定也能识别
A. 当字符串未 “ 000 ” 时,排除A
B/D. 当字符串未 “ 0110 ” 时,排除B和D
解析:点我跳转
解析:点我跳转
解析:点我跳转
2.2.6上下文无关文法
2.2.6 真题演练
- 设某语言的语法规则用上下文无关文法 G= (N,T,P,S)表示,其中 N 是非终结合符号的集合,T是终结符号的集合,P 是产生式集合,S是开始符号,令V=NUT,那么符和该语言的句子是(A)
A. 从S出发推导的、仅包含T中符号的符号串
B. 从N中符号出发推导的、仅包含T中符号的符号串
C. 从S出发推导的、包含 V中符号的符号串
D. 从N中符号出发推导的、包含V 中符号的符号串
解析:
S是开始符号,T是终结符号。即 S—>P , P—>N, N—>T
A. √,最后推推导的结果只包含终结符
B. S是开始符,所以是从S出发推导的
C. V=N并T,最后面只包含终结符号,不包含其余的符号
D. 从S开始推导,仅包含T中符号的符号串
- 由某上下文无关文法 M[S]推导出某句子的分析树如下图所示,则错误的叙述是(A)
A. 该文法推导出的句子必须以“a”开头
B. acabcbdcc 是该文法推导出的一个句子
C. “S一aAcB”是该文法的一个产生式
D. a、b、c、d 属于该文法的终结符号集
解析
S为开始符,abcde为终结符号。即 S—> aAcB | Bd , A—>AaB | c , B — > bScA | 空 |b
A. ❌,S —> Bd , B — > e 最终 S—> 空d。不是以“a”开头
B. S—> aAcB —> a AaB c bScA ,如下图
C. 这里的产生式表示:S可以推出来aAcB | Bd
D. ✔,不能继续往下推了
3. 大多数程序设计语言的语法规则用(B)描述即可。
A. 正规文法
B. 上下文无关
法
C. 上下文有关法
D. 短语结构文法
4. 对于大多数通用程序设计语言,用(B)描述其语法即可。
A. 正规文法
B. 上下文无关
法
C. 上下文有关法
D. 短语结构文法
5. 乔姆斯基将文法分为4种类型,程序设计语言的大多数语法现象可用其中的(B)描述。
A. 正规文法
B. 上下文无关
法
C. 上下文有关法
D. 短语结构文法
6. 己知文法G: S –>A0 | B1,A–>S1 | 1,B –> S0 | 0,其中 S 是开始符号。从S 出发可以推导出(C)
A. 所有由 0 构成的字符串
B. 所有由 1构成的字符串
C. 某些 0 和 1 个数相等的字符串
D. 所有 0 和 1 个数不同的字符串
解析
在A和B中排除,如下实例,AB 都❌
(1)S –> A0 –>1
0
(2)S –> B1 –>0
1
在 C 和 D 中排除,如下实例 D ❌
(1)S –> A0 –> 10
(2)S –> A0 –>S1
0 –>A0
10 –> 1010
- 简单算术表达式的结构可以用下面的上下文无关文法进行描述(E 为开始符号),(B) 是符合该文法的句子。
E–> T I E+T
T–> F I T*F
F–> F I N
N–> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
A. 2 – – 3 × 4
B. 2 + – 3 × 4
C. ( 2 + 3 ) × 4
D. 2 × 4 – 3
- 程序设计语言的大多数语法现象可以用 CFG(上、下文无关文法) 表示。下面的CFG 产生式集用于描述简单算术表达式,其中+、-、× 表示加、减、乘运算,id 表示单个字母表示的变量,那么符合该文法的表达式为 (A) 。
P :
E–> E+T | E-T | T
T–> T×F | F
F–> F | id
A. a + – b – c
B. a * ( b + c )
C. a * – b + 2
D. – a / b + c
解析:
id 表示单个字母表示的变量,id可以变成 a~z 中的任意字母变量
A. √
B. 括号,一般推不出来
C. 推不出来 数字2,因为id是字母变量
D. 推不出来 / 号
2.2.7 中缀、后缀表达式转换
- 中缀式:常见的表达式,即
a ? b
例如:1+2 1-2 1*2 2/1 - 后缀式:中间代码常用的工具,运算符在最后,即
ab ?
例如:12+
12-
12×
21/
- 栈:先进后出,后进先出
- 优先级:() > × 或 ÷ > + 或 –
- 中缀式转后缀式
方法:按优先级转换(优先级相同从右向左)
举例: 1 – 2 × ( 3 + 4 ) / 5
过程:
(1) 1 – 2 ×
34+
/ 5,其中34+是一个整体,不能拆开运算,优先级相同从右向左转换
(2) 1 – 2 ×34+5/
(3) 1 –234+5/×
(4)1234+5/×-
- 后缀式转中缀式:从左往右扫描,遇到数字入栈遇到运算符就运算
举例:1234+5/×-
过程:
方法一
:栈。如下
(1)12345先入栈,如下:
(2)遇到操作符 “+”,先将 “4” 弹出,再将 “3”弹出,然后使用“+”运算;将 “ 3+4 ” 作为一个整体再入栈
(3)5入栈;遇到操作符“/”,将“3+4”作为一个整体弹出;使用“/”后,再入栈
(4)遇到“×”,先出栈计算;再入栈
(5)遇到“-”,先出栈计算;再入栈
(6)扫描完啦,转成了中缀式
1 – 2 × ( 3 + 4 ) / 5
方法二
:ab?转为a?b。如下
(1)123+4
5/×-
(2)12(3+4)/5
×-
(3)12×(3+4)/5
–
(4)1-2×(3+4)/5
2.2.8 语法树 中、后序遍历
- 根据语法树推导出中缀式、后缀式。即中序遍历得到中缀式,后序遍历得到后缀式。
- 中序遍历
(1)规则:左根右,举例如下:
(2)如上,后缀式为:1 2 3 4 + 5 / × – - 后序遍历
(1)规则:左右根
(2)过程
① 左右根:1
×
–
② “×”作为根,又可以继续往下分左右根: 12
/×
–
③ “/” 作为根,又可以继续往下分左右根:1 2+ 5
/ × –
④ “+”作为根,又可以继续往下分左右根:1 23 4
+ 5 / × –
- 示例
① 中序(左根右):x * ( 5 + y ) / a – b
/ – b
*
/ a – b
x * + / a – b
x * ( 5 + y ) / a – b
② 后序(左右根):x 5 y + * a / b –
/
b –
*
a / b –
x+
* a / b –
x 5 y + * a / b –
(2)如下图所示
① 中序(左根右):10 * 20 + 30 – 40
*
– 40
10 * + – 40
10 * (20 + 30) – 40
② 后序(左右根):10 20 30 + * 40 –
*
40 –
10 + * 40 –
10 20 30 + * 40 –
(3)如下图所示
① 中序(左根右):a * (b /c – d)
a * –
a * / – d
a * (b /c – d)
② 后序(左右根): a b c / d – *
a
-
*
a/
d – *
a b c / d – *
(4)如下图所示
① 中序(左根右):a + b – c * d
a +
*
a +-
* d
a + b – c * d
② 后序(左右根):a b c -
d * +
a * +
a- d
*+
ab c -
d * +
2.2.8 真题演练
解析
(1)逆波兰式,即 后缀式
(2)后缀式:a b ? ,反之 中缀式:a ? b。转换时,从左往右就行
(3)运算过程
① a-b cd+*
② (a-b)cd + *
③ (a-b) (c+d)*
④ (a-b)*(c+d)
解析:运算过程
① x – yc+ * 8
② x – yc+8*
③ xyc+8*-
解析: 运算过程:先算括号中的
① ab- * c + d
② ab-c * +d
③ ab-c*d+
解析:运算过程
① a+bc-
* d
② a +bc-d*
③ abc-d*+
解析
①ab-
* (c+d)
②ab-
*cd+
③ ab-cd+*
解析
①ab-
*cd+
②ab- cd+
*
解析
① a*(b+cd/
) – e
② a*bcd/+
– e
③abcd/+ *
– e
④ abcd/+* e-
解析:
由题已知:中缀式 a?b(左根右)
A. ① + * – ② (a+b) * (c-d)
B. ① +* d ② (a+(b-c)) * d
C. ① – * d ② (a-+) * d ③ (a-(b+c)) * d
D. ① a * – ② a * (+ – d) ③ a * (b+c – d)
解析
A. ① +d * ② -c+ d * ③ ab- c+ d *
B. ① +d * ② a-+ d * ③ abc – + d *
C. ① + * – ② ab+ cd – *
D. ① a + * ② a b-+ * ③ ab cd- + *
2.3 杂题选讲
- 已知某高级语言源程序 A 经编译后得到机器 C 上的目标程序 B,则(A)
A. 对 B 进行反编译,不能还原出源程序 A
B. 对 B 进行反汇编,不能得到与源程序 A 等价的汇编程序代码
C. 对 B 进行反编译,得到的是源程序 A 的变量声明和算法流程
D. 对 A 和 B 进行交叉编译,可以产生在机器 C 上运行的动态链接库
解析
编译是将高级语言源程序翻译成机器语言程序(汇编形式或机器代码形式),反编译是编译的逆过程。反编译通常不能把可执行文件还原成高级语言源代码,只能转换成功能上等价的汇编程序
- 下面关于程序语言的叙述,错误的是 (C) 。
A. 脚本语言属于动态语言,其程序结构可以在运行中改变
B. 脚本语言一般通过脚本引擎解释执行,不产生独立保存的目标程序
C. php、JavaScript 属于静态语言,其所有成分可在编译时确定
D. C 语言属于静态语言,其所有成分可在编译时确定
解析
知识:程序语言的分类
A. 脚本语言是动态语言,反之是静态语言
B. 编译器产生目标程序,解释器不产生目标程序
C. php、JavaScript脚本语言,脚本语言属于动态语言。所有成分不一定在编译时确定扩展
脚本语言都是动态语言,动态语言都是解释型语言,不管他们是否是面向对象的语言
- 以下关于 C/C++语言指针变量的叙述中,正确的是 (A)
A. 指针变量可以是全局变量也可以是局部变量
B. 必须为指针变量与指针所指向的变量分配相同大小的存储空间
C. 对指针变量进行算术运算是没有意义的
D. 指针变量必须由动态产生的数据对象来赋值
解析
变量是内存单元的抽象,用于在程序中表示数据。当变量存储的是内存单元地址时,称为指针变量,或者说指针变量指向了另一个变量。指针变量可以定义在函数或复合语句内,也可以定义在所有的函数之外,即可以是全局变量,也可以是局部变量。需要区分指针变量与指针所指向的变量,无论指针变量指向何种变量,其存储空间大小都是一样的。当指针变量指向数组中的一个元素时,对指针变量进行算术运算可以使其指向同一个数组中的其他元素。
- 若一个程序语言可以提供链表的定义和运算,则其运行时的 ()
A. 数据空间适合采用静态存储分配策略
B. 数据空间必须采用堆存储分配策略
C. 指令空间需要采用栈结构
D. 指令代码必须放入堆区
解析
链表中的结点空间需要程序员根据需要申请和释放,因此,数据空间应采用堆存储分配策略。
- 标记语言用一系列约定好的标记来对电子文档进行标记,以实现对电子文档的语义、结构及格式的定义(D)不是标记语言。
A. HTML
B. XML
C. WML
D. PHP
解析
A. HTML 超文本标记语言
B. XML 可扩展的标记语言
C. WML 是XML的子集
D. PHP 是一种在服务器端执行、嵌入HTML文档的脚本语言
,适合做动态网页的
- 以下关于可视化程序设计的叙述中,
错误
的是(A)
A. 可视化程序设计使开发应用程序无需编写程序代码
B. 可视化程序设计基于面向对象的思想,引入了控件和事件驱动
C. 在可视化程序设计中,构造应用程序界面就像搭积木
D. 在可视化程序设计中,采用解释方式可随时查看程序的运行效果
解析
(1)可视化程序设计是以“所见即所得”的编程思想为原则,力图实现编程工作的可视化,即随时可以看到结果,程序与结果的调整同步。
(2)与传统的编程方式相比,“可视化程序设计”仅通过直观的操作方式即可完成界面的设计工作。
(3)可视化程序设计语言的特点主要表现在两个方面:一是基于面向对象的思想,引入了控件的概念和事件驱动:二是程序开发过程一般遵循以下步骤,即先进行界面的绘制工作,再基于事件编写程序代码,以响应鼠标、键盘的各种动作。
(4)可视化程序设计最大的优点是设计人员可以不用编写或只需编写很少的程序代码,就能完成应用程序的设计,这样就能极大地提高设计人员的工作效率。
- 以下关于汇编语言的叙述中,错误的是(B)
A. 汇编语言源程序中的指令语句将被翻译成机器代码
B. 汇编程序先将源程序中的伪指令翻译成机器代码,然后再翻译指令语句。
C. 汇编程序以汇编语言源程序为输入,以机器语言表示的目标程序为输出
D. 汇编语言的指令语句必须具有操作码字段,可以没有操作数字段
解析
A. 计算机只能识别0和1,所以汇编语言源程序中的每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码)。
B.汇编程序
直接将伪指令翻译为机器代码
即可。不需要再把机器代码翻译指令语句。
C. 汇编程序主要讲汇编语言翻译成机器能识别的机器代码 0和1
D. 操作数可以为0,但操作码不能少,如下
- 可用于编写独立程序和快速脚本的语言是(A)
A. Python
B. Prolog
C. Java
D. C#
解析:考察的是程序语言基础知识。
脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言,通常以文本(如ASCII)保存,只在被调用时进行解释或编译。
A. Python 是一种脚本语言。
C. Java 面向对象
D. C# 面向对象
- 在对高级语言源程序进行编译的过程中,为源程序中变量所分配的存储单元的地址属于(A)
A. 逻辑地址
B. 物理地址
C. 接口地址
D. 线性地址
解析
编译过程中为变量分配
存储单元所用的地址是逻辑地址
,程序运行
时再映射为物理地址
。
- 弱类型语言(动态类型语言) 是指不需要进行变量/对象类型声明的语言(C)属于弱类型语言。
A. Java
B. C/C++
C. Python
D. C#
解析
(1)弱类型指的是语言类型系统的类型检查的严格程度,动态类型和静态类型则指变量与类型的绑定方法。
(2)静态类型指编译器在编译源程序期间执行类型检查,动态类型指编译器(虚拟机)在程序运行时执行类型检查。简单地说,在声明了一个变量之后,不能改变其类型的语是静态语言;能够随时改变其类型的语言,是动态语言。
(3)弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等
- 以下程序设计语言中, (C) 更适合用来进行动态网页处理。
A. HTML
B. LISP
C. PHP
D. JAVA/C++
解析
(1)网页文件本身是一种文本文件,通过在其中添加标记符,可以告诉浏览器如何显示其中的内容。HTML 是超文本标记语言,超文本是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
(2)PHP(超文本预处理器)是一种通用开源脚本语言,它将程序嵌入到 HTML 文档中去执行,从而产生动态网页。
- C 程序(C语言)中全局变量的存储空间在 (B) 分配。
A. 代码区
B. 静态数据区
C. 栈区
D. 堆区
解析
程序运行时的用户内存空间一般划分为代码区、静态数据区、栈区和堆区,其中栈区和堆区也称为动态数据区。全局变量的存储空间在静态数据区。
- 递归下降分析方法是一种 (B) 方法
A. 自底向上的语法分析
B. 自上而下的语法分析
C. 自底向上的词法分析
D. 自上而下的词法分析
解析
(1)程序设计语言语法规则:上下文无关文法
(2)根据产生语法树的方向,分为自底向上和自顶向下俩类
① 自顶向下分析法:递归下降分析法和预测分析法
② 自底向上语法分析法:算法优先分析法和LR分析法
如上, C.D都应该是语法分析。
- 以下关于脚本语言的叙述中,正确的是(C)
A. 脚本语言是通用的程序设计语言
B. 脚本语言更适合应用在系统级程序开发中
C. 脚本语言主要采用解释方式实现
D. 脚本语言中不能定义函数和调用函数
解析
A. 脚本语言 不是 通用的程序设计语言
B. C语言更适合应用在系统级程序开发中
C. 解释器专门翻译脚本语言
D. 脚本语言可以定义和调用函数
扩展
脚本语言定义为“为了缩短传统的编写——编译——链接——运行过程而创建的计算机编程语言”
- 移进一归约分析法是编译程序 或解释程序) 对高级语言源程序进行语法分析的一种方法,属于(B)的语法分析方法。
A. 自顶向下(或自上而下)
B. 自底向上(或自下而上)
C. 自左向右
D. 自右向左
解析
(1)语法分析方法分为两类:自上而下(自顶向下) 分析法和自下而上(自底向上) 分析法,
(2)递归下降分析法和预测分析法属于自上而下分析法,移进-归约分析法属于自下而上(自底向上) 分析法。
- 在高级语言源程序中,常需要用户定义的标识符为程序中的对象命名,常见的命名对象有(B)
① 关键字(或保留字) ② 变量 ③ 函数 ④ 数据类型 ⑤ 注释
A. ① ② ③
B. ② ③ ④
C. ① ③ ⑤
D. ② ④ ⑤
解析
在源程序中,可由用户(程序员) 为变量、函数和数据类型等命名
- 更适合用来开发操作系统的编程语言是(A)
A. C/C++
B. Java
C. Python
D. JavaScript
解析
(1)C/C++是编译型程序设计语言,常用于进行系统级软件的开发。
(2)Java、Python 和 JavaScript 都是解释型本程序设计语言,其中 Python 和 JavaScript是脚本语言。
- 以下关于程序设计语言的叙述中,不正确的是(A)。
A. 脚本语言中不使用变量和函数
B. 标记语言常用于描述格式化和链接
C. 脚本语言采用解释方式实现
D. 编译型语言的执行效率更高
解析
用脚本语言编程时也会使用变量以及定义和调用函数
- (A)是一种函数式编程语言。
A. Lisp
B. Prolog
C. Python
D. Java/C++
解析:程序设计语言知识分类
A. Lisp函数式编程语言
B. Prolog编程式语言
C. Python支持过程式编程语言也支持面向对象编程语言
D. Java/C++面象对象的编程语言
- 语法制导翻译是一种()方法
解析:程序语言基础知识
程序语言翻译过程中,词法分析和语法分析都是对程序的结构进行分析,有相应的算法,而语义分析比较复杂。语法分析分为自上而下和自下而上两类分析方法,递归下降分析法和预测分析法属于自上而下的分析方法,算符优先分析法和 LR 分析法属于自下而上的语法分析方法。有多种语义分析方法,语法制导翻译是一种静态语义分析方法(编译过程中的语义分析都是静态语义,运行时才有动态语义)。
- 计算机执行程序时,内存分为静态数据区、代码区、栈区和堆区。其中(C)一般在进行函数调用和返回时由系统进行控制和管理, (D) 由用户在程序中根据需要申请和释放。
A. 静态数据域
B. 代码区
C. 栈区
D. 堆区 - 用C/C++语言为某个应用编写的程序,经过(A)后形成可执行程序。
A. 预处理、编译、汇编、链接
B. 编译、预处理、汇编、链接
C. 汇编、预处理、链接、编译
D. 链接、预处理、编译、汇编 - Java 语言符合的特征有 (A) 和自动的垃圾回收处理。
① 采用即时编译
② 采用静态优化编译
③ 对象在堆空间分配
④ 对象在栈空间分配
A. ① ③
B. ① ④
C. ② ③
D. ② ④ - Python 语盲的特点不包括 (B)
A. 跨平台、开源
B. 编译型
C. 支持面向对象程序设计
D. 动态编程 - 在 Python 语言中(C)是一种可变的、有序的序列结构,其中元素可以重复。
A. 元组 (tuptle)
B. 字符串 (str)
C. 列表 (list)
D. 集合 (set) - 在 Python 语言的模块中,(B) 不支持深度学习模型。
A. TensorFlow
B. Matplotlib
C. PyTorch
D. Keras
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/194997.html