我有一个问题,我喜欢谷歌,但我不知道该怎么问她/她/它(谷歌:))
在几个示例代码中找到了这样的分配(这个特定的代码来自here,他们在网上复制了Numerical Recipes in C p.508)中的代码。
我尝试在以下行中了解该作业的用法:
wr = (wtemp = wr) * wpr - wi * wpi + wr;
就我自己对编程逻辑的理解而言,我会把它翻译成
wtemp = wr;
wr = wtemp * wpr - wi * wpi + wr;
是正确的吗?还是应该是wpr * wpr - wi [...]
?或完全不同的东西:D?
(根据wikipedia,赋值运算符返回对受让人的引用,根据the free dictionary - 我检查确定 - 是分配了某些内容的值至)
答案 0 :(得分:6)
表达式a = b
的值是赋值后a
的值,因此:
wr = (wtemp = wr) * wpr - wi * wpi + wr;
相当于:
wtemp = wr;
wr = wtemp * wpr - wi * wpi + wr;
或:
wtemp = wr;
wr = wr * wpr - wi * wpi + wr;
参考:
6.5.16分配运营商
赋值表达式具有赋值(...)后左操作数的值。
答案 1 :(得分:2)
@ 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
...
}
重写此代码以消除内部分配(它还依赖于短路评估)并非易事。这是我写过的唯一一个条件,其中内部任务实际上比替代方案更好。如果有人想要更改/调试此代码,我希望他们必须停下来思考它。