我正在阅读别人的C ++代码,我对具有以下结构的一行感到困惑:
while (i != 0 && (a[i].p != 0 || a[i].q != 0));
其中
i
是无符号整数索引a
是具有struct
且具有整数成员p
和q
的数组。请注意,while循环的主体为空(分号)。另外请注意,条件内没有递增/递减运算符或任何赋值。
我不知道这条线怎么可能做任何事情。似乎只有两种情况:
在这条线是否有意义的任何可以想象的上下文中,即做一些不平凡的事情,也不会永远冻结吗?
一些理论上可以想象的,但不太可能的“解决方案尝试”:
!=
,[]
,&&
,||
运算符已以某种奇怪的意外方式被覆盖i
或a
的内容从另一个线程更改,然后最终“泄漏”,因为内存模型不能保证即使没有任何适当的同步,在另一个线程中的写入也将不可见。但这看起来非常丑陋,所以请原谅我想到这种可能性。在任何情况下,这行可能会变得有意义,或者这仅仅是一些错误代码,这种条件永远不会满足,而应该重构为assert
?
答案 0 :(得分:2)
无论您怎么看,这都是不好的代码。
我可以看到两种可能的选择:
您可能会提出关于怪异的运算符重载的建议,但是,哇!这确实是一个难题(并且是可怕的,可怕的编码实践,因为所使用的任何运算符都不应带有副作用)。
我的猜测:有人忘记增加i。