免费注册 查看新帖 |

Chinaunix

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

[其他] 《C语言入门很简单》有奖试读!欢迎大家参与!(获奖名单已公布-2012-10-31) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-09-01 00:35 |只看该作者
回复 30# fergon


    一看“抽象问题具体化”,就应该觉得不对劲啊。好的书就是要把各种情况进行概括总结,抽象化,可这个作者直接回去了。

论坛徽章:
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
32 [报告]
发表于 2012-09-01 05:35 |只看该作者
本帖最后由 Ager 于 2012-09-01 05:36 编辑
x5miao 发表于 2012-09-01 00:35
好的书就是要把各种情况进行概括总结,抽象化


这个嘛,还真是不一定的。

有的书,能够把具体的、繁杂的实例,做精确而严密的抽象、提纯、概括、总结,那么,以实现形而上学为指标的话,这本书,就是好书。

而有的书,其目的就是在于搁置形而上学的观念,通过叙事文体,为读者描摹(还原)出实例的关于实例现场的存在感,那么,好书的指标就在于它不做粗暴的抽象与概括,而是为读者提供恰当的、丰富的意义理解空间。

对于楼主介绍的这本书(这一类书)来说,我觉得,好书的标准应该是:兼顾具体化与抽象化,对于前者,应做到诚实而耐心的还原(让读者对每个必要环节都能踏实领略),对于后者,应做到富有洞见性的启发(让读者吸收举一反三、触类旁通的能力)。

但是,这本书中出现了这句话 ——“(本书)是一本化繁为简,把“抽象”问题“具体”化,把复杂问题简单化的书” —— 恐怕就预示了,此书不太可能成为一本上述指标下的好书。

写这句话的作者,在这个问题上的思路,可能是混乱或草率的。用西方学界流行的话说,这是一个“承诺与风险”的问题。

作者在做出那样的承诺的同时,他(们)面临了以下两项风险:

(1)把“抽象”问题“具体”化 —— 这对作者重新构建问题(实例)现场的能力,是一个很大的考验。能吸引读者投入热情、智力与坚持,这更是难上加难 —— 这要求作者具有很卓越的技巧去驾驭读者的阅读节奏,那么,书章内容本身的节奏,就要张驰得恰到好处。如此功力,类似于作曲家的。

(2)把复杂问题简单化 —— 这种承诺,很可能是一个陷阱(连作者自己都会被陷进去)。问题之所以复杂,在于问题固有的复杂属性(这好像一句废话)。那么,通常,作者能够处理“把复杂问题简单化”这件事情,是靠:削减复杂的或枝杈性的因素,判断各因素的重要程度而对它们分别作出丰俭(这点也是相当困难的)—— 这其实是走形而上路线,那么,这恰恰是与上一个承诺“把‘抽象’问题‘具体’化”相互抵牾(至少是在作者所宣称的那个意义的字面上)。

总的说来,“把复杂问题简单化”,必然就要冒着失真、曲解和过度阐释的风险,很容易造出没有实际价值却看上去十分豪壮的口号或教条。有趣的是,“把复杂问题简单化”这句话本身,就很可能是这麽一种口号。

渴求规律,希望简化,试图将信息删繁就简、条分缕析地放进储存记忆的U盘,是作为信息接受者的最常有的心理定势。喜欢概括,喜欢让事物显得有条有理的心理惯性,一直在妨碍我们了解事物的复杂和复杂的事物。我们无法在不编造理由或强加一种逻辑关系的情况下去观察一系列事实。我们让记忆符合我们假定的某种因果关系,在不自觉和无意识的情况下改写了它们。” —— N. N. Taleb

观念在群体中一般都会被简化,因为大众总是喜欢简单明了的观念。” —— 蔡禹僧

呵呵,又扯了一大通 …… 仅供参考:)


论坛徽章:
0
33 [报告]
发表于 2012-09-01 07:03 |只看该作者
那个空语句的论述实在是太经典了,这种水平还出书实在太屈才了,作者还是去做拯救地球这种更有意义的事情去吧,别再浪费时间写书了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
34 [报告]
发表于 2012-09-01 07:22 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
35 [报告]
发表于 2012-09-01 15:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
36 [报告]
发表于 2012-09-01 15:07 |只看该作者
pmerofc 发表于 2012-09-01 15:01
这代码是否有点傻


