免费注册 查看新帖 |

Chinaunix

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

[C] 以其昏昏,使人昭昭? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
31 [报告]
发表于 2010-04-07 12:08 |只看该作者
主要是我担心很多人一开始被细节搞昏了头,打退堂鼓,主要的东西也学不好了。
hellioncu 发表于 2010-04-07 12:04

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

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

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

建议十个里面 pass 九个,剩下那个高薪,给所有的人一个奔头!
不要搞的现在这样,写程序还不如去卖白菜呢。

论坛徽章:
0
32 [报告]
发表于 2010-04-07 12:23 |只看该作者
看来,“即使我否定了敷粉的发辫,我还是要同没有敷粉的发辫打交道”
   
【Between the previ ...
pmerofc 发表于 2010-04-07 06:49



    不错,行为不确定很麻烦。

论坛徽章:
0
33 [报告]
发表于 2010-04-07 12:31 |只看该作者
谭老师的书,从目录上看,应该是面向初学者的,搞这些稀奇古怪的名堂确实不对。如果他另写一本书,叫《高级C语言》《深入C语言》之类的,估计会少挨很多批评。

论坛徽章:
0
34 [报告]
发表于 2010-04-07 13:00 |只看该作者
我觉得楼主才是 “以其昏昏,使人昭昭”

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

其次,我觉得

a+=a-=a*a;

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

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

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

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

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

楼主上来就骂错了,所以实在没说服力。

论坛徽章:
0
35 [报告]
发表于 2010-04-07 13:09 |只看该作者
楼主还引用一大堆英文证明自己的观点,实在让人厌恶,中国人为啥不说中国话呢?

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

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

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

总之,动不动就说别人白痴脑残的是很讨厌的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2010-04-07 13:13 |只看该作者
楼主还引用一大堆英文证明自己的观点,实在让人厌恶,中国人为啥不说中国话呢?

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

关键是楼主还想自己出书……

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
38 [报告]
发表于 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 的要求

论坛徽章:
0
39 [报告]
发表于 2010-04-07 14:44 |只看该作者
如果只是考虑运算符的优先级,a+=a-=a*a似乎没问题。

论坛徽章:
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
40 [报告]
发表于 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语言根本没定义的操作,换言之:是错误的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP