Chinaunix

标题: 以其昏昏,使人昭昭? [打印本页]

作者: pmerofc    时间: 2010-04-06 20:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: OwnWaterloo    时间: 2010-04-06 21:18
跟风点火。
林教授的《高质量》, 前面没仔细看; 最后的笔试题没有一道题目是科学的。

还有许多*nix的书籍(就不点名了), 写出来不是为了育人, 而仅仅是显摆自己是个geek。

数据结构相关的众多书籍, 你抄我我抄你。 目录内容雷同。
不同之处在于有些内容在某些书上是*星号*内容, 而有些内容在某些书上直接被删除。
搞得像高数1、高数2……高数4一样。
作者: A.com    时间: 2010-04-06 21:18
谭老师的书里面,类似的不知所谓的地方多了去了。
作者: pmerofc    时间: 2010-04-06 21:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-06 21:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: flw    时间: 2010-04-06 21:52
我觉得这段讲的挺好的。
作者: pmerofc    时间: 2010-04-06 22:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: hahajerry007    时间: 2010-04-06 22:10
一直觉得国内的编程书像数学书,主要指的是文字叙述。读起来很累很累。。。。。。
作者: ztz0223    时间: 2010-04-06 22:12
呵呵
加油
作者: Ray001    时间: 2010-04-06 22:13
这种编程风格确实垃圾啊,可读性太差了。不知道教材里有没有注明应该避免使用。{:3_195:}
作者: pmerofc    时间: 2010-04-06 22:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: koolcoy    时间: 2010-04-06 23:15

  1. int a = 12;
  2. a+=a-=a*a;
复制代码
其实如果你认真看一下的话就会发现,这个表达式是一个正确的表达式,而且a的值是确定的,无论啥平台{:3_182:}{:3_193:}
作者: sh19871122    时间: 2010-04-06 23:20
MD,上面的是没风格
作者: 群雄逐鹿中原    时间: 2010-04-06 23:31
隱約覺得LZ的書會遭受更大的批判。
作者: fender0107401    时间: 2010-04-06 23:33
其实如果你认真看一下的话就会发现,这个表达式是一个正确的表达式,而且a的值是确定的,无论啥平台{:3_182 ...
koolcoy 发表于 2010-04-06 23:15


这么写的都是贱人。
作者: mik    时间: 2010-04-06 23:36
本帖最后由 pmerofc 于 2010-04-06 22:17 编辑

应某出版社之约,拟就国内C语言“主流教材”中的错误、误导和不良风格等写点东西。
    在正式动笔之前和大家(除了“星宿”派的弱智以外)交流一下,非常希望能得到大家的批评、指正和建议。



  

QUOTE:赋值表达式也可以包括复合的赋值运算符。例如:
a+=a-=a*a
也是一个赋值表达式。如果a的初值为12,此赋值表达式的求解步骤如下:
①先进行“a-=a*a”的运算,它相当于a=a-a*a,a的值为12-144=132。
②再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264。

p64,《C程序设计》(第三版),谭浩强 著,清华大学出版社,2005年7月第3版,2009年10月第26次印刷

评:“a+=a-=a*a”这个表达式本身就是错误的,怎么居然还能分析出求解步骤呢?
]


谭的书虽然写得不好,风格差

但:就你这个白痴水平,还评论别人,佩服你


看看编译器是怎样编译的:

  a+=a-=a*a;
010A34B5 8B 45 F8             mov         eax,dword ptr [a]  
010A34B8 0F AF 45 F8          imul        eax,dword ptr [a]  
010A34BC 8B 4D F8             mov         ecx,dword ptr [a]  
010A34BF 2B C8                sub         ecx,eax  
010A34C1 89 4D F8             mov         dword ptr [a],ecx  
010A34C4 8B 55 F8             mov         edx,dword ptr [a]  
010A34C7 03 55 F8             add         edx,dword ptr [a]  
010A34CA 89 55 F8             mov         dword ptr [a],edx  

--------------------------------------------------------------------
看看谭的分析,是错了还是对了

可能有些编译器会出现未定义行为

总比你一句话就说错误强多了,还评论,你不笑死人


我不是谭迷,只不过为他说了两句,就被你冠上谭迷,正白痴


