免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2013-01-20 02:12 |只看该作者
回复 50# starwing83

我果然还是没有把我的重点讲明白啊……我太失败了……

这就好像是:
  1. #include <stdio.h>

  2. class StandardCompiler {
  3. public:
  4.     virtual int getSomething() = 0;
  5. };

  6. class MyCompiler : public StandardCompiler {
  7. public:
  8.     virtual int getSomething() { return 20; }
  9. };

  10. class YourCompiler : public StandardCompiler {
  11. public:
  12.     virtual int getSomething() { return 47; }
  13. };

  14. int main()
  15. {
  16.     StandardCompiler *c = new MyCompiler;
  17.     printf("%d\n", c->getSomething());
  18.     delete c;
  19. }
复制代码
62. 原作者说:StandardCompiler 的 getSomething 返回的应该是 47 吧?我手推的!不保证正确哦……
63. 某 PM 说:不带这样简化的。
64. 原作者说:哦我错了,我基础不好。刚才我编译了一下,在我这里输出的是 20。
65. 原作者说:那我来解释下为什么我这里输出了 20:因为 MyCompiler::getSomething 里明确写着 return 20,所以这段程序输出 20。

然后却有很多人跑出来针对 65 大谈「StandardCompiler::getSomething 不一定返回 20,是未定义的,任何解释都是荒诞可笑的」这种和问题完全无关的真理。重点在于人家 65 不是在试图解释 StandardCompiler::getSomething 而是在试图解释 MyCompiler::getSomething 啊 = =

论坛徽章:
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
52 [报告]
发表于 2013-01-20 09:02 |只看该作者
本帖最后由 starwing83 于 2013-01-20 09:09 编辑

回复 51# timothyqiu


    首先,这是你个人的理解,我可不可以认为这是你个人对原作者意图的臆测?

我这里说明白,我是站在第三方的角度看待问题。我没有试图揣测任何人的想法,仅仅就表现行为作出我自己的判断。(@Ager,现象之外,没有本质)

其次,我指出你的一个错误。MyCompiler::doSomething的原型你搞错了,它不可能是return 20;,它是return aProgram;,然后这个Program是return 20;的。这就是我和你(而不是对方兆国)分歧的本质。

然后,我仔细说说我对方兆国的帖子的看法:

1. 假设方兆国是在如你所说,说明特定编译器产生的程序的行为,那么他最大的一个问题是,没有说明到底是什么编译器产生的这个行为。
2. 他是在说明程序的行为,却没有对产生这个程序的编译器做出任何说明。
3. 首先他的手推就错误了,证明他心中的那个模型实际上没法印证事实,证明他一开始就是在臆测程序的行为,而没有一丁点的证据。之后他承认了自己的错误,却依然将错就错,继续根据结果臆测程序的行为,同样没有给出任何证据,甚至没有说明“这都是我自己猜测的,有办法能证实么?如果有人知道,可以告诉我。”这样的免责话语。这会给初学者带来极大的误导。(虽然这个论坛初学者并不多,但是也并不少)
4. 我所谓的荒谬,就是在指这种武断的臆测行为。甚至PM君的标题(夜郎自大),也是在指责这样的一种臆测行为。就此而言,引用这个帖子是极其合理的。

现在,我加上我的个人臆测——但是我同样不揣测方兆国的意图和想法,我只说,如果我站在65楼的角度,我会怎么说:

0. 我用的是gccXXXX版本(说明编译环境),程序XP下得到了-40的结果。(说明使用的编译器,运行环境和最终结果)
1. 通过查找文档,我所用的编译器没有对这种程序作出任何保证。所以我这里只是解释一下为什么在这个环境下编译出的程序会产生这样的结果。免责声明:“无知是唯一正确的答案。”,这里的说明仅为满足某些人的好奇心,实际上这个结果是在特定环境下偶然发生的,我不保证任何人能得到跟我一样的结果。
2. 通过反编译汇编,我发现我所用的编译器对这个表达式的处理流程是XXXXX这样的,最终得到了-40的结果。
3. 然而,甚至直接改变编译参数,都会导致这个程序的实际行为发生改变,而结果不变,依然是-40,因此我所描述的行为,并不一定就是真实发生的行为。
4. 我上面的描述说明了以下的事实:这个结果本身的运算过程,完全是编译器自行决定的。和C语言本身没有任何关系。这种结果,也决不是因为使用C语言而导致的。这只是一个特定的编译器在特定的环境下产生的特定输出而已。没有任何深究的意义。
5. 所以,请不要依赖编译器本身都没有做出保证的行为。
6. 而编译器之所以没有保证,是因为C语言不要求保证。因此没有保证才是正确的答案。上面描述的过程,仅仅是为了满足某些人的好奇心而已(再次强调)。


