c:计算中使用的赋值

时间:2013-08-19 14:01:31

标签: c assignment-operator

我有一个问题,我喜欢谷歌,但我不知道该怎么问她/她/它(谷歌:))

在几个示例代码中找到了这样的分配(这个特定的代码来自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 - 我检查确定 - 是分配了某些内容的值

2 个答案:

答案 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
           ...
        }

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