真想,见你一次就骂你一次:白痴
作者: jerryz920    时间: 2010-04-07 03:01
恩,确实没有语法错误,icc,gcc,vc优化下测试是正确的。

不过这种代码实在是没有办法看。写程序的人从一开始就应该被教导风格问题的重要性,这种习惯不是一朝一夕养成的,养成了又不是一朝一夕能换掉的
作者: pmerofc    时间: 2010-04-07 06:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 08:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: hellioncu    时间: 2010-04-07 08:54
纠缠于 a+=a-=a*a 对不对没有多少意义,实际上我们会避免类似的写法。LZ如果真要写书,建议还是不要写这方面的,教人一些细枝末节的东西,写不出好程序。
作者: pmerofc    时间: 2010-04-07 09:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: hellioncu    时间: 2010-04-07 09:36
教初学者C/C++,应该先告诉他一条简单正确的路,而不是告诉他有多少条路可以选。还没学会写程序就开始玩技巧,最后多半被玩死。
作者: hellioncu    时间: 2010-04-07 09:37
90年左右,那时候似乎也只有谭的书,不能抹杀他的功劳。
作者: yug1129    时间: 2010-04-07 10:23
1    我认为回避“ a+=a-=a*a 对不对”是自欺欺人
   
2    这不是细节,是常识
   
3    程序恰恰是细节组成的,不懂得这一点根本不懂编程


“ a+=a-=a*a ”这类的东西在程序设计中是绝对应该回避的。写程序是为了有效地解决问题,而不是写一些似是而非的脑筋急转弯似的题目去考别人。因此程序的可读性非常重要,特别是当程序规模逐渐增大时。程序的细节确实很重要,但这指的是在正确方向指导下的细节。诸如“ a+=a-=a*a ”之类的细节在规范的程序设计中是没有用处的。打个比方,在过马路时应该走人行横道或者过街天桥,而不是学习在飞驰的车流中闪转腾挪的技巧。
作者: blueheavenljn    时间: 2010-04-07 10:27
楼主赶紧出书吧,百家争鸣么,我好多学学
作者: gz80    时间: 2010-04-07 10:53
我本人也发表过一些文章,感觉的lz措辞不是很正确,a+=a-=a*a并不是错误,只是不推荐而已。就像递归在一般项目中不推荐使用,但难道递归也是错误吗?
作者: flw    时间: 2010-04-07 11:54
敢问哪段?
  "(a=3*5)=4*3"?
pmerofc 发表于 2010-04-06 22:03


作者: flw    时间: 2010-04-07 11:55
教初学者C/C++,应该先告诉他一条简单正确的路,而不是告诉他有多少条路可以选。还没学会写程序就开始玩技巧 ...
hellioncu 发表于 2010-04-07 09:36

我不这么认为。
小时候学过《群鸟学艺》吧?
简单正确的路,就怕好多人学了一半,然后就说“原来这么简单”,然后就止步不前了……
作者: hellioncu    时间: 2010-04-07 12:04
我不这么认为。
小时候学过《群鸟学艺》吧?
简单正确的路,就怕好多人学了一半,然后就说“原来这么简 ...
flw 发表于 2010-04-07 11:55



    主要是我担心很多人一开始被细节搞昏了头,打退堂鼓,主要的东西也学不好了。
作者: x2    时间: 2010-04-07 12:07
再比如这个?

  1. int z = 0x12345678;
  2. char *s = (char*)&z;
复制代码

作者: flw    时间: 2010-04-07 12:08
主要是我担心很多人一开始被细节搞昏了头,打退堂鼓,主要的东西也学不好了。
hellioncu 发表于 2010-04-07 12:04

对头,我觉得打退堂鼓那就对了。

现在的垃圾程序和垃圾程序员越来越多了,
就是因为他们没有打退堂鼓的原因。

现在的精英程序员工资越来越低了,
就是因为是个人都不会打退堂鼓所以显得没技术含量的原因。

建议十个里面 pass 九个,剩下那个高薪,给所有的人一个奔头!
不要搞的现在这样,写程序还不如去卖白菜呢。
作者: x2    时间: 2010-04-07 12:23
看来,“即使我否定了敷粉的发辫,我还是要同没有敷粉的发辫打交道”
   
【Between the previ ...
pmerofc 发表于 2010-04-07 06:49



    不错,行为不确定很麻烦。
