[转载]LCC编译器的源程序分析(38)return语句
来源:互联网 发布:linux rar安装 编辑:程序博客网 时间:2024/06/09 16:19
在实现中,程序其实就是处理数据,然后输出处理过的结果,在C语句里最直接的方式就是函数的返回值。比如求两个数据的最大值,就可以通过函数返回值来返回最大值。而函数的返回值是通过函数中的return语句获得的。return语句后面是一个表达式,需要调用表达式函数来处理。
下面来分析LCC里的代码:
#001 case RETURN:
#002 {
#003 Type rty = freturn(cfunc->type);
#004 t = gettok();
#005 definept(NULL);
第3行取得函数返回值的类型。
第4行获取下一个记号。
第5行定义了执行点。
#006 if (t != ';')
#007 if (rty == voidtype)
#008 {
#009 error("extraneous return value/n");
#010 expr(0);
#011 retcode(NULL);
#012 }
#013 else
#014 retcode(expr(0));
#015 else
#016 {
#017 if (rty != voidtype)
#018 {
#019 warning("missing return value/n");
#020 retcode(cnsttree(inttype, 0L));
#021 }
#022 else
#023 retcode(NULL);
#024 }
#025 branch(cfunc->u.f.label);
#026 }
第6行是判断是否返回空值,如果返回空值就进入第16到到23行处理。
第7行判断函数返回值类型是否为空,如果函数返回值是空,那么return语句的返回值一定要为空,否则就是出错。第9行就是提示出错,第10行是处理表达式,第11行返回空值。
第14行是处理返回值的类型不为空的处理,它是调用函数expr来处理return语句后面的表达式。
第17行是处理空类型的返回值,如果不为空值就在第19行里给出警告。
第20行返回相应的类型的0值。
第23行是返回空类型的处理。
第25行跳转到函数结束的标号运行。
#027 expect(';');
#028 break;
#029
第27行是处理是否分号结束。
返回语句主要进行表达式处理和类型判断,以及返回值的类型转换。
- [转载]LCC编译器的源程序分析(38)return语句
- LCC编译器的源程序分析(38)return语句
- [转载] LCC编译器的源程序分析(20)复合语句
- [转载]LCC编译器的源程序分析(27)基本语句
- [转载]LCC编译器的源程序分析(28)函数表达式语句
- [转载]LCC编译器的源程序分析(29)if条件语句
- [转载]LCC编译器的源程序分析(30)while循环语句
- [转载] LCC编译器的源程序分析(32)for循环语句
- [转载]LCC编译器的源程序分析(33)break语句
- [转载] LCC编译器的源程序分析(34)continue语句
- [转载]LCC编译器的源程序分析(35)switch语句
- [转载]LCC编译器的源程序分析(36)case语句
- [转载]LCC编译器的源程序分析(37)default语句
- [转载]LCC编译器的源程序分析(39)goto语句
- [转载] LCC编译器的源程序分析(61)复合语句的代码块流程
- [转载]LCC编译器的源程序分析(31)do while循环语句
- [转载]LCC编译器的源程序分析(6)词法分析
- [转载]LCC编译器的源程序分析(7)词法分析
- Solaris 10 1/06 boot: Grub, kernel, boot_archive
- [转载]LCC编译器的源程序分析(36)case语句
- Asp.Net基于动态页面的静态页面实现
- [转载]LCC编译器的源程序分析(37)default语句
- 日本租房网站
- [转载]LCC编译器的源程序分析(38)return语句
- [转载]LCC编译器的源程序分析(39)goto语句
- 我漂啊,漂啊!
- [转载]LCC编译器的源程序分析(40)赋值表达式树
- [转载]LCC编译器的源程序分析(41)赋值表达式的有向无环图
- C++字符串完全指引之一 —— Win32 字符编码
- [转载]LCC编译器的源程序分析(42)赋值表达式的有向无环图
- ORACLE函数大全
- 转载: SQL Server2000 索引结构及其使用