【发布时间】:2019-10-11 07:41:45
【问题描述】:
我正在阅读别人的 C++ 代码,我对具有以下结构的一行感到困惑:
while (i != 0 && (a[i].p != 0 || a[i].q != 0));
在哪里
-
i是无符号整数索引 -
a是一个包含structs 的数组,其中包含整数成员p和q。
请注意,while 循环的主体是空的(分号)。另请注意,条件内没有递增/递减运算符或任何赋值。
我不明白这条线怎么可能做任何事情。好像只有两种情况:
- 条件不满足,立即退出循环。
- 条件满足,循环变为无限,程序永远冻结。
是否有任何可以想象的上下文使这条线有意义,即做一些不平凡的事情,也不会永远冻结?
一些理论上可以想象但不太可能的“解决方案尝试”:
- 某些
!=、[]、&&、||运算符已以某种奇怪的方式被覆盖 - 该循环实际上是一个“忙等待”循环,
i或a的内容从另一个线程更改,然后最终“泄漏”,因为内存模型不保证在另一个线程中写入即使没有任何适当的同步,也不会变得可见。但这看起来非常丑陋,请原谅我想到了这种可能性。
是否有任何上下文可以使这行变得有意义,或者这只是一些错误的代码,一个永远不会满足的条件,应该被重构为 assert 代替?
【问题讨论】:
-
"条件满足,循环变为无限,程序永远冻结。" 不做任何重要事情的无限循环是未定义的行为。它们不一定永远循环。见progress guarantee。
-
你确定所有变量都是整数而不是
atomics? -
好的,对不起大家。虚惊。问题只是我不习惯的缩进样式。在
while条件上方有一百英里长的do { ... }块,然后是换行符。那很愚蠢。对于那个很抱歉。看起来像“琐碎的错字”,或者只是不相关的代码缩进问题。 -
@Indestruktible 呵呵,我总是被
do/while抓住。听起来这个功能可能需要拆分一下! -
@Indestruktible 你应该找到他们,杀了他们。
标签: c++ while-loop infinite-loop