程序员遇到了一个“奇怪”的代码问题,并终止了一个条件为 20 的 for 循环,输出为 21!

小夏 科技 更新 2024-01-29

我们公司的一位程序员同事对我说:“我遇到了一个非常奇怪的**!听他这么说有点紧张,我很好奇**什么能叫“怪异”。 然后他跟我解释,他写了一个for循环,然后用for循环的索引来得到数组对应下标的值,但是这个**好像没有效果,明明循环终止条件是设置i<=20,但最后发现i的值是21!我一听到他描述这样的事情,我立刻产生了兴趣。

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

*这个问题真的很奇怪,但我喜欢它!但是我看了一会儿他的***,有点不好意思,一时也不确定他的***写有没有问题!然而,唯一可以肯定的是,他在for循环中使用了异步线程,我想问题仍然出在线程上。

所以,我写了一个完全模拟他的写作风格的演示来测试我的想法。

我写了一个 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 循环之外定义一个值为 0 的变量 i,即避免在 for 循环时创建变量,让我们调用 for 循环之外的输出,当 for 循环结束时(这里没有异步操作),我们输出 i 的值,你会发现 i 的值是 21 而不是 20!

我们都知道这个问题,但是如果我的同事必须在他的 for 循环中使用异步怎么办?解决方法也很简单,就是直接定义一个变量来获取每个循环中 i 的值,并且这个变量相对于 for 循环是原子的,然后,在异步时间内使用这个变量而不是直接使用 i,就这样,问题就解决了!

如何?你学会了吗?

相似文章

    低代码编程模型会取代程序员吗?

    在当今的数字时代,低质量的开发模式逐渐成为软件开发领域的趋势。Low 是一种通过图形界面和可视化建模简化软件开发过程的方法。它允许非程序员通过拖放组件和配置参数来快速构建应用程序。那么,低 的流行是否意味着程序员的失业呢?首先,让我们了解低 的概念。Low 是一种快速开发应用程序的方法,允许开发人员...

    程序员年轻吗?老程序员不会被淘汰,只会枯萎!

    当我们谈论程序员年龄对就业的影响时,现实远比 青春大米 这句话复杂得多。年龄确实在职业选择中起着重要作用,但这并不意味着程序员在 岁之后就会失去市场价值。这种观点更像是程序员自己的玩笑和迎合大众口味的宣传。与应届毕业生相比,我们资深程序员可能会面临一些挑战,但是我们的资深程序员也有技术优势,积累了更...

    程序员除了上班之外如何赚钱?

    你是否认为,作为一名程序员,你的日常职责就是在 的海洋中游泳,为一个功能而焦虑,为一个项目熬夜?其实,除了努力,程序员还有很多赚钱的方法!接下来,让我们来看看如何利用您的技术来分散您的收入 .兼职接单。. 平台订单。国内代码市场有大量的开发需求,志成 竹八戒等,你可以根据自己的技能和经验选择合适的工...

    阅读程序员的 README 说明 06 测试(上图)。

    测试本身更有可能成为一项繁忙的任务。..糟糕的测试会增加开发人员的开销,而不会提供价值,并且还会增加测试套件的不稳定性。..该测试可以检查 是否正常工作。...测试本身可以验证软件的行为是否符合预期。...意外的软件行为可能会给用户 开发人员和操作员带来很多困惑。...测试此过程可以证明 已按规定生...

    透露!Python程序员薪资被人肉搜索,国内城市高薪排名曝光!

    在这个数字化快速发展的时代,对python程序员的需求与日俱增。那么,中国哪些城市python程序员的工资最高呢?本文将为您揭晓国内城市高薪排名,让大家知道python程序员的真实收入!作为国内科技公司的聚集地,北京的Python程序员需求量巨大,平均月薪万元。字节跳动 快手等多家知名互联网公司,都...