网易首页 > 网易号 > 正文 申请入驻

程序员碰到“诡异”代码问题,终止条件为20的for循环,输出了21

0
分享至

我们公司一个程序员同事跟我说:“我碰到了一段很诡异的代码!”,听他说的有点神经兮兮的,于是我就好奇什么代码能称之为“诡异”。然后他跟我解释,说他写了一个for循环,然后通过for循环的索引去取数组对应下标的值,但是,这段代码似乎不起效果,并且明明循环终止条件设置的是i<=20,但是最后发现i的值竟然有21!我一听他这么描述事情,立马就来了兴趣。

然后我就拿着他的代码调试了一下,发现真的如他描述的那样,循环终止条件是i<=20,但是i最后的值是21!

代码问题的确很诡异,但是我喜欢!可我看了一会儿他的代码,有点丢脸,我也一时不确定他代码哪里写得有问题!但是,唯一可以确定的是,他的for循环里面使用了异步线程,我估计问题还是出在了线程上。

于是,我自己写了一个demo完全模拟他的写法,来验证我的想法。

我写了一个0到20的for循环,然后直接异步输出i的值,最后我发现,这个i的值不光能输出21,甚至于21次输出有一大半的输出i的值都是21!

思考了片刻,我总结出了问题出现的原因!

之所以出现这个问题,是因为这个循环内部使用了异步输出,在并发输出的情况下i的输出顺序是不确定的,也破坏了i这个值的原子性,最后可能导致在输出的时候i的值与预期不同。

打个简单的比方吧,因为for循环内部使用了异步输出,所以for循环会在极短的时间内执行完成,而在for循环执行完成以后,异步逻辑可能才被执行,此时,i的值可能就是20,因此如果异步输出的逻辑在for循环结束之后被执行,那么此时输出i,那么i的值就应该是20,所以,原则上将会出现大量输出20的值!

但是,我们也发现了,i的值跟我们想的并不一样,它不是20而是21,这就得说到for循环的执行逻辑了。

假设i的起始值是0,结束值是20,for循环的执行逻辑是每循环一次都会给i+1,当准备进入下一次循环的时候,会先判断i是否大于结束值,如果大于则不执行。

也就是说,for循环在执行完最后一次循环的时候,仍然给i+了1,所以,此时如果正好异步输出的逻辑被执行,那么i就等于21!

我们可以用一个简单的例子来证明这个推论(这里没有复杂的编程基础知识,全靠验证)。

我们可以在for循环外面定义一个变量i,值为0,也就是避免在for循环时才创建变量,供我们在for循环外部调用输出,当for循环结束后(这里没有任何异步操作),我们再输出i的值,此时您会发现,i的值是21而不是我们预想中的20!

问题我们都知道了,但是我的同事的for循环里必须使用异步怎么办呢?解决办法也很简单,那就是在每次循环时直接定义一个变量去获取i的值,而这个变量相对于for循环是原子性的,然后,在异步时使用这个变量而不直接使用i,就这样,问题成功解决!

怎么样?您学会了吗?

声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
主板IPO丨浙能燃气等待注册生效,毛利率低于同行,现金流充裕募资必要性存疑

主板IPO丨浙能燃气等待注册生效,毛利率低于同行,现金流充裕募资必要性存疑

时代商学院
2024-06-16 17:03:17
乌克兰外长:俄方就停火提出的要求不可接受

乌克兰外长:俄方就停火提出的要求不可接受

环球网资讯
2024-06-16 19:53:13
医大教师因抢救患儿迟到被罚后续:举报者身份被扒,校方二次回应

医大教师因抢救患儿迟到被罚后续:举报者身份被扒,校方二次回应

洛洛女巫
2024-06-16 13:41:45
视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

环球网资讯
2024-06-16 13:41:16
为什么说在瑞士召开的乌克兰和平峰会终究是一场闹剧

为什么说在瑞士召开的乌克兰和平峰会终究是一场闹剧

王朝风云
2024-06-16 06:07:33
特朗普抨击拜登的电动汽车政策:如果在11月入主白宫,他将撤销这些政策 拜登和特朗普的首场电视辩论规则公布:禁用道具 麦克风受控 确保文明辩论

特朗普抨击拜登的电动汽车政策:如果在11月入主白宫,他将撤销这些政策 拜登和特朗普的首场电视辩论规则公布:禁用道具 麦克风受控 确保文明辩论

每日经济新闻
2024-06-16 20:26:30
智利正式申请加入《区域全面经济伙伴关系协定》

智利正式申请加入《区域全面经济伙伴关系协定》

界面新闻
2024-06-16 07:10:30
爱神归来!埃里克森心脏骤停正好1100天后,在欧洲杯破门

爱神归来!埃里克森心脏骤停正好1100天后,在欧洲杯破门

直播吧
2024-06-17 00:30:27
中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

中俄联合开发黑瞎子岛,当年黑瞎子岛是怎样被俄方占领的?

浩然史观
2024-06-15 16:55:02
42岁凯特王妃灿烂笑容重现!瘦成“纸片人”,比9岁夏洛特还要薄

42岁凯特王妃灿烂笑容重现!瘦成“纸片人”,比9岁夏洛特还要薄

译言
2024-06-15 18:51:40
北京高考阅卷现场:语文已出现优秀作文,将作为满分作文备选

北京高考阅卷现场:语文已出现优秀作文,将作为满分作文备选

澎湃新闻
2024-06-16 21:16:28
网友称医院也能看到露大腿的美女护士,大V无语:大家别幻想了!

网友称医院也能看到露大腿的美女护士,大V无语:大家别幻想了!

可达鸭面面观
2024-06-16 20:29:28
王思聪回应私生女事件,网友炸开了锅!

王思聪回应私生女事件,网友炸开了锅!

拾点先生
2024-06-15 19:00:02
变天了?英国《经济学人》头条:中国已成为科学的超级大国

变天了?英国《经济学人》头条:中国已成为科学的超级大国

互联网大聪明
2024-06-16 03:04:28
女排奥运冠军现场洒泪 龚翔宇哭了冲上热搜 全勤没轮休队友忙安慰

女排奥运冠军现场洒泪 龚翔宇哭了冲上热搜 全勤没轮休队友忙安慰

厝边人侃体育
2024-06-16 22:52:55
印度首富之子大婚在即,婚前派对只有一个字:壕!

印度首富之子大婚在即,婚前派对只有一个字:壕!

新民周刊
2024-06-16 15:44:36
为什么今年中国经济这么差?

为什么今年中国经济这么差?

趣说世界哈
2024-06-16 07:50:23
证监会新闻发言人就融券与转融券有关情况答记者问

证监会新闻发言人就融券与转融券有关情况答记者问

界面新闻
2024-06-16 20:35:00
韦格霍斯特:我早就知道我会进球的,赛前就和女友说了

韦格霍斯特:我早就知道我会进球的,赛前就和女友说了

懂球帝
2024-06-16 23:14:15
董路:波兰如果踢的是4后卫,比分已经是1-4了!

董路:波兰如果踢的是4后卫,比分已经是1-4了!

直播吧
2024-06-16 21:49:33
2024-06-17 02:26:44
程序员古耕
程序员古耕
程序员、网文作家、自媒体人
393文章数 291关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

数码
家居
本地
游戏
公开课

数码要闻

PCIe 5.0 SSD终于要便宜了!群联E31T主控无缓存能跑12GB/s

家居要闻

空谷来音 朴素留白的侘寂之美

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

梦幻西游玩家炸出160愤怒水清腰带,西栅为服战连夜换“网吧”?

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版