3

我有一个问题想用谷歌搜索,但我不知道该问她/她/它(谷歌 :))

在网上的几个示例代码中找到了这样的任务(这个特定的代码起源于这里,他们从 C p. 508中的数字食谱中复制了代码)。

我试图在以下行中了解分配的用法:

wr = (wtemp = wr) * wpr - wi * wpi + wr;

就我自己对编程逻辑的理解而言,我会将其翻译为

wtemp = wr;
wr = wtemp * wpr - wi * wpi + wr;

那是对的吗?或者应该是wpr * wpr - wi [...]?或完全不同的东西:D?

(根据维基百科,赋值运算符返回对受让人的引用,根据免费词典- 我检查确定 - 是被赋值的

4

2 回答 2

6

表达式a = b的值就是a after assignment 的值,所以:

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 赋值运算符

赋值表达式在赋值 (...) 之后具有左操作数的值。

于 2013-08-19T14:03:49.943 回答
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
           ...
        }

重写此代码以消除内部分配并非易事(它也依赖于短路评估)。这是我写过的唯一条件之一,其中内部分配实际上比替代方案更好。如果有人想要更改/调试此代码,我希望他们停下来认真考虑一下。

于 2013-08-19T15:09:40.267 回答