2012-04-05 76 views
0

我不确定这是C还是C++代码,但我认为不重要。C/C++代码2nd =登录操作

在此代码

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))); 

什么的T = U是什么意思?这不是给你分配t吗?因为它是没有意义的,因为那么它实际上得到设定到别的前一行的内容:

t = exp(a1*log(x)+b1*log(1.-x) + afac); 
u = err/t; 
x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))); 
if (x <= 0.) x = 0.5*(x + t); 
if (x >= 1.) x = 0.5*(x + t + 1.); 
+0

我可以给你的最好的建议是将其拆开并打印出子组件,以便了解发生了什么。 – 2012-04-05 14:05:21

+0

欢迎来到Stack Overflow! – 2012-04-05 14:16:12

回答

2

在C和C++的任务返回一个值,左边的值。

a = 1 + (b = 4); 

等同于:

b = 4; 
a = 1 + b; 

所以:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))); 

是一样的:

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))); 
x -= t; 
+0

实际上它返回一个左值指向_left_一侧:'(a = 1)= 2;'将a设置为2. – bames53 2012-04-05 17:04:09

+0

@ bames53,你说得对,它是左手边,但不是它是左值 - 你的声明是不可编译的。引用C11,6.5.16/3(我的粗体):赋值运算符将值存储在左操作数指定的对象中。赋值表达式的赋值后有**左**操作数的值,但是**不是左值。** – paxdiablo 2012-04-06 02:11:44

+0

@Kornel,可以看到左/右之间的区别,其中x =(y + = 1 )'因为'+ ='是赋值操作符之一 - 在增加后将'x'设置为'y',而不是'1'。当你使用'y = y + 1'而不是'y + = 1'的扩展形式时,这个区别并不重要,但是标准编写者(以及像我这样的一些SO bods)在注意细节方面接近肛门保留:-) – paxdiablo 2012-04-06 02:17:40

8

什么的T = U是什么意思?

这是一个较大的子表达式的一部分,

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))) 

它不分配吨至u是吗?

不,它将该复杂表达式的值分配给t。该分配的结果,然后在整个表达式中使用:

x -= (t = <stuff>); 

概念上,这是一样的:

t = <stuff> 
x = x - t 

因为它是没有意义的,然后因为它实际上是越来越设置到上一行中的其他东西

坦率地说,整套声明对我来说没有意义。无论如何,t设置为第一行,用于第二行,并再次设置在第三行。

+2

+1“坦率地说,整套声明对我来说没有意义。” – Hyangelo 2012-04-05 14:13:12

0

使用=确实会分配一个值,并返回您正在分配的值。在你的情况下,t正在分配u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))的结果。

0

整体计算:u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))被分配到t和什么值t在那里,这是执行。

x=x-t 
7

很简单:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))); 
|  | \_____________________________________/| 
|  |  Calculate this monstrosity  | 
|  \_________________________________________/| 
|     Assign it to t    | 
\________________________________________________/ 
        Subtract that from x 

在C(和C的语言)的分配的 “结果” 可以用于其他事情。因此,例如:

x = (a = a - 1); // decrements a and assigns that to x as well 
x += (a = 1 - a); // toggles a between 1 and 0 and adds to x (x increases 
        // every second time). 

C标准的相关比特是C11, 6.5.16 Assignment operators, paras 2 and 3

2 /赋值操作员有修改的左值作为它的左操作数。

3赋值运算符将值存储在左操作数指定的对象中。赋值表达式具有赋值后左操作数的值,但不是左值。赋值表达式的类型是左操作数的类型,除非左操作数具有限定类型,在这种情况下,它是左操作数类型的非限定版本。更新左操作数的存储值的副作用在左和右操作数的值计算之后被排序。操作数的评估是不确定的。

+4

对非常有帮助的ASCII艺术+1 – 2012-04-05 14:15:02

0

该陈述可以分为两个子陈述,为了可读性,它可能应该。

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))); 
x -= t; 

本质上,作者将整个公式的子部分分配给一个中间变量(t)供以后使用。

1

在您的代码:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))); 

让我假设

A=(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))); 

然后该代码将成为

x -= (t = u/A); 

然后,它可以作为阅读:

t = u/A; 
    x -= t; 

如果您有任何问题,请随时提问。