明白了吗?首先,方兆国是全凭臆测,没有任何根据。其次,方兆国不明白编译器做了的事情,实际上是可以不做任何保证的(你买过任何电子产品吧?说明书看过了吗?“本产品对包括丢失信息在内的任何损失概不负责”这句话看过了吗?)。最后,方兆国不明白,这种不保证本质上是在保护C语言的使用者。这是C语言自身就故意这样设计的。

这样的情况下,即使是在65楼的情形下,说他的发言荒谬夜郎自大,有问题么?

为什么方兆国不明白编译器实质上可以不保证程序的行为?

因为,他不明白一个最简单的道理。所谓系统,实质上可能指定的是两个完全不相干的东西,一个叫编译系统,一个叫运行时系统。这两者是没有任何联系的。编译器只会保证“我会产生一个程序”,却不一定会保证“我产生的程序在某个系统上运行能产生你想象中的结果”。甚至他会直接告诉你“我不能保证这个程序能产生任何合理的结果。”这种做法恰巧是在保护编译器的使用者。要求他们不要做一些危险的事情:这不是臆测。事实上这个程序如果直接在gcc下编译,gcc会直接在那行代码上做警告说这是未定义的行为。方兆国不明白。程序被产生了,就和编译器没有任何关系了。编译器保证程序的执行过程,和C语言所描述的(包括C语言所不愿描述的)一致,但不保证,这种一致性都有确定(哪怕每次都一样)的结果。程序的编译(从C语言的被良好定义的语义转换为实际做事情的那个实体)和程序的执行(那个包含了被转换的语义的实体实际做的事情)是没有关系的。

为什么会导致这个结果呢?这里容我揣测。因为谭浩强的书。事实上谭浩强最早入门的编程语言是BASIC。这门语言反而是不分编译系统和运行时系统的。因为它是解释型语言;这门语言最初也是不存在所谓的“未定义行为”的,因为它不是一个标准,而是一个商品。商品所有的行为,都是确定的。它不是一个生产工具,而只是一个自己可以执行所有过程的完全品而已。谭浩强从一开始就不明白一个编译器应该有什么样的作为(或者什么样的不作为),这是谭浩强带来的最深重的灾难之一。在DOS的年代,这不算什么,但是在现代,这种误导是致命性的。这就是PM的行为的理由之一。

这也是为什么我反复指出@方兆国的谬误之处的原因之一:因为这种误解,会给之后的学习,带来极大的损害。必须要先根除这种误解,才能投入真正的开发中,理解开发中的一些很微妙的特定情形(比如何时使用断言这样的知识)。





论坛徽章:
0
53 [报告]
发表于 2013-01-20 10:12 |只看该作者
回复 52# starwing83

呃……虽然很讨厌用以下方式讨论问题,不过木有办法:

首先,这是你个人的理解,我可不可以认为这是你个人对原作者意图的臆测?我这里说明白,我是站在第三方的角度看待问题。我没有试图揣测任何人的想法,仅仅就表现行为作出我自己的判断。(@Ager,现象之外,没有本质)

你当然可以这么认为。但即使你认为我的说法是对原作者意图的臆测,我依然认为我没有试图揣测任何人的想法,我同样只是根据作者的文字进行了判断
当然你也可以认为这是我的一厢情愿。

其次,我指出你的一个错误。MyCompiler::doSomething的原型你搞错了,它不可能是return 20;,它是return aProgram;,然后这个Program是return 20;的。这就是我和你(而不是对方兆国)分歧的本质。

这只是一个例子,我觉得不需要事无巨细,所以直接 return 20 了。
我的例子本意想表达「不同编译器可能得出不同结果」,所以在例子里写 return 20 和 return aProgram that returns 20 没什么大区别……当然如果我这里说得不对的话,还请指出。

然后,我仔细说说我对方兆国的帖子的看法:

1. 假设方兆国是在如你所说,说明特定编译器产生的程序的行为,那么他最大的一个问题是,没有说明到底是什么编译器产生的这个行为。
2. 他是在说明程序的行为,却没有对产生这个程序的编译器做出任何说明。
3. 首先他的手推就错误了,证明他心中的那个模型实际上没法印证事实,证明他一开始就是在臆测程序的行为,而没有一丁点的证据。之后他承认了自己的错误,却依然将错就错,继续根据结果臆测程序的行为,同样没有给出任何证据,甚至没有说明“这都是我自己猜测的,有办法能证实么?如果有人知道,可以告诉我。”这样的免责话语。这会给初学者带来极大的误导。(虽然这个论坛初学者并不多,但是也并不少)
4. 我所谓的荒谬,就是在指这种武断的臆测行为。甚至PM君的标题(夜郎自大),也是在指责这样的一种臆测行为。就此而言,引用这个帖子是极其合理的。

