编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018

Size: px
Start display at page:

Download "编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018"

Transcription

1 编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018

2 什么叫语法制导的翻译 求表达式的值 id 1 + id 2 *id * 5 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 id 2 id 3 四者的语义相同 对于计算机执行的指令流 : E 1 = id 1 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 * + E 4 对于计算器的计算结果 : 19

3 源程序 中间代码 求表达式的值 id 1 + id 2 *id * 5 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 id 2 id 3 对于计算机执行的指令流 : E 1 = id 1 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 * + E 4 对于计算器的计算结果 : 19 源程序是语句流, 中间代码是指令流, 都是线性结构

4 中间代码形式 源程序 高级中间表示形式 低级中间表现形式 目标代码 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 + * E 1 = id 1 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 * + E 4 id 2 id 3 id 1 id 1 id 1 语法分析树 抽象语法树 三地址码

5 中间代码形式 有向无环图 DAG DAG(directed acyclic graph) 表达式 a + a * (b - c) + (b - c ) * d 的 DAG: + + * a * - d b c

6 中间代码形式 有向无环图 DAG 表达式 a + a * (b - c) + (b - c ) * d * * * a * - d - b c a b c c DAG 抽象语法树

7 生成抽象语法树的 SDD 产生式 1)E E 1 + T 2)E T 3)T T 1 * F 4)T F 5)F (E) 6)F id 语义规则 E.node = new Node('+', E 1.node, T.node) E.node =T.node E.node = new Node('*', T 1.node, F.node) T.node = F.node F.node = E.node F.node = new Leaf(id, id.entry)

8 生成 DAG 的 SDD 产生式 1)E E 1 + T 2)E T 3)T T 1 * F 4)T F 5)F (E) 6)F id 语义规则 E.node = gennode('+', E 1.node, T.node) E.node =T.node E.node = gennode('*', T 1.node, F.node) T.node = F.node F.node = E.node F.node = gen Leaf(id, id.entry) gennode((op, leftnode, right_node) { node = getnode(op, leftnode, right_node); if (node == null ) then return new Node(op, leftnode, right_node); else return node; } 差异何在?

9 6.2 三地址代码 一个运算符, 两个运算分量, 一个运算结果 ; x=y op z 运算分量 : 名字 : 用源程序中名字作为三地址代码的地址 常量 : 源程序中出现的 ; 编译器生成的临时变量 ;

10 三地址代码 (2) 指令 (1) 运算 / 赋值指令 :x=y op z, 或者 x=op y 复制指令 :x = y 无条件转移指令 :goto L 条件转移指令 :if x goto L if False x goto L 条件转移指令 :if x relop y goto L

11 三地址代码 (3) 过程调用 / 返回 : param x1 // 传递参数 param x2 param xn call p, n // 调用子过程 p,n 为参数个数 带下标的复制指令 :x=y[i] x[i] = y 注意 :i 表示离开数组位置第 i 个字节, 而不是数组的第 i 个元素 地址 / 指针赋值指令 : x=&y, x=*y, *x=y

12 三地址码例子 语句 : do i = i + 1; while (a[i]<v); 符号表 L: t 1 = i + 1 i = t 1 t 2 = i * 8 t 3 = a[t 2 ] IF t 3 < v GOTO L id name type size 0 i integer 4 1 a float(6, integer) 2 v integer 4 3 t1 integer 4 4 t2 integer 4 5 t3 integer : 组元素的大小 ( 字节数 )

13 其它中间代码表达形式 在实现时, 还有四元式 三元式 间接三元式 静态单 赋值 ; 四元式 :op, arg1, arg2, result; 三元式 : 就是 DAG;

14 6.3 类型和变量声明 类型检查 (Type Checking) 规则 : 保证运算分量的类型和运算符的预期类型要匹配 翻译 : 确定名字的类型, 需要的内存空间 计算数组元素的 地址 ( 即存储空间布局 ( 相对地址 ) 类型转换 选择正确 的运算符 ;

15 类型表达式 类型表达式 (type expression) 表示类型的结构, 其定义如下 : 基本类型是一个类型表达式 如 :boolean integer,float, void 等 类名是一个类型表达式 类型构造算子作用于类型仍是类型表达式 array[ 数字, 类型表达式 ] record { 字段, 类型对的列表 } list 类型 set 类型

16 类型表达式 从函数的角度来看待类型 : 类型构造算子 : 是用类型作为参数, 构造出新的类型 ; 从类型 s 到类型 t 的函数记作 s t; 按照函数的写法应该是 t (s) 例如 :list( ) 的结果是列表类型, 其元素的类型为 ; class Cell { int info; Cell next; } 类型名和递归类型 ; 可以给类型取名, 例如上面的 Cell 某种类型的变量,

17 变量的类型声明 文法 1 D T id ; D ε 2 T B C record { D } 3 B int float 4 C ε [num] C 语义 : D 生成一系列声明 ; T 生成不同的类型 ; B 生成基本类型 int/float; C 表示分量, 生成 [num] 序列 ; 注意 record 中包含了各个字段的声明 字段声明和变量声 明的文法一致

18 局部变量的存储布局 变量的类型, 确定了变量的内存大小 ( 以字节为单位 ), 称为类型的宽度 变量有值和地址两个值两个概念 变量值放在内存中, 在内存中的放置位置, 叫地址 可基于地址来访问变量的值 ; 变量的类型信息保存在符号表中 ; 一个函数的局部变量总是分配在连续的区间, 可基于相对地址来访问变量的值 相对地址, 是相对于这个区间的开始处

19 基本类型和数组类型的表达式和宽度求 解 SDT 例如,int [2][3] 的类型表达式为 array(2, array(3,integer) T t,w 1)T B {T.t = C.t = B.t; C.w =B.w } C { T.t=C.t ; T.w = C.w } t,w B t,w t C 2)B int { B.t = integer; B.w = 4 } 3)B float { B.t = float; B.w = 8 } t,w t,w int [ 2 ] C 1 4)C { C 1.t = C.t; C 1.w = C.w } t,w [num]c 1 { C.t = array(num, C 1.t) t,w [ 3 ] C 2 ; C.w = num * C 1.w } 5)C 在这里将 C 的 t 和 w 属性, 首先在展开时充当继承属性, 然后在 规约时让它们充当综合属性

