条件语句中的增量运算符与类Object一起使用时出现编译错误。
下面的语句没有错误:
a = a==0 ? 1 : ++a;
但是,此语句给出了编译错误:
obj.setValue(obj.getValue()==0 ? 1 : ++obj.getValue());
答案 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);