不说话

无知者无谓 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 打赏 收藏 转发到动态 举报
写回复
用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,结果还能是确定的。

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