这人的思维很扭曲 ,!

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
37 [报告]
发表于 2012-09-01 16:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
38 [报告]
发表于 2012-09-01 16:26 |只看该作者
本帖最后由 Ager 于 2012-11-06 22:15 编辑

回复 30# fergon


fergon 发表于 2012-08-31 22:36

第4章 “空语句”
----彻底无语,为什么作者会产生这样的概念?


2.空语句
空语句在 C语言中很少用到,它的作用就是什么都不干,让计算机空转,它的主要目
的就和我们军训的时候原地踏步是一样的,是为了暂时等待其他的东西先完成。
空语句的形式为一个简单的“;”,其他什么都没有:

;

一个单独的分号就是告诉计算机,先等一等,在此暂留一步,然后再往下执行其他的
语句。



本书的作者将C语言中的空语句(Null Statement)理解为“延时作用”,我猜想,有两种可能性:

(可能性一)该作者可能是把C这样的编译型语言,用解释型语言的观念去理解了。在解释型语言中,解释器遭遇类似的语句,肯定会有一个微小的时间消耗。其实,对于C这样的编译型语言,编译器遭遇类似的语句(比如在词法分析阶段),也会有一个微小的时间消耗。但是,在编译后产生的汇编代码中,空语句用以界定程序逻辑结构的使命已无需再存续(在Syntax分析阶段它已被消化),所以,汇编代码中没有任何指令与空语句对应,所以,在最终产生的可执行代码中,根本也不存在延时效应。

(可能性二)该作者可能受其他错误教本(或网上错误信息资源)的影响,比如,在《百度知道》中(地址:http://zhidao.baidu.com/question/88102111.html),

有一个“最佳答案”就是这样的:

空语句一般有以下几个用途:

1.纯粹消耗CPU时间,起到延时的作用,但是注意一下,"雨落深山"说的有问题的,在嵌入式系统中一般不会这么用,原因如下:

・对于嵌入式系统来讲,不论是哪种系统,一般下位芯片级的时间单位为Tick,这样的处理单位对于Tick来说太粗略了。

但是在嵌入式系统中,有一种情况下会用到:

・不需要很高的精确度,并且要避免引起Task切替的延迟处理时,有时会这么用。因为起计时器进行延迟的话,超时处理会引起调度进程的轮循,出现Task切替。

2.为了程序的结构清楚,可读性好,以后扩充新功能方便。有些公司的编码规范要求,对于if/else语句等,如果分支不配对的话,需要用空语句进行配对,一般日系企业这么要求的比较多。

例如:
正常的这么做就行:
if(XXX)
{
XXXXX
}
但是编码规范要求,必须这么写
if(XXX)
{
XXXXX
}
else
{
;
}

3. 对于某些大型的软件项目,特别是一些嵌入式项目,处于自动化测试的需要,要求必须进行语句(例如,if/else语句)的配对。

在进行代码静态解析,单体测试Case抽出的时候,为了保证全路径覆盖,很多专业的高端自动测试工具,会建议进行语句(例如,if/else语句)的配对。此时对于一些不完备的分支,就会用空语句补全。

回答者: 希声和寡 | 十三级 名人


“其他回答”有两条,分别是:

雨落深山 | 八级

循环,消磨时间用的,可以用做最土的定时器。

在嵌入式系统中有广泛的用途。

空语句仅由一个分号组成,不进行任何操作。一般用于语法上要求有一条语句但实际没有任何操作的场合。例如:

for(i=1;i<10;i++); //空语句,起延时作用


shaocl112102 | 四级

延迟的!


仔细体察,为什么许多读者和作者,会认为C语言里的空语句是起“延时作用”的呢?

我猜想是这样的 …… 因为
  1. for(i=1;i<10;i++);
复制代码
这样的代码,在最终的执行阶段,的确是造成了延时效应。但是,这是空语句造成的吗?

其实不是!

我们看反汇编:
  1. 08048394 <main>:
  2. int main(){
  3.         ……        ……
  4. for(int i=1;i<10;i++);
  5. 804839a:       c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)
  6. 80483a1:       eb 04                   jmp    80483a7 <main+0x13>
  7. 80483a3:       83 45 fc 01             addl   $0x1,-0x4(%ebp)
  8. 80483a7:       83 7d fc 09             cmpl   $0x9,-0x4(%ebp)
  9. 80483ab:       7e f6                   jle    80483a3 <main+0xf>
  10.         ……        ……
  11. }
复制代码
在源程序的这一行代码中,最终消耗时间的肇因是for,具体地说,是for的控制表达式。

此处的一个分号(在这种情况下造成空语句),只是令for语句得以在此处完全结束(而不与分号后面的代码粘黏而构成一个更大的for语句)—— 我这麽说,你千万不要认为:for语句需要一个分号结尾,才能构成完整的for语句。其实,跟表达式语句(一个表达式加一个分号)不同,for语句(还有各分支/循环语句)并不需要分号作为其完整语句的结束标志。此处的分号,所构成的空语句,是充当了
  1. for (控制表达式1; 控制表达式2; 控制表达式3) 语句X
复制代码
中的“语句X”的内容。

for在"找到"紧跟在它后面的括号(及其中的合法内容)之后,就要去“找到”紧跟在括号后面的第一个语句或第一个语句块(Statement Block)作为“语句X”,这样,一个完整的for语句就构成了。

只要能够让for语句不与其后面的代码粘黏而构成一个更大的for语句,除了起上述作用分号,其他具有界定语义独立性的逻辑功能的符号,也都可以拿来用,比如,用来界定语句块的花括号对,就可以拿来实现上述作用。

我们看反汇编:
  1. 08048394 <main>:
  2. int main(){
  3.         ……        ……         
  4. for(int i=1;i<10;i++){}
  5. 804839a:       c7 45 fc 01 00 00 00    movl   $0x1,-0x4(%ebp)
  6. 80483a1:       eb 04                   jmp    80483a7 <main+0x13>
  7. 80483a3:       83 45 fc 01             addl   $0x1,-0x4(%ebp)
  8. 80483a7:       83 7d fc 09             cmpl   $0x9,-0x4(%ebp)
  9. 80483ab:       7e f6                   jle    80483a3 <main+0xf>
  10.         ……        ……       
  11. }
复制代码
你看,
  1. for(int i=1;i<10;i++);
复制代码
  1. for(int i=1;i<10;i++){}
复制代码
编译出来的指令,是完全一致的!

所以说,这些起着界定语义逻辑作用的符号,在生成汇编代码之前的Syntax分析阶段就已经被消化。在汇编代码以及最终的可执行代码中,这类符号是无法直观地被察觉到的。我认为,这也就是低级语言的代码序列难以“还原”成人们可以比较轻易自然解读其逻辑或结构的语言文本(比如高级编程语言程序代码)的主要原因之一。

那么,该书中把由单独一个分号所造成的空语句与“延时效应”如此直接挂钩的思路,是非常粗陋的,并且是错谬的。

(可能性三)该作者可能混淆(或没有认识到)了不同语言中的“空语句”机制。

比如,在汇编语言中,“空语句”机制由nop指令体现。nop指令,是一个有着明确的时间延宕作用的指令。

“巧合”的是,在IBM的Rexx语言中,有一种与nop指令同名的nop语句,例子如下:
  1. if x = "ZERO" then
  2.       nop   
  3. else
  4.       say "THIS NUMBER IS NOT ZERO"
复制代码
在我看到的语言手册中,只写明了,此nop语句具有跟现代高级编程语言中的由单独一个分号所构成的空语句相同的作用,至于nop语句本身是否有时间延宕作用,我就不敢贸然断言了。

其实,“空语句”是编程语言中的一个“小难点”,它带来的问题有很多,都不能轻易忽视。该书中一句“空语句在 C语言中很少用到”,恐怕实在是太浅陋了。

fergon 发表于 2012-08-31 22:36

第3章 赋值的作用---把数据存起来
----实在是看不下去了,简直是脑残式的天马行空。


结合该书作者对“赋值”的理解的表述,我猜想,该书作者可能受一些原始又不准确的关于解释型编程语言的教本影响颇深,严重怀疑受谭老教授计算机教学体系之浸淫。

呵呵,又扯了一大通,仅供参考,望各位大虾指教,呵呵…… :)




   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
39 [报告]
发表于 2012-09-01 16:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
40 [报告]
发表于 2012-09-01 17:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP