社区
C++ 语言
帖子详情
不说话
无知者无谓
2006-11-17 04:42:21
map<int, string> m;
/*
这里加入元素
0 one
1 two
.
.
.
9 ten
*/
map<int, string>::iterator iter = m.begin ();
while (iter != lst.end ()
cout << iter->first << ":" << iter++->second << endl;
会发生什么,为什么?
...全文
295
19
打赏
收藏
不说话
map m; /* 这里加入元素 0 one 1 two . . . 9 ten */ map::iterator iter = m.begin (); while (iter != lst.end () cout <first << ":" <second << endl; 会发生什么,为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
无知者无谓
2007-03-20
打赏
举报
回复
因为你有iter++,所以,很危险很危险。
貌似,因为map的iterator是class,结果还能是确定的。
==========================================================
不知道结果你确定是什么了?表光说可以确定,却不去确定呀?
无知者无谓
2007-03-20
打赏
举报
回复
表吵,在这之前我好像没有看到任何提到过异常吧?还是我看错了?
不用提醒我看什么书,我看过的书不会比你少的,你应该去提醒上面的人看什么书。本来这就是有异常,我只是想利用这个异常来提醒异常出现的原因--函数参数入栈问题而已。结果我没有看到有人提到过有异常,可悲!!!!
现在整个C/C++版都成了灌水乐园了,伤心呀。5年前刚到这的时候还是有很好的氛围,也可能当时大家上网的机会都比较少,都没时间灌水的缘故罢。现在上网时间多了,什么问题都有,到处都是学生作业问题,而且一发都是好几帖,而这些问题早有答案,难道不会搜索一下吗?
随便BS一下那些满是星星的人一天到晚在这散分,还一堆人无聊得在那抢分,不亦乐乎......
taodm
2007-03-20
打赏
举报
回复
呵呵,如果你真的看过也不迟。我试过结果,并且找过权威书籍给解答。你呢?
taodm
2007-03-14
打赏
举报
回复
呃,楼主如果还会回头看这个帖子,不妨找《More Exceptional C++》 item 20看一看吧。
无知者无谓
2007-03-14
打赏
举报
回复
而且这里面绝对是要异常退出的,一段完全错误的代码........
操作的顺序应该是(iter->second) → (iter++) → (iter->first)
这里的后缀++操作符是没有问题的,iter->second之后才是iter++,但是由于入栈顺序问题,在最后一个元素时会出现iter->second正常,iter++到m.end(),一个无效的iterator,再进行iter->first的时候异常
不要看到++了,就进入习惯性思维
无知者无谓
2007-03-14
打赏
举报
回复
本不想给分的,不过还是要结贴
看代码,我就只知道while少了一个右括号!!!其它不知道
==============
Sorry,打字快了没注意检查!
iter- >first是第一次函数调用的参数,iter++- >second是第二次函数调用的参数。我以为不会在第一次函数调用前计算第二个函数的参数表达式。刚试了下,有些编译器上确实会提前计算表达式,感觉上好像有点浪费空间。
==============
其实这里面主要不是++运算符的问题,而是入栈的顺序问题,上面的提到了一点点
chijingde
2006-11-20
打赏
举报
回复
有点意思
标记一下
期待楼主的高论
taodm
2006-11-20
打赏
举报
回复
你认为的要点未必是真的要点。
一共是2个要点:1)各运算子的求值顺序不定
2)自定义类型的后缀++是立即运算的,而内建类型的后缀++一般是在整个语句执行后才运算的。
无知者无谓
2006-11-20
打赏
举报
回复
此贴留一个月后,我会回来结帖的。
无知者无谓
2006-11-20
打赏
举报
回复
都没人提到要点上。
goldcool
2006-11-20
打赏
举报
回复
看代码,我就只知道while少了一个右括号!!!其它不知道
iambic
2006-11-17
打赏
举报
回复
iter->first是第一次函数调用的参数,iter++->second是第二次函数调用的参数。我以为不会在第一次函数调用前计算第二个函数的参数表达式。刚试了下,有些编译器上确实会提前计算表达式,感觉上好像有点浪费空间。
taodm
2006-11-17
打赏
举报
回复
<<有顺序却没有说iter->first 先计算还是iter++->second 先计算啊。
iambic
2006-11-17
打赏
举报
回复
<<是有运算顺序的吧。
taodm
2006-11-17
打赏
举报
回复
真是的,非得说白了吗。
老问题了,就是(i++)+(++i)类似问题。
一个表达式里,如果出现了i++/++i,并且i又出现了多次,那么结果(绝大部分情况下)将是未定义的。因为C、C++没有明确规定运算顺序!
写代码,绝对要避开这个陷阱。
iambic
2006-11-17
打赏
举报
回复
哦?看不出来。楼下继续。
jixingzhong
2006-11-17
打赏
举报
回复
...
LiChenYue
2006-11-17
打赏
举报
回复
看不懂,开蹭分!
taodm
2006-11-17
打赏
举报
回复
因为你有iter++,所以,很危险很危险。
貌似,因为map的iterator是class,结果还能是确定的。
一个女孩主动加你微信,不
说话
也不打招呼是因为啥呢?
当一个人单身久了的时候可能会看到一个姑娘对自己笑了的时候把孩子叫什么名字都想好了。虽然这只是一个笑话,但是从某些角度来看也体现了一些单身人士的无奈。单身久了,没有人跟自己谈心的时候,心里会抑郁起来。 而当你单身很久了以后忽然有一个女孩主动加你微信,你甚至可能会心跳加速和紧张,很多人都有这样的经历。但是如果一个女孩主动加了你的微信后,却一直不跟你
说话
或者只是打个招呼是为什么呢? 一,微商 如果一个女孩加你的微信很久了却不
说话
很可能是因为她是个微商,她的朋友圈会给自己带来利益,加你的微信不过是因为拓展
幸福的人不
说话
幸福的人不
说话
因为害怕惊动了上天
带走他的幸福
幸福的人微微笑
因为只有谦虚的微笑才能掩盖
心中的骄傲
幸福的人要你也幸福
因为看得到你深藏的伤口
和你心间不变的善良
而善良的人注定会幸福
unity汤姆猫自动检测录音,不
说话
自动播放
unity汤姆猫自动检测录音,不
说话
自动播放
为什么吃饭的时候不
说话
早在两千多年前,孔子就已经给我们制定了吃饭的规矩:食不言、寝不语。由此,大部分的中国人小时候吃饭时都被父母教育过:吃饭,不准
说话
。但是在孩子的心中仅仅知道这是大人的规矩而已,一旦到了可以离经叛道的年纪,或是长大离家独立生活,规矩就慢慢淡忘了。现在的社会如果一个人静静的吃饭,会被认为孤僻。其实,吃饭不讲话是有科学道理的。 我们都知道,人的中枢神经系统在神经元的共振中,将来自全身各处传入的...
我走过山的时候山不
说话
我走过山的时候山不
说话
, 我路过海的时候海不
说话
, 我坐着的毛驴一步一步滴滴答答, 我带着的倚天喑哑, 大家说我因为爱着杨过大侠。 找不到所以在峨嵋安家, 其实我只是喜欢峨嵋的雾, 像十六岁那年绽放的烟花。 ——程灵素...
C++ 语言
64,666
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章