作者: Ray001    时间: 2010-04-07 12:31
谭老师的书,从目录上看,应该是面向初学者的,搞这些稀奇古怪的名堂确实不对。如果他另写一本书,叫《高级C语言》《深入C语言》之类的,估计会少挨很多批评。
作者: yaoaiguo    时间: 2010-04-07 13:00
我觉得楼主才是 “以其昏昏,使人昭昭”

首先声明我对谭浩强的书不感冒,以免被骂。

其次,我觉得

a+=a-=a*a;

这明明是个正确的表达式。

难看是难看,但是人家是正确的。

不知道楼主长的是不是很漂亮, 但是长的丑的人就都没有生存权利了?

难看的风格和错误的代码完全是两回事。

就像老罗说的,骂人要骂到点子上,才有说服力。

楼主上来就骂错了,所以实在没说服力。
作者: yaoaiguo    时间: 2010-04-07 13:09
楼主还引用一大堆英文证明自己的观点,实在让人厌恶,中国人为啥不说中国话呢?

而且很多书只是教科书,只是举例子说明一些问题,让人好有印象。

打个比方,经典的小学应用题,一个池子一边灌水,一边放水,多长时间能灌满?

诸如此类,并不表示真有人这么干。

总之,动不动就说别人白痴脑残的是很讨厌的。
作者: flw    时间: 2010-04-07 13:13
楼主还引用一大堆英文证明自己的观点,实在让人厌恶,中国人为啥不说中国话呢?

而且很多书只是教科书, ...
yaoaiguo 发表于 2010-04-07 13:09

关键是楼主还想自己出书……
作者: pmerofc    时间: 2010-04-07 13:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 群雄逐鹿中原    时间: 2010-04-07 14:33
Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.

这里between和next是什么含义呢?LZ可否咬文嚼字的解释一下。
我认为 a+=a-=a*a 并没违反此 between和next 的要求
作者: x2    时间: 2010-04-07 14:44
如果只是考虑运算符的优先级,a+=a-=a*a似乎没问题。
作者: starwing83    时间: 2010-04-07 15:17
首先我支持一下楼主:这种写法的确不好,但是你必须得告诉初学者:这样不好,并且还要说出不好的原因,这样才有进步,我最开始学C语言的时候也是看的谭书,书里面经常写“这样是错误的,那样是错误的”却不给出原因,到底是这么写不好,还是会有编译错误?不得而知。

推荐一下《C语言常见问题集》和《C专家编程》两本书,有很多内容很深刻。

其次帮楼主澄清一下:首先并不是能被编译通过的代码就一定没有错误,C语言标准里面有个东西叫做“未定义”,意思是如果你这么写了,那么编译器无论怎么处理都是正确的:因为C语言标准根本就没有定义这么做会怎样!显然“编译通过”也算是处理方式之一,但那不代表这么写是正确的。

a+=a*=a*a;

这个表达式的确是错误的,原因上面楼主说了。顺带说一下,楼主的英文不是随便写的。要注意C语言毕竟是老外发明的,而且C语言的权威标准也是用英文写的,楼主贴的是C语言的标准文档,什么叫标准?意思是如果你不照着那个文档来,你实现的语言根本就不配叫“C语言”这个名字!这个文档是受法律保护的,因此最好别随便翻译,大家能看懂就看,看不懂可以让别人解释一下下,但是直接翻译是不好的。

楼上有人问顺序点的详细定义,这在标准文档的附录里面写的非常详细,摘录如下:
Annex C
(informative)
Sequence points
1The following are the sequence points described in 5.1.2.3:
—The call to a function, after the arguments have been evaluated (6.5.2.2).
—The end of the first operand of the following operators: logical AND && (6.5.13);
logical OR || (6.5.14); conditional ? (6.5.15); comma , (6.5.17).
—The end of a full declarator: declarators (6.7.5);
—The end of a full expression: an initializer (6.7.; the expression in an expression
statement (6.8.3); the controlling expression of a selection statement (if or switch)
(6.8.4); the controlling expression of a while or do statement (6.8.5); each of the
expressions of a for statement (6.8.5.3); the expression in a return statement
(6.8.6.4).
—Immediately before a library function returns (7.1.4).
—After the actions associated with each formatted input/output function conversion
specifier (7.19.6, 7.24.2).
—Immediately before and immediately after each call to a comparison function, and
also between anycall to a comparison function and anymovement of the objects
passed as arguments to that call (7.20.5).


由此看出,这个表达式在一对顺序点之间改变了a两次,因此是个C语言根本没定义的操作,换言之:是错误的。
作者: fender0107401    时间: 2010-04-07 15:55
回复 35# yaoaiguo


男人上街穿裙子合法吗?肯定合法,

但是,你教你儿子穿裙子上街吗?

要是别人教,你让吗?
作者: flw    时间: 2010-04-07 16:09
回复  yaoaiguo


男人上街穿裙子合法吗?肯定合法,

但是,你教你儿子穿裙子上街吗?

要是别人教 ...
fender0107401 发表于 2010-04-07 15:55

苏格兰裙……你不让人家穿人家跟你急……
作者: starwing83    时间: 2010-04-07 16:20
而且初学者们也不是你儿子吧………………
作者: fender0107401    时间: 2010-04-07 16:21
回复 43# flw

突然想起小沈阳来了,苏格兰**,哈哈。
作者: fender0107401    时间: 2010-04-07 16:22
回复 44# starwing83

打个比方吗,绝对没有想骂谁的意思。
作者: starwing83    时间: 2010-04-07 16:25
没,我不是这个意思,只是觉得如果是初学者,未必会来看大家的争论,这方面一直都是见仁见智的问题。
作者: A.com    时间: 2010-04-07 16:25
你们真闲得蛋疼了,这些不知所谓的既不是错误又不是正路子的东西有必要辩个对错出来么?还是觉得自己是现代孔乙己,懂得回字的四种写法很了不起?{:3_204:}
作者: yaoaiguo    时间: 2010-04-07 16:27
楼上好几位很清闲啊,尤其那个又贴了一大堆英文的,里面满眼都是参考xxx章节,copy起来容易,我可没功夫去翻。

多说无益,就等楼主的大作了。

如果楼主写不出来,那也没资格批评人家写的烂。

如果楼主写出来了,让我们见识见识写的咋样。

指手画脚的人见得太多了,真正做出来点东西的人太少了。
作者: OwnWaterloo    时间: 2010-04-07 16:47
支持1楼和41楼。

版上sb太多, 交给你们调教了
作者: Ray001    时间: 2010-04-07 17:02
我觉得,楼主如果写一本书,能够结合实际的项目代码的例子,形成一本经典的C编程风格指南的话,还是不错的。
如果只是对某一本或者几本有限的C语言书进行批判,有点小家子气。
作者: pmerofc    时间: 2010-04-07 18:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 18:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 18:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 18:26
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 18:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 18:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 19:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 19:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: x2    时间: 2010-04-07 19:48
本帖最后由 x2 于 2010-04-07 19:49 编辑

像楼主那样的语言学家出来纠正大家的错误,应当欢迎。
作者: pkkj    时间: 2010-04-07 19:48
记得清华的《数据结构。C++版》里面讲字符串匹配的地方有一段这样的话:
“该算法的名字是Brute Force Algorithm,是由Brute与Force共同发明的。”
作者: pmerofc    时间: 2010-04-07 20:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-07 21:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: rossini23    时间: 2010-04-07 21:44
本帖最后由 rossini23 于 2010-04-07 21:45 编辑
p64,《C程序设计》(第三版),谭浩强 著,清华大学出版社,2005年7月第3版,2009年10月第26次印刷

评: ...
pmerofc 发表于 2010-04-06 21:39



根据语法规则组合出来的表达式在语义上并不总是正确的,例如:

minute + 1 = hour;

等号左边的表达式要求表示一个存储位置而不是一个值,这是等号运算符和+ - * /运算符的又一个显著不同。有的表达式既可以表示一个存储位置也可以表示一个值,而有的表达式只能表示值,不能表示存储位置,例如minute + 1这个表达式就不能表示存储位置,放在等号左边是语义错误。表达式所表示的存储位置称为左值(lvalue)(允许放在等号左边),而以前我们所说的表达式的值也称为右值(rvalue)(只能放在等号右边)。上面的话换一种说法就是:有的表达式既可以做左值也可以做右值,而有的表达式只能做右值。目前我们学过的表达式中只有变量可以做左值,可以做左值的表达式还有几种,以后会讲到。

我们看一个有意思的例子,如果定义三个变量int a, b, c;,表达式a = b = c是合法的,先求b = c的值,再把这个值赋给a,而表达式(a = b) = c是不合法的,先求(a = b)的值没问题,但(a = b)这个表达式不能再做左值了,因此放在= c的等号左边是错的。
------------------------------
上面这一段是本版很火的《Linux C编程一站式学习》里面摘出来的,完全相反的两个结论。
作者: pmerofc    时间: 2010-04-07 22:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: davycu    时间: 2010-04-08 01:30
这种代码真的讨论的意义吗?
作者: pengjianbokobe    时间: 2010-04-08 09:20
dev-c++上(a=b)=c;运行正常啊  
作者: wolfkin    时间: 2010-04-08 09:28
确实, 我开初就学的C语言, 后来发现, 要动手写程序的时候, 总是先想到优化, 而不是先做出个东西来. 好在发现了这个问题后, 我就有意避免, 还好, 稍有效果.
所幸后来到linux平台, 见识面宽了, 接触的语言多了, 接触的事例多了, 才把以前不好方式给避免了些. 幸运啊!
以我多年的经验来看, 初学东西, 最重要的是直接给出一条直接了当又没有歧义的道路, 待上路之后再想其它更好的方式.

教初学者C/C++,应该先告诉他一条简单正确的路,而不是告诉他有多少条路可以选。还没学会写程序就开始玩技巧 ...
hellioncu 发表于 2010-04-07 09:36

作者: huxk    时间: 2010-04-08 09:46
真雞巴沒事干
作者: zxrjkl    时间: 2010-04-08 10:09
支持lz
我看中国的教科书看得很郁闷
幸亏我不是这样入门的
还有:(a=15)=16;在gcc中编译通过,结果为16,不过我也觉得没有意义
a+=a-=a*a;也通过,但给了警告:
1.cc:5: warning: operation on ‘a’ may be undefined
1.cc:5: warning: operation on ‘a’ may be undefined
结果也很奇怪;
作者: snhanwei    时间: 2010-04-08 10:17
请问70楼gcc的版本
作者: zxrjkl    时间: 2010-04-08 10:20
回复 71# snhanwei
gcc-4.4.3
作者: milujite    时间: 2010-04-08 11:31
好吧,我是初学者,邮电出版社的书都很垃圾,每本我都能发现错误
《写给大家看的C语言书》第二版
第194页的冒泡排 序法存在着逻辑上的错误。
举个最简单的例子:
如果随机产生的数组用以下数组替代
int nums[10]={1,2,4,3,6,5,8,7,10,9}
则内循环后,didswap仍然为0,然后就直接调用 break跳出外循环。
测试代码如下:
#include <stdio.h>
#include<stdlib.h>
int main()
{
    int num[10]={1,2,4,3,6,5,8,7,10,9};
    int ctr,inner,outer,didswap,temp;
    for(outer=0;outer<9;outer++)
    {   
        didswap=0;
        for (inner=outer;inner<10;inner++)
        {   
            if(num[inner] < num[outer])
            {   
                temp=num[inner];
                num[inner]=num[outer];
                num[outer]=temp;
                didswap=1;
            }   
        }   
        if(didswap==0)
        {   
            break;
        }   
    }   
    for(ctr=0;ctr<10;ctr++)
    {   
        printf("%d\n",num[ctr]);
    }   
    return 0;
}

编译运行后,结果如下:
[itux@CentOS ~]$ ./test
1
2
4
3
6
5
8
7
10
9

看了几本邮件出版社的Linux书籍,觉得这些出版社太不专业了。
作者: milujite    时间: 2010-04-08 11:35
一直觉得国内的编程书像数学书,主要指的是文字叙述。读起来很累很累。。。。。。
hahajerry007 发表于 2010-04-06 22:10



    同意,明明很简单的东西,被他说得跟什么似的~一直觉得鸟哥那种风格的书籍很不错,把东西讲得很生动,虽然废话比较多哈哈
作者: ningxinleng    时间: 2010-04-08 11:58
好吧,我是初学者,邮电出版社的书都很垃圾,每本我都能发现错误
《写给大家看的C语言书》第二版
第194页 ...
milujite 发表于 2010-04-08 11:31



    感觉看中译本的书像是在给书找错,有点经验的人看还好,能认出错误,可是对于初学者根本就不懂,还以为书上讲的就是对的!
作者: pmerofc    时间: 2010-04-08 17:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-08 17:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-08 17:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-08 17:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-08 18:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: zxrjkl    时间: 2010-04-08 19:27
回复 78# pmerofc
不好意思,这是在c++中通过的,gcc报错,主要是我一直写的是C++,所以弄错了
不过a+=a-=a*a;是在gcc上通过但给2个警告的
作者: pmerofc    时间: 2010-04-08 19:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: cheng_lai_shun    时间: 2010-04-08 23:39
本帖最后由 cheng_lai_shun 于 2010-04-08 23:42 编辑

国内的计算机书(特别是翻译过来的)不是传播知识而是纯经济利益,当然并不是说老谭是这样的


记得大学一老师为了买车买房出书
作者: mik    时间: 2010-04-09 00:47
应某出版社之约,拟就国内C语言“主流教材”中的错误、误导和不良风格等写点东西。
    在正式动笔之前和大 ...
p64,《C程序设计》(第三版),谭浩强 著,清华大学出版社,2005年7月第3版,2009年10月第26次印刷

:“a+=a-=a*a”这个表达式本身就是错误的,怎么居然还能分析出求解步骤呢?



国内确实有很多垃圾的人。

就像你这类人。


:“a+=a-=a*a”这个表达式本身就是错误的,怎么居然还能分析出求解步骤呢?

>> 丫 的

  凭什么你说它是错误的“表达式”? 懂不懂什么叫“表达式”


     +=, -=, *=,  /=,  %=: 这些二元操作符,只要符合 left operand 是 lvalue,那么这个表达式就是合法的。

  这是 C A reference Manual 里面的表述。

  难道 a 不是 lvalue ? 还是你想推翻这些权威书籍,如果你想推翻,再学多三十年吧。

  最重要的是学好语文,提高语文水平。

  就你这个水平,还想来咬文嚼字抓别人的漏洞。


我敢保证:如果,你敢出书,肯定被人批死




因为C的编译器一向只对违背Constraints的代码报错,而对那些“似是而非”的错误一般只给出警告,这是C一贯的风格
比如
int i;
scanf ("%d",i);
我相信C的编译器也只是给出警告而已,不会报错。尽管我们都知道那的确错了
  

>> 丫 的,又来 YY

scanf() 函数的原型是:

int scanf(const char *format, ...);

凭什么 c 编译器要帮你判断第 2 个参数是不是合法的? 函数原型的第2个参数并不需要类型

c 编译器凭什么要认为这条代码是错误的?


你还:“尽管我们都知道那的确错了”


这条语句在“语法”上是合法的,但在“语义”上却是错误的,在“逻辑”上是错误的。


你却想要c 编译器对“语法”上是合法的语句做出错误判断



什么叫做“语法”,什么叫做“语义”,什么叫做“逻辑

你基本上是混为一谈。而你却来批判别人书中的语法毛病

十分的可笑。



我没用过gcc。如果gcc给出警告,说明gcc是进化得非常不错的编译器,而且和前面所说的“a+=a-=a*a”是错误代码的观点相互吻合


没用过 gcc 居然敢在 CU 论坛(这个号称国内最大的 unix/linux 论坛)上混,还大发谬论

你真行!


gcc 给出警告:只是做为一个稍为好点的 C 编译器应该做的。

它认为,这条语句可能存在“人为方面”造成“结果”的不确定性

这条表达式就错误了?
  1. char *p = NULL;

  2. *p = 'a';
复制代码
不知道,这两条语句对你来说是不是“错误”的

你是不是,一定要让 编译器提你个提示: *p = 'a'; 这是错误的

很可惜

即使: gcc -Wall xx.c   

gcc 都不会给你提示错误




再一次保证:如果,你敢出书,肯定被批死。


就你这个水平,这个文字能力
作者: pmerofc    时间: 2010-04-09 06:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-09 06:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: ablo    时间: 2010-04-09 09:04
回复 1# pmerofc


    该语法并没有错。
在ubuntu 9.10下,编写test.c:
int main() {
int a = 0;
int b = 0;

/**开始*/
a = 12;
b = 20;
a+=a-=a*a;
/**注释结束*/
printf("a=%d\tb=%d", a, b);

return 0;
}

zhouhh@zhh64:~$ gcc test.c
test.c: In function ‘main’:
test.c:10: warning: incompatible implicit declaration of built-in function ‘printf’
zhouhh@zhh64:~$ ./a.out
a=-264        b=20zhouhh@zhh64:~$
该语法能得到文中所述的结果。
作者: ablo    时间: 2010-04-09 09:05
回复 87# ablo


    zhouhh@zhh64:~$ gcc --version
gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
zhouhh@zhh64:~$ uname -a
Linux zhh64 2.6.31-20-generic #58-Ubuntu SMP Fri Mar 12 04:38:19 UTC 2010 x86_64 GNU/Linux
zhouhh@zhh64:~$ cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=9.10
DISTRIB_CODENAME=karmic
DISTRIB_DESCRIPTION="Ubuntu 9.10"

挑错的时候还是要实践一下的。
作者: hellioncu    时间: 2010-04-09 09:12
第一章 C语言概述 1.2 C语言的特点

p2,《C程序设计》(第三版),谭浩强 著,清华大学出版社,2005年7月 ...
pmerofc 发表于 2010-04-09 06:53



    C99有布尔型,就是他说的逻辑型吧
作者: weixuejun    时间: 2010-04-09 09:21
顶楼主.我觉得教学一门语言,确实要注意教给学习者简单、明了、没有歧义的知识,以及规范的用法,让学习者知道怎样利用这门语言去实现我们的想法就行了,对于那些含糊不清的,学习的人如果自己有兴趣,大可以自己去测试。建议楼主也不要去批判这些书中的错误了,写出实用的学习教材来,我认为更重要。
作者: gz80    时间: 2010-04-09 09:23
评:误导。C语言根本就没有逻辑“型”数据。况且数据类型和变量是正交的概念,“对变量的类型使用比较灵活”,难道对常量的类型使用就死板?“通用”这个说法更成问题
这个……lz针对这个问题,应该改成怎样的说法才会简洁而又不产生误导呢?
{:3_191:}
作者: noword2k    时间: 2010-04-09 09:23
C99有布尔型,就是他说的逻辑型吧
hellioncu 发表于 2010-04-09 09:12



    你也太高估谭老了,这本书里面有谈到C99吗?
作者: hellioncu    时间: 2010-04-09 09:48
你也太高估谭老了,这本书里面有谈到C99吗?
noword2k 发表于 2010-04-09 09:23



   我想应该也没说只是针对C89吧。

  挑别人书中的毛病总是比较容易,绝大部分人去写一部书,估计问题更多。
  谭不管怎样还是一个前辈,要尊重。
作者: yaoaiguo    时间: 2010-04-09 10:25
mik真是位高人啊,本来不想参与无聊的讨论,但是看到这也支持一下。

我想,大家做软件这么多年,肯定见过很多人,或者自己也有这样的经历,就是对前人的东西不屑一顾,

觉得很烂,很想自己推翻重来,但是结果如何?自己写出来的也有这样那样的问题,就算好,也好不了多少。

看别人的东西总是盯着缺点,而忽略了人家优秀的部分。

当然也有高手,但是大多数人都是眼高手低。

光说不练假把式。

就等着楼主的书了。
作者: pmerofc    时间: 2010-04-09 12:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-09 12:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-09 12:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-09 12:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: pmerofc    时间: 2010-04-09 12:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: cnhbdu    时间: 2010-04-09 13:05
其实还是蛮期待楼主出书的,毕竟可以从另一个角度来看c语言。

这里面大部分人应该都是做工程的,可能不会有那么多的时间来去研读c语言(或c++)的标准,实际的开发中,也都会制定良好的编码风格,避免与编译器纠结的代码出现。

我觉得楼主应该是专门研究了语言标准的人,这确实需要很严谨、缜密的逻辑思维和推导能力。
作者: hellioncu    时间: 2010-04-09 13:14
1. 该书第二页(1.1 C语言出现的历史背景):“本书基本上以C89为基础并结合当前常用的C编译系统的 ...
pmerofc 发表于 2010-04-09 12:12



    LZ解释下“曲言阿谭”吧,我语文学得不好,看着像成语,不懂啥意思。
另外祝LZ的大作早日问世,记得及时通知一下,我好去买本拜读下,免得晚了卖光了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2