【发布时间】:2018-08-30 03:57:45
【问题描述】:
所以正如标题所示,我有一个使用临时数组的函数,我想从另一个数组中写入一个值,然后将这两个值与自身相乘。
例子:
float[] a = {0, 0}
a[0] *= a[0] = b[n ];
a[1] *= a[1] = b[n + 1];
我希望以上内容会执行以下操作:
a[0] = b[n ];
a[0] *= a[0]; //(aka: a[0] = a[0] * a[0])
a[1] = b[n + 1];
a[1] *= a[1];
虽然这种行为似乎不是正在发生的事情。相反,它似乎只是将“a”中保存的原始值与“b”中保存的任何值相乘,如下所示:
a[0] = a[0] * b[n ];
a[1] = a[1] * b[n + 1];
我一直认为,“=”之后的任何内容都会首先被评估,正如你所做的那样:
float a, b;
a = b = 5;
//"a" and "b" both equal "5" now.
既然如此,那岂不是说明我原来的例子应该可以工作?
谁能解释发生了什么以及为什么这段代码不能按预期工作?
【问题讨论】:
-
乍一看,这似乎是那些新手问题之一,但仔细想想,你说得有道理。但是,我永远不想在生产代码中看到这一点。经验法则:写成
a[0]=b[n]*b[n],这样更容易阅读。这样的代码只在编译器必须适应大约 30k 内存的时代才有用,并且由于编译器没有优化,您可能会通过一些棘手的摆弄来节省一些 cpu 周期。现在没有时间,但在 Java 中,它应该全部在规范中进行设置(而在 C 中,我认为它要么是未定义的,要么是实现定义的)。
标签: java variable-assignment multiplication assignment-operator