20 程序的嵌套性层次结构 可伸展的树形结构 } include my_head.h int g_num; int main( int argc, char *argv ) { char szbuf [128]; char *psz = "Hello"; int p = 2; g_num = 189; MyFun( p ); if (p > 0) { int p; p = strcpy(szbuf, psz); } return 0; 函数块 1 main root 块 if 块 1 while 块 2... 函数 n if 块 1 if 块 2 while 块 3 每个 block 都有其符号表 类型符号表 ; 通常在 root 块中 变量符号表 ;

21 变量的作用域和内存布局 scheme 在一个函数里面, 其所有变量放在一个连续的存储空间中, 变 量在该空间的放置顺序与声明顺序一致 ; 相对地址从 0 开始, 变量 offset 记录了当前可用的相对地址 ; 每申明一个变量,SDT 所做处理 : offset 的值增加其宽度 : 在当前块的符号表中, 增加一行 ( 变量实例 ): top.put(id.lexeme, T.type, offset)

22 函数文法

23 声明序列的 SDT(2) 1) F {top = new Env(); D.offset= 0 } D 2) D T id; { top.put(id, T.type, offset, offset); D 1.offset = D.offset + T.width; } D 1 { D.offset = D 1.offset ; } 3) D

24 对记录类型 为每个记录创建单独的符号表 把原有的符号表对象, 以及 offset 暂存到环境中 在环境中新建一个符号表, 设 offset=0 T record id '{' { Env.push(top); top = new Env(); stack.push(offset); offset = 0; } D '}' {T.name = id.lexeme, T.type=record(top); T.width = offset; top env.pop(); offset = stack.po(); }

25 将表达式 三地址指令序列的 SDD 产生式 1)S id=e; 2)E E 1 + E 2 3)E -E 1 4)E (E 1 ) 5)E id 语义规则 S.code =E.code gen(top.get(id.lexeme) '=' E.addr) E.addr = new temp() E.code =E 1.code E 2.code gen(e.addr '= E 1.addr '+' E 2.addr) E.addr = new temp() E.code =E 1.code gen(e.addr '=' 'minus' E 1.addr ) E.addr = E 1.addr E.code =E 1.code E.addr = top.get(id.lexeme) E.code =''

26 增量式翻译方案 SDT 1)S id=e; 2)E E 1 + E 2 3)E -E 1 { AddCode(top.get(id.lexeme) '=' E.addr); } { E.addr = new temp(); AddCode(E.addr '= E 1.addr '+' E 2.addr); } { E.addr = new temp() AddCode(E.addr '=' 'minus' E 1.addr ); } 4)E (E 1 ) { E.addr = E 1.addr; } 5)E id { E.addr = top.get(id.lexeme); }

27 数组元素的寻址 数组元素被存放在连续的存储空间中 ; 元素从 0 到 n-1 编号, 第 i 个元素的地址为 :base+i*w K 维数组的寻址 : 数组按行存放时,A[i 1 ][i 2 ] [i k ] 的地址 base+i 1 *w 1 +i 2 *w 2 + +i k *w k 或者 base+(( ((i 1 *n 2 +i 2 )*n 3 +i 3 ) )*n k +i k )*w 在符号表中有 A 的条项,A 的条项中记录了 A 的类型,base 就是 A 的地址, 即 A 申明时填的 offset;

28 数组元素 L:L L[E] id[e] S L=E; E L. 计算偏移量, 存放于 L.addr 所指的临时变量中 1)L id[e]; 2)L L 1 [E] { L.array = top.get(id.lexeme); L.type =L.array.type.elem; L.addr = new Temp(); gen( L.addr '=' E.addr '*' L.type.width); } { L.array = L 1.array ; L.type =L 1.type.elem; t = new Temp(); L.addr = new Temp(); gen( t '= E.addr '*' L.type.width); gen( L.addr '=' L 1.addr '+' t); }

29 数组元素作为因子 L 的代码只计算了偏移量 ; 数组元素的值 : L 的数组基址加上偏移量 ; 使用三地址指令 x=a[i] 5)E L { E.addr = new temp(); AddCode(E.addr '=' L.array.base'[' L.addr ']'); }

30 给数组元素赋值 使用三地址指令 a[i]=x S L = E; { gen(l.array.base '[' L.addr ']' '=' E.addr); }

31 int a[2][3], c, i, j; 求表达式 c+a[i][j] 的三地址码序列 E addr= c c a [ E addr=i ] type=array(2, array(3, integer)) E + addr=t 5 L [ E ] type=array(3,integer) array = a addr=j addr=t 1 i 注释语法分析树 E L addr=t 4 array = a; type=integer addr=t 3 j t 1 = i * 12 t 2 = j * 4 t 3 = t 1 + t 2 t 4 = a[ t 3 ] t 5 = c + t 4

32 类型检查和转换 类型系统 : 编译时, 目标代码中的元素有值, 类型, 存储地址 的概念 ; 编译时就解决类型匹配问题 保证运行时, 不再存在 有关类型的问题要处理, 不会出错 : 强类型的语言 ; 编译时来发现错误, 以提高运行时效率 确定临时变量的大小 例如将一个 float 类型的变量的地址, 赋给一个 int 的指针变 量

33 类型检查的两种方式 类型综合 根据子表达式的类型构造出表达式的类型 例 :E 1 +E 2 的类型根据 E 1,E 2 的类型定义 要求名字先定义后使用 f,x 是表达式, s t 是从 s 映射到 t 的函数 if f 的类型为 s t, 且 x 的类型为 s, then f(x) 的类型为 t 可扩充到多变量函数 : 例 : E 1 +E 2 可看作函数 add(e 1, E 2 ) 类型推导

34 类型检查的两种方式 类型综合 类型推导 根据语言结构的使用方式来确定该结构的类型 if f(x) 是一个表达式 then 对于某类型 α,β;f 的类型为 α β 且 x 的类型为 α 例 :null(x) 是一个测试列表是否为空的函数, 则根据函数 null(x) 可推断出 x 必定是一个列表, 但 x 的元素类型未知 不要求名字先定义的语言需要类型推导, 如 :ML

35 类型转换 设表达式 x+i,x 为浮点数 i 为整数, 则结果应该是浮点数 x 和 i 使用不同的二进制表示方式 浮点 + 和整数加使用不同的指令 t1 = (float) i t2 = x + t1 类型转换比较简单时 E E1 + E2 { if(e1.type = integer and E2.type = integer) E.type = integer; else } ( 问题 : 请补充完整这条规则的语义动作 ) } 这个规则没有考虑产生类型转换代码

36 类型的 widening 和 narrowing Java 类型转换规则区分了拓宽转换和窄化转换 编译器自动完成的转换为隐式转换, 程序员用代码指定的转换为显式转换

37 处理类型转换的 SDT 图 6.27 在表达式计算中引入类型转换 图 6.26 widen 函数的伪代码

38 函数 / 运算符的重载 重载 (overload) 是面向对象程序设计语言的一个特征 例 :Java 语言中 + 算符可表示串连接或加法运算, 由操作数的类型来区分 用户自定义的函数也可以重载, 如 : Void err() { } Void err(string S) { }

39 函数 / 运算符的重载 通过查看参数就能解决的函数重载问题 E f(e1) { if f.typeset = {s i t i 1<= i<= k} and E 1.type=s k then E.type = t k }

40 6.6 控制流的翻译 布尔表达式可以用于改变控制流, 计算逻辑值 文法 B B B B && B!B (B) E relop E true false 语义 B 1 B 2 中 B 1 为真时, 不计算 B 2, 整个表达式为真 因此, 当 B 1 为真时应该跳过 B 2 的代码 B 1 && B 2 中 B 1 为假时, 不计算 B 2, 整个表达式为假 短路代码 通过跳转指令实现控制流的处理

41 短路代码的例子 语句 : if (x<100 x>200 && x!= y) x = 0; 代码 if x < 100 goto L2 if FALSE x > 200 goto L1 if FALSE x!= y goto L1 L2: x=0 L1: 接下来的代码

42 继承属性 : B.true B.false S.next 产生式 1)P S; 2)S if (B) S 1 B.true: B.false: 控制流语句的 SDD B.code S 1.code... S if (B) S 1 to B.true to B.false S.next 语义规则 S.next =newlable( ); P.code = S.code label(s.next) if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : B.true = newlable( ); B.false = S.next; S 1.next= S.next; S.code =B.code label(b.true) S 1.code

43 控制流语句的 SDD 继承属性 : B.true B.false S.next B.true: B.false: S.next: B.code S 1.code goto S.next S 2.code... S if (B) S 1 else S 2 to B.true to B.false 产生式 3)S if (B) S 1 else S 2 语义规则 B.true = newlable( ); B.false = newlable( ); S 1.next= S.next; S 2.next= S.next; S.code =B.code label(b.true) S 1.code gen('goto' S.next) label(b.false) S 2.code

44 控制流语句的 SDD begin: B.true: B.false: B.code S 1.code goto begin... to B.true to B.false S.next S while(b) S 1 产生式 4)S while (B) S 1 语义规则 begin = newlable( ); B.true = newlable( ); B.false =S.next; S1.next= S.next; S.code =label(begin) B.code label(b.true) S 1.code gen('goto' begin) label(b.false)

45 控制流语句的 SDD 产生式 语义规则 5)S S 1 S 2 S 1.next = newlable( ); B.true = newlable( ); B.false =S.next; S 2.next= S.next; S.code =S 1.code label( S 1.next) S 2.code

46 控制流语句 While 的 SDT begin: B.true: B.false: B.code S 1.code goto begin... to B.true to B.false S.next S while(b) S 1 S while ( {begin = newlabel( ); B.true = newlabel( ); B.false = S.next; AddCode(begin : ) } B) {AddCode(B.true : ); S1.next= S.next; } S 1 { AddCode ( goto begin); }

47 翻译布尔表达式的 SDD 产生式 1)B true; 2)B false 3)B E 1 rel E 2 语义规则 B.code = gen('goto' B.true) B.code = gen('goto' B.false) B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true)

48 翻译布尔表达式的 SDD 产生式 4)B!B 1 ; 语义规则 B1.true =B.false; B1.false = B.true; 5)B B 1 && B 2 B 1.true = newlabel( ); B 1.false = B.false; B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.true) B 2.code

49 翻译布尔表达式的 SDD 产生式 6)B B 1 B 2 语义规则 B 1.true = B.true; B 1.false = newlabel( ); B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.false) B 2.code

50 布尔表达式代码的例子 例 : 将 if (x<100 x > 200 && x!= y ) x = 0; 翻译成三地址 码 if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 :

51 减少 goto 指令 例 : 将 if (x<100 x > 200 && x!= y ) x = 0; 翻译成三地址 码 if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : 多余 iffalse x>200 goto L 1 iffalse x!=y goto L 1 if(b) S 1 B 的指令之后就是 S 1, B.true 不须要, 设为 fall

52 减少 goto 指令 产生式 3)B E 1 rel E 2 当时 B.code B.true: S 1.code B.false:... S if (B) S 1 语义规则 if B.true fall then B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true) else to B.true to B.false B.false: B.true= fall B.code S 1.code... to B.false B.code =E1.code E1.code gen('if False' E1.addr rel.op E2.addr 'goto' B.false)

53 减少 goto 指令 产生式 3)B E 1 rel E 2 语义规则 B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true) 产生式 3)B E 1 rel E 2 语义规则 if B.true fall then B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true) else B.code =E1.code E1.code gen('if False' E1.addr rel.op E2.addr 'goto' B.false)

54 减少 goto 指令 B B 1 B 2 当 B.true=fall 时 B 1.true S.next B1.code B 2.code S1.code... to B 1.true to B 2.false 因为 B 1.false 就是 B 2.code, 因此设 B 1.false=fall, 要省了一 条 goto B 2 起始处的指令 因为 B.true=fall, 又 B 1.code 中要跳转到 S 1.code 的开始 处, 只好创建 B 1.true

55 减少 goto 指令 B B 1 && B 2 当 B.true=fall 时 B 1.true S.next B1.code B 2.code S1.code... to B 1.false to B 2.false 因为 B 1.true 就是 B 2.code 起始处, 因此要设 B 1.true=fall, 省了一条 goto B 2 起始处的指令因为 B 2.true=fall, 又 B 2.code 后自然接 S 1, 省了一条 goto S 1 起始处的指令

56 翻译布尔表达式的 SDD 产生式 6)B B 1 B 2 语义规则 B 1.true = B.true; B 1.false = newlabel( ); B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.false) B 2.code 产生式 6)B B 1 B 2 语义规则 if B.true = fall then B 1.true = newlabel(); else B 1.true = B.true; B 1.false = fall; B 2.true = B.true; B 2.false = B.false; if B.true = fall then B.code =B 1.code B 2.code label(b 1.true) else B.code =B 1.code label(b 1.false) B 2.code

57 求布尔表达式的值, 比如 :x= a<b S id =B 等价于 if (B) id=true else id = false; S id = { B.true = newlabel( ); B.false = newlabel( ); } B {AddLabel(B.true : ); AddCode(id = true ); AddCode( goto' S.next) ; AddLabel(B.false : ); AddCode(id =false );}

58 生成 goto 指令时目标尚未已知问题 S if (B) S 1 按照短路代码的翻译方法,B 和 S 1 的代码中, 会包含有一些跳转指令 goto S.next 这些指令在前,S.next 标记的指令在后 ; 因此生成指令 goto S.next 时,S.next 的值是未知的 只有 S if (B) S 1 规约完了, 随后才会生成 S.next 标记的指令, 此时 S.next 才确定 ; B 中的 goto B.true 指令, 和 goto B.false 指令, 也有该问题 简单直接的方法是扫描一次代码, 填上 ;

59 回填技术的基本思想 在 B 和 S 1 中, 当生成 goto S.next 指令时, 记下该指令的 id, 添加到 B 的综合属性 B.nextList 中 规约时, 上传, 当规约 S if (B) S 1 时, 在完成中间代码生成之后, 此时 S.next 的值就确定下来了 使用 B.nextList, 定位这些前面的指令, 回填上 S.next 的值 ; 回填是在生成代码时, 调用 AddLabel(labelId ':') 时, 执行

60 布尔表达式的回填翻译 对布尔表达式 B, 引入两个综合属性 truelist: 包含跳转指令的列表, 为 true 时执行这些指令 Falselist: 包含跳转指令的列表, 为 false 时执行这些指令辅助函数 : Makelist(i) : 创建一个只含 i 的列表,i 是指令 id( 即数组的下标 ), 返回一个指向新创建列表的指针 ; Merge(p1,p2): 合并 p1 和 p2 指向的列表, 返回指向合并后新表的指针 Backpatch(p,i): 将 i 作为 goto 目标地址回填到 p 所含各指令中

61 布尔表达式的回填翻译 SDT 1)B true; { B.truelist = makelist(nextinstr); gen('goto _');} 2)B false; { B.falselist = makelist(nextinstr); gen('goto _');} 3)B E 1 rel E 2 { B.falselist = makelist(nextinstr); B.falselist = makelist(nextinstr + 1); gen('if' E 1.addr rel.op E 2.addr 'goto _'); gen('goto _'); }

62 布尔表达式的回填翻译 SDT 4)B (B 1 ); { B.truelist = B 1.truelist; B.falselist = B 1.falselist ;} 5)B!(B 1 ); { B.truelist = B 1.falselist; B.falselist = B 1.truelist; }

63 布尔表达式的回填翻译 SDT 6)B B 1 && { B 2.instr = nextinstr; } B 2 { Backpatch(B 1.truelist, B 2.instr); B.truelist = B 2.truelist; B.falselist = merge(b 1.falselist, B 2.falselist); } 7)B B 1 { B 2.instr = nextinstr; } B 2 { Backpatch(B 1.falselist, B 2.instr); B.falselist = B 2.falselist; B.truelist = merge(b 1.truelist, B 2.truelist); }

64 回填例子 :x<100 x>200 && x!=y 假设从 nextinstr = 100 开始 100: if x<100 goto _ 101: goto _ B t={100} f={100} x<100 i=102 B t={100,104} f={103,105} i=104 B B t={102} f={103} && t={104} f={103,105} B t={104} f={105} 102: if x>200 goto _ 103: goto _ 104: if x!=y goto _ 105: goto _ x>200 x!=y

65 控制转移语句的回填 S if ( B ) S if (B) S else S while (B) S { L } A L L S S 语句的综合属性 :nextlist 其中的跳转指令的目标, 是 S 执行完毕之后, 应该执行的下一条指令 考虑 S 是 while 语句 if 语句的子语句时, 分别应该跳转到哪里?

66 控制转移语句的回填 (2) 1) S if (B) { S 1.instr = nextinstr;} S 1 { backpatch(b.truelist, S 1.instr); S.nextlist = merge(b.falselist, S 1.nextlist); } 2) S if (B) { S 1.instr = nextinstr; } S 1 N else {S 2.instr = nextinstr;} S 2 { backpatch(b.truelist, S 1.instr); backpatch(b.falselist, S 2.instr); temp= merge(s 1.nextlist, N.nextlist); S.nextlist = merge(temp, S 2.nextlist); } 3) N { N.nextlist = makelist(nextinstr); gen('goto _'); } N 的作用是生成 goto 指令坯,N.nextlist 记录了这个指令的位置

67 控制转移语句的回填 (3) 4) S while ( { B.instr = nextinstr;} B) { S 1.instr = nextinstr;} S 1 { backpatch(s 1.nextlist, B.instr); backpatch(b.truelist, S 1.instr); S.nextlist = B.falselist; gen('goto' B.instr); }

68 控制转移语句的回填 (3) 5) S {L} { S.nextlist =L.nextlist ; } 6) S A; { S.nextlist =null; }S 1 L L 1 {S.instr = nextinstr;} S;N else S 2 { backpatch(l1.nextlist,s.instr); L.nextlist = S.nextlist; } 7) L S { L.nextlist =S.nextlist ; }

69 Break Continue 的处理 虽然 break continue 在语法上就是一个句子, 但是它的代码却和外围语句相关 方法 : 跟踪外围语句 S, 生成一个跳转指令坯 将这个指令坯的位置加入到 S 的 nextlist 中 跟踪的方法 在符号表中设置 break 条目, 令其指向外围语句 在符号表中设置指向 S 的 nextlist 的指针, 然后把这个指令坯的位置直接加入到 nextlist 中

70 6.8 switch 语句 许多语言都有 switch 或 case 语句 语句结构 switch (E) of { case V 1 : S 1 ; case V 2 : S 2 ; case V n-1 : S n-1 ; otherwise: S n }

71 switch 语句的翻译 1. 计算表达式 E 的值 2. 在 case 列表中寻找与表达式值相同的值 V j 当 case 表中明确列出的值都不与表达式匹配时, 就用默认值和表达式匹配 3. 执行和匹配值关联的语句 S j 其中步骤 2 是一个 n 路分支, 可采用多种方式实现

72 创建一个对照关系表 实现条件跳转的方式 编译器生成一个简单循环, 检查表达式 E 的值 当匹配某个 V i 时, 执行对应的 S i 均不匹配时, 肯定与末项匹配

73 翻译法 ( 一 ) T=E L 1 : if T V 1 goto L 2 S 1 的代码 goto next L 2 : if T V 2 goto L 3 S 2 的代码 goto next L 3 : L n-1 : if T V n-1 goto L n S n-1 的代码 goto next L n : next: S n 的代码

74 翻译法 ( 二 ) L 1 : L n-1 : L n : T=E goto test 关于 S 1 的中间码 goto next 关于 S n-1 的中间码 goto next 关于 S n 的中间码 goto next test: if T=V 1 goto L 1 if T=V 2 goto L 2 if T=V n-1 goto L n-1 goto L n next:

75 用来翻译 switch 语句的 case 三地址代 码指令 Case t V 1 L 1 Case t V 2 L 2 Case t V n-1 L n-1 Case t t L n next:

76 过程的中间代码 在三地址码中, 函数调用被拆分为准备进行调用时的参数求值, 然后是调用本身 设 a 为 int 类型的数组, n = f(a[i]); 的三地址码 : t 1 =i*4 t 2 =a[t 1 ] param t 2 t 3 = call f, 1 n = t 3

77 函数定义和调用的产生式 D T id(f) {S} F T id T id, F S return E; E id(a) A E E, A

78 过程调用的处理 过程调用主要对应两种事 : 传递参数 转子 传地址 : 把实在参数的地址传递给相应的形式参数 调用段预先把实在参数的地址传递到被调用段可以拿到的地方 ; 程序控制转入被调用段之后, 被调用段首先把实在参数的地址抄进自己相应的形式单元中 ; 过程体对形式参数的引用域赋值被处理成对形式单元的间接访问

79 过程调用的翻译 翻译方法 : 把实参的地址逐一放在转子指令的前面. 例如, CALL S(A,X+Y) 翻译为 : 计算 X+Y 置于 T 中的代码 param A /* 第一个参数的地址 */ param T /* 第二个参数的地址 */ call S,2 /* 转子 */

80 过程调用的翻译 过程调用文法 : (1) S call id (Elist) (2) Elist Elist, E (3) Elist E 参数的地址存放在一个队列中 最后对队列中的每一项生成一条 param 语句

81 翻译模式 3. Elist E { 初始化 queue 仅包含 E.place;n=0 } 2. Elist Elist, E { 将 E.place 加入到 queue 的队尾 ;n=n+1 } 1. S call id (Elist) { for 队列 queue 中的每一项 p do gen( param p); gen( call id.addr, n) }

82 作业 6.1.1,6.2.1,6.4.3(2),6.6.4(1),6.7.1(1)

83 第六章中间代码生成 语义分析和中间代码生成 中间代码表示 类型检查和翻译 中间代码生成 DAG 图 三地址码 静态单赋值 表达式翻译 控制流翻译 回填 过程翻译

84 谢谢谢谢!

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019 编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019 什么叫语法制导的翻译 (SDT) 求表达式的值 id 1 + id 2 *id 3 4 + 3 * 5 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 id 2 id 3 四者的语义相同 对于计算机执行的指令流 : E 1

More information

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx 第六章中间代码生成 陈林 本章内容 中间代码表示 抽象语法树 三地址代码 中间代码生成 表达式 类型检查 控制流 编译器前端的逻辑结构 静态类型检查和中间代码生成的过程都可以用语法制导的翻译来描述和实现 对于抽象语法树这种中间表示的生成, 第五章已经介绍过 表达式的有向无环图 语法树中, 公共子表达式每出现一次, 就有一个对应的子树 表达式的有向无环图 (Directed Acyclic Graph,DAG)

More information

PowerPoint Presentation

PowerPoint Presentation 第六章中间代码生成 许畅 南京大学计算机系 2018 年春季 本章内容 中间代码表示 表达式的有向无环图 DAG 三地址代码 :x = y op z 类型检查 类型 类型检查 表达式的翻译 中间代码生成 控制流 回填 2 编译器前端的逻辑结构 前端是对源语言进行分析并产生中间表示 处理与源语言相关的细节, 与目标机器无关 前端后端分开的好处 : 不同的源语言 不同的机器可以得到不同的编译器组合 3

More information

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019 编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019 什么叫语法制导的翻译 (SDT) 求表达式的值 id 1 + id 2 *id 3 4 + 3 * 5 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 id 2 id 3 四者的语义相同 对于计算机执行的指令流 : E 1

More information

编译原理与技术

