免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] “无知不可怕,可怕的是夜郎自大”——方兆国的奇葩贴汇总 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
151 [报告]
发表于 2013-01-21 17:31 |只看该作者
回复 149# zylthinking


    有人说的很清楚,标准派和编译器派一起是没法有共同语言的。

所谓函数返回值,是指函数返回给函数调用者的唯一的一个值,不是eax的值,也不是r1的值,更不是esp指向的内存单元里面的值。

明白意思么?别把语言和实现搞混了。恰好C语言又是个三向过程,main返回又是C和POSIX的一个很暧昧的交换点。不带你这么搅混水的。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
152 [报告]
发表于 2013-01-21 17:34 |只看该作者
回复 148# starwing83


    那么其他被调函数也没有返回值了???
都是进程或者线程结束后,将运行结果返回给主调者

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
153 [报告]
发表于 2013-01-21 17:34 |只看该作者
starwing83 发表于 2013-01-21 17:31
回复 149# zylthinking


嗯, 对呀, 返回值是函数返回给调用者的唯一的值, 那你拿 longjmp 之类的函数来证明函数有可能没有返回值是什么意思, 莫非就不是搅浑水了, 也不带你这样搅浑水的, 所以嘛, 早就说了, 就看你站在哪边了。
十字路口, 左走右走, 凭啥你说的就有道理, 我说的就是搅浑水?

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
154 [报告]
发表于 2013-01-21 17:35 |只看该作者
回复 148# starwing83


    进程不给系统返回那个main函数的返回值,那它返回什么?那还给一个随机数么?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
155 [报告]
发表于 2013-01-21 17:38 |只看该作者
回复 152# 方兆国


    继续开始混了。我至少看出来你没理解进程,和“调用main函数”之间的区别了。

你还真说对了,还真可能返回一个默认值。你随便找个依赖dll的命令行工具,然后删了那个dll,看看那个工具返回一个什么值。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
156 [报告]
发表于 2013-01-21 17:40 |只看该作者
回复 153# zylthinking


    可是函数是可以不返回的啊……………………比如说当函数调用longjmp以后,函数本身都不返回了,那怎么可能有返回值?就算有,也得有东西能收吧?C语言里面可没有一个一直存在的eax啊。

所以,函数如果有返回值,一定是return且唯一的。但是,函数也可能没有返回值。

谭浩强的问题跟这个没关系。这个的问题是方兆国的。他觉得函数就一定有返回值。而且就算中间中断了不返回了。函数都要凑个随机的值出来,这样才对进程返回值有交代。但事实是,函数不需要有任何交代,是其他的地方产生进程返回值的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
157 [报告]
发表于 2013-01-21 17:51 |只看该作者
本帖最后由 zylthinking 于 2013-01-21 17:52 编辑
starwing83 发表于 2013-01-21 17:40
回复 153# zylthinking
可是函数是可以不返回的啊……………………比如说当函数调用longjmp以后,函数本身都不返回了,那怎么可能有返回值?就算有,也得有东西能收吧?C语言里面可没有一个一直存在的eax啊。

照你这么说, 一个从来不被调用的函数就不存在返回值了是么?
这怎么我感觉我反而更象一个标准派了呢

c语言是不存在 eax, 所以我说的是某个寄存器, 可没有指名道姓;
就算 c 程序运行在大脑里面, 也总有个细胞保存某个值吧,就算不是细胞, 也总有个其他什么东西来保证  
1. 它确实存在, 有它和没它是不一样的, 就算 clone 这个人, 你不将它 clone 进去, 这2个就不是一样的人 2. 他有个值, 不同的值是不一样的;
我就叫它寄存器不成么

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
158 [报告]
发表于 2013-01-21 18:01 |只看该作者
回复 157# zylthinking


    一个从没调用的函数的确没有返回值。如同一个从没生下的孩子肯定不会有儿子。

返回值是“值”,值是运行时概念。函数的声明里面那个东西叫“返回值类型”,不代表那玩意儿就是返回值。

函数未必有返回值。如果有,也只有一个返回值。

你果然还是“觉得”你是标准派么?您的感觉真灵。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
159 [报告]
发表于 2013-01-21 18:07 |只看该作者
本帖最后由 zylthinking 于 2013-01-21 18:10 编辑
starwing83 发表于 2013-01-21 18:01
回复 157# zylthinking


好吧 好吧, 我不是标准派, 论咬文嚼字, 你比我强多了

不对, 在运行时, 我他娘的就是说某个寄存器的值就是他的返回值, 返回值的定义就是函数退出后执行第一条函数外指令前的某个寄存器的值。 你怎么反驳

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
160 [报告]
发表于 2013-01-21 18:08 |只看该作者
方兆国 发表于 2013-01-21 17:35
回复 148# starwing83

进程不给系统返回那个main函数的返回值,那它返回什么?那还给一个随机数么?


这个还真有可能,具体的实现里,很多系统是通过一个crt0.o之类的stub调用main函数的,进程的退出码(exit code,这货不叫“返回值”)也是crt0.o设置的。
一般情况下,crt0.o都会将main函数的返回值作为退出码给OS,但是很多系统都允许你自己提供一个crt0.o,也就是说,不管main函数返回值是神马,crt0.o想给OS设置神马退出码都可以,当然也可以是个随机数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP