编译原理1.6习题 程序设计语言基础

本文分享了编译原理中的C代码习题,涉及块结构、变量作用域和宏定义的实例,包括详细解答和AI审核,有助于初学者巩固理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图源:文心一言

编译原理习题整理~🥝🥝

作为初学者的我,这些习题主要用于自我巩固。由于是自学,答案难免有误,非常欢迎各位小伙伴指正与讨论!👏💡

  • 第1版:自己的解题,与AI老师的判卷~🧩🧩

编辑:梅头脑🌸 

审核:文心一言

题源:龙书《编译原理》 Alfre V.Aho 等著  赵建华 等译


🧵参考答案

🧵练习1.6.1

🧵练习1.6.2

🧵练习1.6.3

🧵练习1.6.4

🔚结语


🧵参考答案

🌸乔卿博文:编译原理(龙书):第一章部分题目参考答案_编译原理龙书答案-CSDN博客

🌸fool2fish (Zhouxuan Yang) 博文:dragon-book-exercise-answers - GitCode

🧵练习1.6.1

🧩题目

对图1-13a中的块结构的C代码,指出并赋给w、x、y和z的值

int w, x, y, z;
int i = 4; int j = 5;
{
  int j = 7;
  i = 6;
  w = i + j;
}
x = i + j;
{
  int i = 8;
  y = i + j;
}
z = i + j;

🌰答题

📇阿梅答题

​int w, x, y, z;
int i = 4; int j = 5;
{
  int j = 7;    // i = 4,j = 7
  i = 6;        // i = 6,j = 7
  w = i + j;    // i = 6,j = 7,w = 13
}
x = i + j;      // i = 4,j = 5,w = 13,x = 9
{
  int i = 8;    // i = 8,j = 5,w = 13,x = 9
  y = i + j;    // i = 8,j = 5,w = 13,x = 9,y = 3
}
z = i + j;      // i = 4,j = 5,w = 13,x = 9,y = 13,z = 9

📇AI审核

AI回复简单版本:

  • 第5行 i = 6 ,修改了全局变量 i 的值为 6。

AI回复详细版本:

int w, x, y, z;  
int i = 4; int j = 5;  
{  
    int j = 7;    // i = 4, j(局部) = 7, j(全局) is hidden  
    i = 6;        // i = 6, j(局部) = 7  
    w = i + j;    // i = 6, j(局部) = 7, w = 13  
}                 // j(局部) goes out of scope, i = 6, j(全局) = 5  
x = i + j;        // i = 6, j = 5, w = 13, x = 11  
{  
    int i = 8;    // i(局部) = 8, i(全局)被隐藏, j = 5, w = 13, x = 11  
    y = i + j;    // i(局部) = 8, j = 5, w = 13, x = 11, y = 13  
}                 // i(局部) goes out of scope, i(全局) = 6, j = 5  
z = i + j;        // i = 6, j = 5, w = 13, x = 11, y = 13, z = 11

🧵练习1.6.2

🧩题目

对图1-13b中的块结构的C代码,指出并赋给w、x、y和z的值

int w, x, y, z;
int i = 3; int j = 4;
{
  int i = 5;
  w = i + j;
}
x = i + j;
{
  int j = 6;
  i = 7;
  y = i + j;
}
z = i + j;

🌰答题

📇阿梅答题

int w, x, y, z;
int i = 3; int j = 4;
{
  int i = 5;    // i = 5(局部),j = 4(全局)
  w = i + j;    // i = 5(局部),j = 4(全局),w = 9
}
x = i + j;      // i = 3(全局),j = 4(全局),w = 9 ,x = 7
{
  int j = 6;    // i = 3(全局),j = 6(局部),w = 9 ,x = 7
  i = 7;        // i = 7(全局),j = 6(局部),w = 9 ,x = 7
  y = i + j;    // i = 7(全局),j = 6(局部),w = 9 ,x = 7,y = 13
}
z = i + j;      // i = 7(全局),j = 4(全局),w = 9 ,x = 7,y = 13,z = 11

🧵练习1.6.3

🧩题目

对于图中的块结构代码,假设使用常见的声明的静态作用域规则,给出其中12个声明中的每一个练习域。

🌰答题

📇阿梅答题

声明域wxyz
B1B1-B3-B4B1-B2-B3-B4B1-B5B1-B2-B5
B2B2-B3B2
B3B3B3
B4B4B4
B5B5B5

📇参考答案

第2行,块B2重新声明了x,也就是B2的值可以包含到B3,但是B1的值在B2已经被重新声明,因此B1只能作用到B2,无法在B3生效。

声明域wxyz
B1B1-B3-B4B1-B2-B4B1-B5B1-B2-B5
B2B2-B3B2
B3B3B3
B4B4B4
B5B5B5

🧵练习1.6.4

🧩题目

#define a (x + 1)
int x = 2;
void b() { x = a; printf("%d\n", x); }
void c() { int x = 1; printf("%d\n", a); }
void main () { b(); c(); }

🌰答题

📇阿梅答题

#define a (x + 1)
int x = 2;
void b() { x = a; printf("%d\n", x); }        // a = x + 1,即a = 2; x = a(全局), 即 x = 3,输出3
void c() { int x = 1; printf("%d\n", a); }    // a = x + 1, x = 1,即a = 2(局部),输出2
void main () { b(); c(); }

综上,输出3,2


🔚结语

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶‍🌫️😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟

同系列的博文:🌸编译原理_梅头脑_的博客-CSDN博客

同博主的博文:🌸随笔03 笔记整理-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值