编译原理与技术 编译原理与技术 中间代码生成 2015/11/7 编译原理与技术 讲义 1 中间代码生成 - 布尔表达式翻译 - 控制流语句翻译 2015/11/7 编译原理与技术 讲义 2 布尔表达式的翻译 布尔表达式文法 G 4 E E 1 or E 2 E 1 and E 2 not E 1 ( E 1 ) id 1 relop id 2 true false id 3 布尔运算符 or and 和 not(

More information

Microsoft PowerPoint - L12-v3.pptx

Microsoft PowerPoint - L12-v3.pptx Lecture 12: 中间代码生成 -II Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 控制流翻译 控制流语句的翻译 文法 B表示布尔表达式 S代表语句 S if (B) S1 S if (B) S1 else S2 S while (B) S1 代码的布局见右图 继承属性 B.true B为真的跳转目标 B.false B为假的跳转目标 S.next

More information

Microsoft PowerPoint - ch6 [Compatibility Mode]

Microsoft PowerPoint - ch6 [Compatibility Mode] 第 6 章 中间代码生成 记号流 分析器 本章内容 静态检查器 中间代码生成器 中间代码 代码生成器 介绍几种常用的中间表示 : 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 6.1.1 后缀表示表达式 E 的后缀表示可以如下归纳定义 如果 E 是变量或常数, 那么 E 的后缀表示就是 E 本身 如果 E 是形式为 E 1 ope 2 的表达式,

More information

Microsoft PowerPoint - ch7 [Compatibility Mode]

Microsoft PowerPoint - ch7 [Compatibility Mode] 记号流 第七章 分析器 静态检查器 中间代码生成 中间代码生成器 中间代码 代码生成器 本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 E E ope uope (E) id num 表达式 E 的后缀表示可以如下归纳定义 : 表达式

More information

大侠素材铺

大侠素材铺 编译原理与技术 中间代码生成 Ⅰ 计算机科学与技术学院 李诚 12/11/2018 关于课程实验 目标 : 为 PL0 语言实现一个简单的编译器 Project 1: 词法分析 Project 2: 语法分析 Project 3: 语法错误处理 + 对前两个 project 的扩展, 11.15 release,11.30 提交 Project 4: 代码生成,12.1 release,12.15

More information

Microsoft PowerPoint - ch7.ppt [兼容模式]

Microsoft PowerPoint - ch7.ppt [兼容模式] 第七章 中间代码生成 静态中间代码记号分析检查代码中间生成流器器生成代码器器本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 7.1 中间语言 E E ope uope (E) id num

More information

Microsoft PowerPoint - ir

Microsoft PowerPoint - ir 中间语言与中间代码生成 张昱 编译原理和技术 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 本章内容 分析器 语法树 静态检查器 语法树 中间中间代码代码生成器 代码生成器 符号表本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图

More information

词 法 分 析

词 法 分 析 中间语言与中间代码生成 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 本章内容 记号流 分析器 语法树 静态检查器 语法树 中间代码生成器 中间代码 代码生成器 本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句 编译原理 第七章语法制导翻译及中间代码生成 方徽星 扬州大学信息工程学院 (505) fnghuixing@yzueducn 2018 年 6 月 内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句 11 语法制导定义 (Syntx-Directed Definition)

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06

编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06 编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06 软件工程技术知识体系 机器学习 / 神经网络 (AI) 不确定性 ( 概率 ) 编译技术 灵活多变, 但有基因 数据库技术 基础技术 联线 : 直观易懂 联系 组合, 摘取分布式系统面向对象编程计算机网络操作系统数据结构 2 灵活多变 : 计算器该如何编程实现? a + b a +

More information

大侠素材铺

大侠素材铺 编译原理与技术 语法制导翻译 Ⅱ 计算机科学与技术学院 李诚 22/10/2018 Announcement Tutorial on Thursday (25/10/2018) 3B201, Class time Assignment review Q & A Cheng @ Compiler Fall 2018, USTC 2 主要内容 源程序 词法分析器 token 语法分析器 分析树 语义分析

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

再版前言

再版前言 第七章中间代码生成 在第一章已经介绍, 编译器的前端把源程序翻译成中间表示, 后端从中间代码产生目标代码, 与目标语言有关的细节尽可能限制在后端 使用独立于机器的中间形式的好处是 : 1. 再目标 (retargeting) 比较容易 把针对新机器的后端加到现成的前端上, 可以得到另一种机器的编译器 2. 独立于机器的代码优化器可用于这种中间表示 第九章将介绍这种代码优化 因此, 虽然可以把源程序直接翻译并生成目标代码,

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

Microsoft PowerPoint - L9-v3.pptx

Microsoft PowerPoint - L9-v3.pptx Lecture 9: 语法制导的翻译 -I Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 Introduction 9.1 概述 语义分析在编译程序中的作用 词法分析 目标代码生成 语法分析 中间代码优化 语义分析 分析 中间代码生成 合成 语法和语义的区别 语法 是描述一个合法定义的程序结构的规则 例如 id( ) 语义 说明一个合法定义的程序的含义

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx 第五章语法制导的翻译 陈林 引言 使用上下文无关文法引导语言的翻译 CFG 的非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由小构造的含义综合而来 比如 : 表达式 x+y 的类型由 x y 的类型和运算符 + 决定 也可以从附近的构造继承而来 比如 : 声明 int x; 中 x 的类型由它左边的类型表达式决定 语法制导定义和语法制导翻译 语法制导定义

More information

ebook14-4

ebook14-4 4 TINY LL(1) First F o l l o w t o p - d o w n 3 3. 3 backtracking parser predictive parser recursive-descent parsing L L ( 1 ) LL(1) parsing L L ( 1 ) L L ( 1 ) 1 L 2 L 1 L L ( k ) k L L ( 1 ) F i r s

More information

C/C++语言 - 分支结构

C/C++语言 - 分支结构 C/C++ Table of contents 1. if 2. if else 3. 4. 5. 6. continue break 7. switch 1 if if i // colddays.c: # include int main ( void ) { const int FREEZING = 0; float temperature ; int cold_ days

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

e bug 0 x=0 y=5/x 0 Return 4 2

e bug 0 x=0 y=5/x 0 Return 4 2 e 1 4 1 4 4.1 4.2 4.3 4.4 4.5 e 2 4.1 bug 0 x=0 y=5/x 0 Return 4 2 e 3 4 3 e 4 (true) (false) 4 4 e 5 4 5 4.2 1 G= V E V={n1,n2,,n m } E={e1,e2,,e p } e k ={n i,n j }, n i,n j V e 6 4.2 4 6 1 e 3 n 1 e

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

Microsoft PowerPoint - typecheck

Microsoft PowerPoint - typecheck 本章内容 类型检查 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 语法分析器 语法树语法树类型中间代码中间检查器生成器表示 符号表 语义检查中最典型的部分 类型检查 类型系统 类型检查 符号表的作用 多态函数 重载 其他的静态检查 ( 不详细介绍 ) 控制流检查 唯一性检查 关联名字检查 张昱 : 编译原理和技术

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

第5章修改稿

第5章修改稿 (Programming Language), ok,, if then else,(), ()() 5.0 5.0.0, (Variable Declaration) var x : T x, T, x,,,, var x : T P = x, x' : T P P, () var x:t P,,, yz, var x : int x:=2. y := x+z = x, x' : int x' =2

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

软件工程技术知识体系 机器学习 / 神经网络 (AI) 不确定性 ( 黑盒, 概率 ) 编译技术 灵活多变, 但有基因 数据库技术 联系 组合, 摘取 基础技术 联线 : 直观易懂 分布式系统面向对象编程计算机网络操作系统数据结构 2

软件工程技术知识体系 机器学习 / 神经网络 (AI) 不确定性 ( 黑盒, 概率 ) 编译技术 灵活多变, 但有基因 数据库技术 联系 组合, 摘取 基础技术 联线 : 直观易懂 分布式系统面向对象编程计算机网络操作系统数据结构 2 编译原理 Compiler Principles 第一章引论 湖南大学信息科学与工程学院软件工程系杨金民 2018 软件工程技术知识体系 机器学习 / 神经网络 (AI) 不确定性 ( 黑盒, 概率 ) 编译技术 灵活多变, 但有基因 数据库技术 联系 组合, 摘取 基础技术 联线 : 直观易懂 分布式系统面向对象编程计算机网络操作系统数据结构 2 灵活多变 : 计算器该如何编程? a + b a

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

02

02 Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC

More information

第3章.doc

第3章.doc 3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo

More information

.., + +, +, +, +, +, +,! # # % ( % ( / 0!% ( %! %! % # (!) %!%! # (!!# % ) # (!! # )! % +,! ) ) &.. 1. # % 1 ) 2 % 2 1 #% %! ( & # +! %, %. #( # ( 1 (

.., + +, +, +, +, +, +,! # # % ( % ( / 0!% ( %! %! % # (!) %!%! # (!!# % ) # (!! # )! % +,! ) ) &.. 1. # % 1 ) 2 % 2 1 #% %! ( & # +! %, %. #( # ( 1 ( ! # %! % &! # %#!! #! %!% &! # (!! # )! %!! ) &!! +!( ), ( .., + +, +, +, +, +, +,! # # % ( % ( / 0!% ( %! %! % # (!) %!%! # (!!# % ) # (!! # )! % +,! ) ) &.. 1. # % 1 ) 2 % 2 1 #% %! ( & # +! %, %. #(

More information

# % & ) ) & + %,!# & + #. / / & ) 0 / 1! 2

# % & ) ) & + %,!# & + #. / / & ) 0 / 1! 2 !!! #! # % & ) ) & + %,!# & + #. / / & ) 0 / 1! 2 % ) 1 1 3 1 4 5 % #! 2! 1,!!! /+, +!& 2! 2! / # / 6 2 6 3 1 2 4 # / &!/ % ). 1!!! &! & 7 2 7! 7 6 7 3 & 1 2 % # ) / / 8 2 6,!!! /+, +! & 2 9! 3 1!! % %

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

Microsoft Word - mei.doc

Microsoft Word - mei.doc 看上去很美 王朔 编者的话 时隔七年 王朔又拿出了他的新作 一个过去写过很多东西 又曾声言放弃写作的 人 此番重新拿起笔 令我们感兴趣的倒也不是他的食言自肥 而是他是否确有一些新 意要表达 这才构成一部文学作品产生的必要成因 关于王朔 我们听到较多的是他的 调侃和所谓玩世不恭的写作态度 作为出版过他的全部作品的编者 我们知道那类作品 只是他全部作品的一小部分 在某一时刻被刻意演染夸张开来的一种风格

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期  开放本科  期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l 试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main

More information

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期  开放本科  期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new 试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main

More information

《新工具》

《新工具》 ! " ! """"""""""""""""""""""! """"""""""""""""""""" #$ &!!!! " # " $ " " % ! "! #! #!! # " # " #! # # $ $ $ " % &! %! " "! "! "! " # "! " $ "! (! " " # $ % " " & " & " " & & " & " & )!! " # $! " "!! "%

More information

第7章-并行计算.ppt

第7章-并行计算.ppt EFEP90 10CDMP3 CD t 0 t 0 To pull a bigger wagon, it is easier to add more oxen than to grow a gigantic ox 10t 0 t 0 n p Ts Tp if E(n, p) < 1 p, then T (n) < T (n, p) s p S(n,p) = p : f(x)=sin(cos(x))

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 WWW PHP 2003 1 Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 Comments PHP Shell Style: # C++ Style: // C Style: /* */ $value = $p * exp($r * $t); # $value

More information

Microsoft PowerPoint - ch4.ppt [兼容模式]

Microsoft PowerPoint - ch4.ppt [兼容模式] 第四章 语法制导的翻译 本章内容 1 介绍语义描述的一种形式方法: 语法制导的翻译 (syntax-directed translation), 它包括两种具体形式 语法制导的定义 (syntax-directed definition) E E 1 + T E.code = E 1.code T.code + 可读性好, 更适于描述规范 翻译方案 (translation scheme) E E

More information

全国计算机技术与软件专业技术资格(水平)考试

全国计算机技术与软件专业技术资格(水平)考试 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

(京)新登字063号

(京)新登字063号 教 育 部 职 业 教 育 与 成 人 教 育 司 推 荐 教 材 Java 程 序 设 计 教 程 ( 第 二 版 ) 沈 大 林 主 编 沈 昕 肖 柠 朴 曾 昊 等 编 著 内 容 简 介 Java 是 由 美 国 SUN 公 司 开 发 的 一 种 功 能 强 大 的, 具 有 简 单 面 向 对 象 分 布 式 可 移 植 等 性 能 的 多 线 程 动 态 计 算 机 编 程 语 言

More information

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2 Chapter 02 變數與運算式 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.2.1 2.2.2 2.2.3 type 2.2.4 2.3 2.3.1 print 2.3.2 input 2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 + 2.4.6 Python Python 2.1 2.1.1 a p p l e b e a r c 65438790

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

第三节 软件测试的过程与策略

第三节 软件测试的过程与策略 ...1...4...9...17...25...29...34...40...46...55...65...73 1 2 3 4 5 6 7 8 9 10 11 1 12 13 1 ABCD 2 A B C D 3 ABCD 4 A1/2 B1/3 C1/4 D2/3 5 % A20 B30 C40 D50 6 A B C D 7 A B C D / 8 A B C D 9 A B C D 10

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

untitled

untitled 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-1-1 C int main(void){ int x,y,z; int sum=0; double avg=0.0; scanf("%d",&x) ; scanf("%d",&y) ; scanf("%d",&z) ; sum=x+y+z ; avg=sum/3.0; printf("%f\n",avg); system("pause");

More information