刘未鹏|C++的罗浮宫

Knowledge sharing is the best reuse

刘未鹏ID:pongba
810644次访问,排名41好友14人,关注者112
pongba的文章
原创 99 篇
翻译 8 篇
转载 0 篇
评论 1613 篇
刘未鹏的公告
除非特别声明,本站采用Creative Commons License许可。转载请保留作者、出处。非商业。

FeedSkyFeedBurner
或者用 鲜果 GR 抓虾 订阅。

CSDN Blog暂时不支持RSS全文输出,对此感到不便的朋友可以使用强大的greasemonkey脚本:GReader Preview Enhanced(链接),该脚本支持在GReader里面直接打开全文页面。

P.S. 我经常出没于TopLanguage讨论组

《C++的罗浮宫》5年选集(下载)

——知识分享是最大的复用


讨论问题请到TopLanguage小组

TopLanguage


gtalk/msn(邮件请发送到gmail邮箱)

pongba@gmail.com
pp_liu@msn.com

豆瓣 饭否 美味书签

搜索C++的罗浮宫上的内容(不要回车,点击Go)

whaz going on


饭否

books I've translated




这个Blog上都写了哪些东东

最近评论
coolspeed:那么多人评论yshuise同学哈,那我也掺合掺合吧。
yshuise同学就是网上常见的讲很多看起来硬的词,其实是只有思维和发言积极性,但是连基本的“氛围把握”和“话题切入”都未能真正做到的“言论牛13队候补”,尚无太多可取之处,但不可忽视其潜力的人。
经本人再次鉴定,学生的可能性极大,但是推论其属辩论队还缺乏根据,但是此同学一定爱看书看报,属于将自己定位于“将来的精英阶层……
coolspeed:1。pongba老大认为真正领会这篇博文的人的感觉是会是“哦,原来还这样”,还是“对,对,就是这样,说得太对了,我也是这么想但是没能说出来,发现pongba老大说得太到位了。”?
2。如果是前者,那说明这篇博文的主题是开创性发现的,如果是后者,那说明是开创性描述的。
3。这也就是我之前说“我不相信方法论”的原固。
4。任何看起来多么随便但是有效的solution……
coolspeed:好文。多谢老大
半瓶墨水:关于分球的问题的解答很有意思
但是我认为这只是一种贪心算法而已
我用这种“平均分布”贪心算法求解过“猜数字游戏”,游戏机上玩的那种8次以内猜到4A0B那种
使用过方差和信息量两种度量“平均分布”的模式
都不能完全在7步以内求解( 参见:http://www.fayaa.com/code/view/128/ )
但是7步求解的决策树是存在的。<……
muzisoft2008:很敬佩你把学习C++和C++本身这二个课题结合起来讲述的风格,很难得
文章分类
收藏
相册
其它图片
文章中的图片
我的大头贴
C++
Andrei Alexandrescu
Andrew Lumsdaine
Bjarne Stroustrup
boost
C++ Standard Commitee
Doug Gregor
Hans J. Boehm
Jaakko Jarvi
Jeremy G. Siek
Matthew Wilson
newsgroups
boost.Developer
boost.User
comp.lang.c++.moderated
comp.std.c++
TopLanguage
Open Source
codeplex
Google AJAX Search API
Google Code Prettify
Google Web Toolkit
MS shared source initiative
notepad++
STLSoft
不认识的朋友们
fatalerror99
Glacier
realazy
SpiritEpic
TK
Yelz
YongSun
余晟|乱象&乱想
刘慈欣
吴欣安(atppp)
姬十三
张志强|阅微堂
许式伟
阮一峰
高远
鲍志云
其它
科学松鼠会
科学美国人
科幻世界
认识的朋友们
alai
chenyufei
dd
duguguiyu|Venus神庙
Googol
Joyfire
littlestone
lxwde
Matrix67
realfun
soloist
Tinyfool
windstorm
云风
刘新宇
刘江@图灵
史晓明
周星星
周筠@博文视点
孟岩
张振
徐宥|4G Spaces&Web 2.3
方舟@博文视点
李笑来|Pure Pleasure
杨文博
王信文|地球没有好朋友
荣耀
莫华枫
袁泳(g9)|负暄琐话
谢东升
陈冀康@华章
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 C++中的求值|副作用|序列点所导致的模糊语义收藏

新一篇: 锁无关的(Lock-Free)数据结构——在避免死锁的同时确保线程继续 | 旧一篇: 《Exceptional C++ Style》译序[已出版]

C++中的求值|副作用|序列点所导致的模糊语义

前一阵子一个偶然的机会,在soloist的blog上(http://blog.csdn.net/soloist)看到一篇关于C/C++中的一个十分历史悠久的问题的讨论,即表达式求值的问题。说实话这个问题着实不新鲜了,被所有论坛提出过无数次,无非就是表达式求值顺序不确定的问题嘛。所以我也就没太在意,soloist那里吵翻了天,说什么的都有,热闹非凡。

当时我就当复习一下,想看看标准对这一块到底有什么明确的说法,就随手翻开了[C++03],结果发现原来情况并非像很多人,乃至我所长期以来认为的那样,简而言之,有下面几个令人意外的结果,不但令我意外,当我把问题发到comp.std.c++新闻组上之后居然引起了一场不大不小的争吵,Andrew Koenig、Herb Sutter、David Abrahams、P.J Plauger...,于是我就看了几天的连台好戏,同时也把这个问题的答案在脑子里刷新了一次。

下面就是两个令人感到意外的现象:

1. 表达式求值并不一定意味着求值过程中的副作用会同步发生!这是一个违反直觉的地方,带来了非常晦涩的语义。

2. i = (i++); 这种极度简单的表达式的行为居然是未定义的(undefined behavior)『注意“未定义行为(undefined behavior)”跟“未指定行为(unspecified behavior)”之间的重大区别。前者是对于不正确的,有毛病的程序而言,未定义行为可能是任何行为,轻则出现意料之外的结果,重则程序崩溃(崩溃还算好的,糟的就是错了还一声不吭^_^)。后者则是对于well-formed程序而言,未指定(unspecified)行为的可能性一般是有限的(例如函数参数的求值顺序就是函数参数个数的全排列种),只不过具体的实现不用在文档里说明究竟在它的实现上的特定行为是怎样的。』 顺便提一下“由实现定义的行为(implementation defined)”,这一行为跟“unspecified behavior”比较类似,都是针对well-formed程序而言,只不过后者的具体行为需要特定实现注明在文档中,让用户知道。 我们一直以为i=(i++)的行为是unspecified,即以为它至少还是well-formed程序,只不过在不同编译器上有不同结果罢了,然后结果却大谬不然,其行为是undefined,可能产生任何结果(从概念上来说,甚至可能导致程序崩溃^_^)。

3. i = (i++)这种表达式如果i是用户自定义迭代器的话,其行为却又变成了 unspecified,甚至由于这里左端表达式并没有实际的side-effect,所以其结果甚至是 定 的!这就是说,在build-in operation跟user-defined operator之间某些情况下存在着不易察觉的隐晦差别。

多的就不说了,带着上面的看法,你可以去看看我发在comp.std.c++上的帖子,地址如下:

标题:Is this really unspecified behavior?

http://groups.google.com/group/comp.std.c++/browse_frm/thread/0174aa7b34b06a51/581d5219d5a75578#581d5219d5a75578

 

发表于 @ 2005年12月01日 18:22:00|评论(loading...)|编辑

评论

#zhiqian0723 发表于2005-12-27 19:19:00  IP: 218.16.87.*
其实这些问题早在一本80年代出版的《C语言算法集锦》就有了答案。
#我是摆摆 发表于2006-01-06 12:09:00  IP: 218.80.215.*
好好洗了一脑

1 最好就是不要写这样的代码
2 用某些工具来检查这种“非定义”、“非说明”的行为
#jkn 发表于2006-01-10 11:02:00  IP: 61.134.84.*
我不懂
#justlikethewind 发表于2006-01-17 10:42:00  IP: 61.171.160.*
昏迷……果然这些大牛都在这里。偶像云集的地方啊。
#neo 发表于2006-01-21 10:50:00  IP: 218.79.166.*
[C++03]是什么???
#iambic 发表于2006-02-09 16:14:00  IP: 221.202.105.*
怎么排版的啊,这么大字,这么长的行宽。
#闲耘 发表于2006-02-16 13:43:00  IP: 219.134.35.*
看过
菲浅受益
就是看完这并不多的一篇
却如看长篇一般
痛苦
#cnzhangzhen 发表于2006-04-03 20:28:00  IP: 58.213.191.*
那天吃饭你咋不告诉我你写了这篇blog? 我可以和我那个architect据理力争了,呵呵
#SSO 发表于2006-04-08 01:28:00  IP: 219.138.196.*
恩,看了好久,不过太长了,100帖后面都没仔细看...


貌似里面有人说 undefined behavior 和 well-formed 两个概念并非互斥? 可以有 well-formed 的 undefined behavior ?



还有人说C++03(亦出现于C99)的著名例子:

i = ++i + 1; // The behavior is unspecified

应该修改为The behavior is undefined



这里到底是怎么样的?
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 刘未鹏