@md5 有正确的答案,但我已经看到这个被滥用了很多次,我觉得有必要进一步评论。在几乎所有情况下,做这样的作业都是错误的。不是“不会编译”错误,而是“我不知道这是否是你真正想要做的”错误。它立即要求读者停下来认真思考你在做什么。如果有一种实用的方法可以避免在过程中进行分配,请使用它。创建一个临时变量,将评估分成几个阶段,无论如何。
现在,有时这实际上很有帮助。例如,这里有一些代码调用了一个非常慢的函数(canFreelyStop),但前提是它确实必须这样做。同时它正在对系统状态进行一些评估:
//determine whether transport motor should be running and make it happen
bool canStop = true;
if ( m_requestErrorStop
|| ( !m_receiving // not receiving new items from upstream.
&& ((canStop = canFreelyStop()) != 0) // can stop without damaging anything (!=0 to avoid compiler warning)
)
)
{
//ready to turn it off
...
}
else if (!canStop)
{
//only failed to stop due to documents in transit. Wait a "cycle" and check again
...
}
重写此代码以消除内部分配并非易事(它也依赖于短路评估)。这是我写过的唯一条件之一,其中内部分配实际上比替代方案更好。如果有人想要更改/调试此代码,我希望他们停下来认真考虑一下。