为什么条件语句中的增量运算符会为类Object提供编译错误?

时间:2018-07-24 12:34:27

标签: javascript java

条件语句中的增量运算符与类Object一起使用时出现编译错误。

下面的语句没有错误:

a = a==0 ? 1 : ++a;

但是,此语句给出了编译错误:

obj.setValue(obj.getValue()==0 ? 1 : ++obj.getValue());

6 个答案:

答案 0 :(得分:4)

obj.getValue()是方法返回的值。这不是一个变量。因此,您不能应用任何会更改操作数值的运算符(例如-,++,+ =,=等)。

您可以使用:

obj.setValue(obj.getValue()==0 ? 1 : obj.getValue() + 1);

相反。

或者您可以将方法的返回值分配给一个变量,该变量可以减小:

int a = obj.getValue();
obj.setValue(a==0 ? 1 : ++a);

但是,没有理由使用减前(或减后)运算符,除非您稍后要使用减后的变量。

答案 1 :(得分:2)

++--运算符只能与在赋值(=)左侧出现的表达式一起使用。您不能将函数调用放在分配的左侧,因此不能将++应用于函数调用。

我正在谈论的表达形式的正式术语是 l-value 。这有效:

var x = 0;
x++;

因为x作为表达式是 l值。这也可以:

var x = { a: 0 };
x.a++;

因为x.a也是有效的 l值

现在还应该指出,从技术上讲, 是一种将函数调用用作 l值的方法:

var obj = {
  get value() { return this._value; },
  set value(newValue) {
    this._value = newValue;
  },
  _value: 0
};

var x = ++obj.value;

由于value是用getter / setter对定义的,因此将通过调用getter函数++obj.value,增加返回值,然后调用setter函数来评估子表达式obj.value。 。当然,这并没有真正“反驳”一般规则,因为使用getter / setter函数的全部目的是允许简单的属性访问语法,同时涉及添加特殊语义的代码。

答案 2 :(得分:1)

您不能使用++来增加方法返回的“值”。

使用

obj.getValue() + 1

代替

++obj.getValue()

答案 3 :(得分:1)

正如其他答案所提到的,这是因为++--运算符无法应用于函数。

但是再看看您的代码,为什么要检查obj.getValue()==0

如果该值为0,则就像其他任何数字一样将其递增。

obj.setValue(obj.getValue() + 1);

答案 4 :(得分:0)

因为obj.getValue()是一种方法/函数。

您不能自动递增函数的返回值(必须先将其分配给变量,然后自动递增将应用于该变量)

答案 5 :(得分:0)

为什么会这样?您可以采用默认值,然后添加一个。

obj.setValue((obj.getValue() || 0) + 1);