《深入理解计算机系统(第二版)》 练习题3.18疑惑请教

C语言 码拜 9年前 (2016-03-31) 2309次浏览
该题书后答案为:
1    int  test(int x, int y) {
2          int val = x^y;
3          if ( x < -3) {
4             if(y<x)
5                 val = x * y;
6             else
7                    val = x + y;
8          }  else if(x > 2) {
9                      val = x – y;
10        return val;
11 }
根据书中汇编语言c语言if-else语句模板:
if (test-expr)
then-statement
else
else-statement
翻译用c语言语法来描述成:
t = test-expr;
if (!t)
goto false;
then-statement
goto done:
false:
else-statement
done:
答案为什么不是以下代码呢?
1    int  test(int x, int y) {
2          int val = x-y;
3          if ( x < -3) {
4             if(y<x)
5                 val = x * y;
6             else
7                    val = x + y;
8          }  else if(x <= 2) {
9                      val = x ^ y;
10        return val;
11 }
注意:第2、8、9行代码
请给位赐教,谢谢
解决方案

5

这位同学,你好像忘了贴汇编的代码了,本人看了一下习题,请注意第14行的汇编,在eax寄存器中的内容和立即数2比较之后,使用的是jg跳转指令,假如使用你的写法,那么对应的汇编将是jle,当然下面的汇编也会相应更改。

5

引用:

本人的意思是习题答案可不可是以下代码呢?
1    int  test(int x, int y) {
2          int val = x*y;
3          if ( x >= -3) {
4             if(x>2)
5                 val = x – y;
6             else
7                    val = x ^ y;
8          }  else if(x<=y) {
9                      val = x + y;
10        return val;
11 }

不行

5

晕,“ int val = x*y;” 和 “ int val = x ^ y;”不同,反正code path的白盒测试要过

25

代码功能归根结底不是别人帮本人看或讲解或注释出来的;而是被本人静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生本人领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:
《深入理解计算机系统(第二版)》 练习题3.18疑惑请教多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明《深入理解计算机系统(第二版)》 练习题3.18疑惑请教
喜欢 (0)
[1034331897@qq.com]
分享 (0)