{while(i!= 0 &&(a [i] .p!= 0 || a [i] .q!= 0));`可以做除冻结以外的任何操作吗?

时间:2019-05-24 17:23:54

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

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

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

其中

  • i是无符号整数索引
  • a是具有struct且具有整数成员pq的数组。

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

我不知道这条线怎么可能做任何事情。似乎只有两种情况:

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

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

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

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

在任何情况下,这行可能会变得有意义,或者这仅仅是一些错误代码,这种条件永远不会满足,而应该重构为assert

1 个答案:

答案 0 :(得分:2)

无论您怎么看,这都是不好的代码。

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

  1. 程序员写了一个错误。
  2. 它是多线程的,其中一个值将从另一个线程更改,并且程序员没有进行正确的线程同步。

您可能会提出关于怪异的运算符重载的建议,但是,哇!这确实是一个难题(并且是可怕的,可怕的编码实践,因为所使用的任何运算符都不应带有副作用)。

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