免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2270 | 回复: 6
打印 上一主题 下一主题

[函数] void限制函数返回的疑惑。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-26 20:34 |只看该作者 |倒序浏览
1:  printf("abc");
2:  int i = printf("abc");
3:  (void)printf("abc");

对于1,2两种情况,毫无疑问有个int型变量生成了,值是3(调用成功的话),不管你要不要。
那第3种情况呢?疑惑有二:
一。函数调用应该不符合词法的规范吧,就是说没有优先级结合性之类的东西。对吗?(就是说函数调用不是运算符,当然如果是运算符,也不需要void(即使合法,也没有意义))
二。如果一成立,那么这个int型,值为3的变量到底有没有生成? 是根本没有生成,还是生成了但又被限制没了?是相当于把printf函数改成了void printf(const char FMT, ...); 还是相当于先执行了第2种情况,然后(void)i?

ps: 我在看openbsd的源代码时发现很多3这样的情况,而一般我们都用1,我不知道多写一个void是为了省一点空间还是为了安全?(觉得好像这点东西扯不上安全不安全的,可看

openbsd的代码,满脑子都在想安全。。。)

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2007-06-26 20:46 |只看该作者
第三种情况纯粹就是为了防止编译器和一些静态代码检测工具的警告。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-06-26 20:49 |只看该作者
原帖由 hcq0411 于 2007-6-26 20:34 发表
一。函数调用应该不符合词法的规范吧,就是说没有优先级结合性之类的东西。对吗?(就是说函数调用不是运算符,当然如果是运算符,也不需要void(即使合法,也没有意义))

函数调用也是 operator,也涉及到优先级的问题。
二。如果一成立,那么这个int型,值为3的变量到底有没有生成? 是根本没有生成,还是生成了但又被限制没了?是相当于把printf函数改成了void printf(const char FMT, ...); 还是相当于先执行了第2种情况,然后(void)i?

是相当于先执行了第2种情况,然后(void)i。

论坛徽章:
0
4 [报告]
发表于 2007-06-26 20:58 |只看该作者
原帖由 hcq0411 于 2007-6-26 20:34 发表
1:  printf("abc");
2:  int i = printf("abc");
3:  (void)printf("abc");

对于1,2两种情况,毫无疑问有个int型变量生成了,值是3(调用成功的话),不管你要不要。
那第3种 ...

>>我在看openbsd的源代码时发现很多3这样的情况,而一般我们都用1,我不知道多写一个void是为了省一点空间还是为了安全?
除了2之外,1,3都不会浪费空间。因为一般都有一个寄存器用来存放返回值,例如x86上的eax,ia64上的r8。这里函数执行完后,返回值放在寄存器中,对于1、3两种情况,只是寄存器中的值没有被用到而已,并不会放到内存中去。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2007-06-26 21:16 |只看该作者
原帖由 zx_wing 于 2007-6-26 20:58 发表

>>我在看openbsd的源代码时发现很多3这样的情况,而一般我们都用1,我不知道多写一个void是为了省一点空间还是为了安全?
除了2之外,1,3都不会浪费空间。因为一般都有一个寄存器用来存放返回值,例如x ...

你的问题二楼已经回答过了。

论坛徽章:
0
6 [报告]
发表于 2007-06-26 23:34 |只看该作者
原帖由 lenovo 于 2007-6-26 21:16 发表

你的问题二楼已经回答过了。


>> 是邮件中常用的引用符号,由这对符号开头的行一般被认为是引用别人说话的部分

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-06-27 09:23 |只看该作者
原帖由 langue 于 2007-6-26 23:34 发表


>> 是邮件中常用的引用符号,由这对符号开头的行一般被认为是引用别人说话的部分

这才发现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP