【问题标题】:Can `while (i != 0 && (a[i].p != 0 || a[i].q != 0));` do anything except freezing? [closed]`while (i != 0 && (a[i].p != 0 || a[i].q != 0));` 除了冻结可以做任何事情吗? [关闭]
【发布时间】:2019-10-11 07:41:45
【问题描述】:

我正在阅读别人的 C++ 代码,我对具有以下结构的一行感到困惑:

while (i != 0 && (a[i].p != 0 || a[i].q != 0));

在哪里

  • i 是无符号整数索引
  • a 是一个包含 structs 的数组,其中包含整数成员 pq

请注意,while 循环的主体是空的(分号)。另请注意,条件内没有递增/递减运算符或任何赋值。

我不明白这条线怎么可能做任何事情。好像只有两种情况:

  1. 条件不满足,立即退出循环。
  2. 条件满足,循环变为无限,程序永远冻结。

是否有任何可以想象的上下文使这条线有意义,即做一些不平凡的事情,也不会永远冻结?

一些理论上可以想象但不太可能的“解决方案尝试”:

  • 某些!=[]&&|| 运算符已以某种奇怪的方式被覆盖
  • 该循环实际上是一个“忙等待”循环,ia 的内容从另一个线程更改,然后最终“泄漏”,因为内存模型不保证在另一个线程中写入即使没有任何适当的同步,也不会变得可见。但这看起来非常丑陋,请原谅我想到了这种可能性。

是否有任何上下文可以使这行变得有意义,或者这只是一些错误的代码,一个永远不会满足的条件,应该被重构为 assert 代替?

【问题讨论】:

  • "条件满足,循环变为无限,程序永远冻结。" 不做任何重要事情的无限循环是未定义的行为。它们不一定永远循环。见progress guarantee
  • 你确定所有变量都是整数而不是atomics?
  • 好的,对不起大家。虚惊。问题只是我不习惯的缩进样式。在while 条件上方有一百英里长的do { ... } 块,然后是换行符。那很愚蠢。对于那个很抱歉。看起来像“琐碎的错字”,或者只是不相关的代码缩进问题。
  • @Indestruktible 呵呵,我总是被do/while 抓住。听起来这个功能可能需要拆分一下!
  • @Indestruktible 你应该找到他们,杀了他们。

标签: c++ while-loop infinite-loop


【解决方案1】:

无论你怎么看,这都是糟糕的代码。

我可以看到两种可能的选择:

  1. 程序员写了一个错误。
  2. 它是多线程的,其中一个值会从另一个线程发生变化,程序员没有进行适当的线程同步。

您对奇怪的运算符重载的建议是可能的,但是哇!这确实是一种延伸(以及可怕、可怕的编码实践,因为所使用的运算符都不应该带有副作用)。

我的猜测:有人忘记增加 i。

【讨论】:

  • “忘记增加 i”对于 i != 0 没有多大意义。
  • 关于运算符重载的建议是不可能的。您不能仅使用内置类型重载运算符。
  • 也许那应该是减量i。
  • 感谢您的回答,@JosephLarson,但恐怕解释更加平凡:我只是错过了一个很长且奇怪的缩进 do { ... } while(); 的结尾,太多了关闭 } 和有问题的 while 之间的换行符。我也期待在某个地方出现i-- 之类的东西。现在不知道该怎么处理这个问题,它可能应该作为一个“琐碎的印刷错误”而关闭和删除。
  • 有时向其他程序员询问您的问题可以帮助您解决问题。不知道有多少次自己解决了自己的问题,让别人和我一起看代码。
猜你喜欢
  • 2017-06-19
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 2012-05-26
  • 2019-12-12
  • 2017-01-12
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多