看到这里我有点理解你了。你是站在「所有论坛里的帖子都是给初学者的示范,犯错是难以容忍的」的角度看的原作者的帖子(吧?),所以原作者说错话了就是荒谬的。但我是站在「该帖子是原作者和 PM 的一次讨论会话的一部分」的角度看的。

原作者的帖子确实缺少环境描述,但既然引用了 64 楼,就说明了「是针对某个特定的环境下的行为作出的解释」。如果要求原作者说出的每句话都是完整的真理,那么确实,他缺少了「我用的是 gcc 的 XXXX 版本,程序在 XP 下得到结果 -40」;但作为一个讨论,我没有看出这种必要,对方如果需要这些信息可以跟帖索取。(就好象日常交流中有人问你水烧到什么程度能喝,你不会每次都说「我们在北纬XX度的位置,在这里水沸腾了的话水就可以喝了」,而只会说「水沸腾了的话水就可以喝了」)

(尽管这可能就是你所谓的对作者意图的臆测,但)我依旧理解为最简单:65 楼是为了避免自己的尴尬或者好奇心(臆测),尝试对 64 楼进行解释。一个是为了避免尴尬或者因为好奇心所以作出了如此行为,一个是夜郎自大将错就错所以作出了如此行为,究竟哪个是真相只有作者本人知道,但我选择相信前者是出于善意推定原则(当然你也可以说这是臆测)。

题外话,出于上面所述的原因,我看不出来 原作者是否明白这些知识 和 他 65 楼的帖子是否荒谬 有什么联系。

论坛徽章:
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
54 [报告]
发表于 2013-01-20 10:33 |只看该作者
回复 53# timothyqiu


    关键分歧就在这里了。我觉得方兆国的这种讨论方式至少是不负责任的。这种行为是很严重的,而你认为这是无心之过。

不管是不是无心之过吧。至少他在讨论问题时,缺乏严谨的态度,以臆测代替事实却不自觉,这一点如果达成共识,那就行了。

PS:这就是我所谓的夜郎自大(自己认为的就是真理)。

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
55 [报告]
发表于 2013-01-20 10:37 |只看该作者
starwing83 发表于 2013-01-20 09:02
回复 51# timothyqiu

为什么会导致这个结果呢?这里容我揣测。因为谭浩强的书。事实上谭浩强最早入门的编程语言是BASIC。这门语言反而是不分编译系统和运行时系统的。因为它是解释型语言;这门语言最初也是不存在所谓的“未定义行为”的,因为它不是一个标准,而是一个商品。商品所有的行为,都是确定的。它不是一个生产工具,而只是一个自己可以执行所有过程的完全品而已。谭浩强从一开始就不明白一个编译器应该有什么样的作为(或者什么样的不作为),这是谭浩强带来的最深重的灾难之一。在DOS的年代,这不算什么,但是在现代,这种误导是致命性的。这就是PM的行为的理由之一。


SW你说到点子上了!至少,这种作为思维必要的揣测,揣的方向是非常合理的!

论坛徽章:
0
56 [报告]
发表于 2013-01-20 10:48 |只看该作者
回复 54# starwing83

嗯,确实。

(讨论嘛~双方各抒己见,把自己的观点清楚地表达出来就是了,总会发现有些错误的地方 ╮(╯▽╰)╭ 如果双方说的都是对的,从一开始就不会有进行讨论的必要)

论坛徽章:
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
57 [报告]
发表于 2013-01-20 10:49 |只看该作者
回复 54# starwing83


关于那个对a+=a-=a*a的测试,只是说明我之前的手推是错误的,而且我在上面也有明确的运行环境说明,有截屏为证,Windows 7编译器是gcc

这就是对一个确定的商品而言的,当时,pm只是一味的否定谭浩强,(其实现在也一样,只不过增加了一个抨击我)


   



论坛徽章:
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
58 [报告]
发表于 2013-01-20 10:56 |只看该作者
回复 50# starwing83


    话说我就是在描述那个结果呀?而且我发了那个帖子后,只见pm抨击,可是从没见pm解释(话说pm的几乎任何帖子都只是在抨击别人,而不是给别人纠正错误。请注意这个几乎,谢谢)

论坛徽章:
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
59 [报告]
发表于 2013-01-20 11:00 |只看该作者
timothyqiu 发表于 2013-01-20 10:48
回复 54# starwing83

嗯,确实。
@starwing83

对啊,不懂把自己的想法说出来大家一起讨论,纠正错误,这才叫论坛。不懂装懂,一味的抨击别人,这叫论坛吗?

论坛徽章:
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
60 [报告]
发表于 2013-01-20 11:05 |只看该作者
@starwing83@Ager

为啥你们就这么喜欢找我的错呢?是因为我的态度比较好吗,乐意承认错误?

pm连main函数返回值什么的都完全不懂,给我一种没有学过C语言的感觉,也没见你们纠正错误啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP