左手必须是变量

时间:2015-06-09 18:45:29

标签: java

如果我这样做就行了

elements.getElement(j).getValues().getArray()[i]=(elements.getElement(j).getValues().getVariable(i)-minimum)/(maximum-minimum);

但是,如果我这样做,它告诉我他左侧应该是一个变量

elements.getElement(j).getValues().getVariable(i)=(elements.getElement(j).getValues().getVariable(i)-minimum)/(maximum-minimum);

这两个功能是

double[] getArray(){
    return array;
}

double getVariable(int position){
    return array[position];
}

我相信前面的东西并不重要,而且工作正常,错误必须在最后。为什么我分配让我们说这样(第一行)它的工作原理,这意味着它是一个变量,但当我尝试分配东西时(第二行)它不起作用。我是多么愚蠢?我错过了什么?

double max=elements.getElement(j).getValues().getVariable(i);
elements.getElement(j).getValues().getVariable(i)=0.0;

7 个答案:

答案 0 :(得分:7)

getVariable(i)

绝对不同于

getArray()[i]

第一个返回一个数组,该数组可以由[]索引,然后用作有效的l值。 后者返回一个值(r值),该值只能在assignemnt的左侧使用。

简单来说,您不能为值赋值,但可以将值赋给由数组和索引指定的内存位置。

0 = 5 // this just won't work
array[0] = 5 // this will, because array[0] is a valid l-value

但是,您可以创建一个可用作设置器的方法。

void setVariable(int position, double value) {
    array[position] = value;
}

它会像这样使用

elements.getElement(j).getValues().setVariable(i, value);

答案 1 :(得分:2)

错误不言自明:您无法分配从方法调用返回的结果。

您的第一个代码段可能会对从方法返回的结果进行赋值,但该外观会产生误导:您的第一个代码段会将索引运算符[]应用于调用方法的数组结果,然后只分配[]运算符产生的结果。

允许分配[]返回的内容,因此您的第一个代码段会正确编译并运行。但是,第二个代码段在方法实现中应用[],并返回double。此时,返回的double与它所来自的数组没有连接,因此分配是非法的。

要解决此问题,请添加其他方法,然后执行内部分配:

void setVariable(int position, double newValue){
    array[position] = newValue;
}
...
elements.getElement(j)
    .getValues()
    .setVariable(i
    , (elements.getElement(j).getValues().getVariable(i)-minimum)/(maximum-minimum)
    );

答案 2 :(得分:2)

当您访问具有括号字符[i]的数组(即数组访问表达式)时,Java允许该表达式位于赋值运算符的左侧。

然而,通过调用getVariable(i),这是一个方法,并且方法返回的内容始终是值,这在赋值运算符的左侧是不允许的。分配的价值在哪里?我们只有一个值,而不是变量。

如果要避免公开数组,可以创建并使用setVariable方法在指定索引的列表中写入值。

void setVariable(int position, double value){
    array[position] = value;
}


elements.getElement(j).getValues().setVariable(i, 
    elements.getElement(j).getValues().getVariable(i)-minimum)/(maximum-minimum);

答案 3 :(得分:1)

功能不是替换,所以当你做

elements.getElement(j).getValues().getVariable(i)

你认为这相当于这个

elements.getElement(j).getValues().getArray()[i]

但事实并非如此。为什么?这很简单;

第一次通话的返回值为VALUE array[i]。 在第二种情况下,函数的返回是array本身,因此您可以为其分配元素并从中读取。

答案 4 :(得分:1)

getVariable()函数返回value。您可以在任何可以使用primitive的地方使用它。所以不要这样:

int x = 7;

你可以这样做:

int x = getVariable(i);

但请注意,您可以执行此操作:

3 = 7;

由于3是value,而不是variable。您的代码正在尝试执行类似的操作,因此您会收到错误。

getArray()函数有效,因为它返回一个数组,然后使用[]索引运算符,可以用作变量。

getArray()[i] = 5;

答案 5 :(得分:1)

你可以这样想。

函数的格式为countLetters("hello"),它们可以直观地将返回值发送到左侧;

int count = countLetters("hello");
      <---------------------+

你正在做的是在视觉上碰到括号。

getValue(1) = 5;
  <------+X<--+

希望这有助于你记住。

答案 6 :(得分:0)

让我们说这些方法

public int[] getArray(){
    return array;
}

public int getValue(int i){
   return array[i];
}

您的问题意味着您希望这两者都能正常工作

getArray()[0] = 2;
getValue(0) = 3;

第一个有效,因为如果你放松&#34;电话,你得到

int[] arrayFromMethod = getArray();
arrayFromMethod[0] = 2;

第二个因为获得int值而不是数组而无法工作。而试图放松它实际上相当于

// pretend array[0] is already 42
 42 = 3;  // Nope

不同
int x = array[0];
x = 3;

因为您在说getValue(i) = 3时内联呼叫,而is_charge并未分配新变量。即使它确实如此,一旦达到下一个陈述,价值就会消失,所以它没有任何用处。