java中的一元运算符后缀和前缀同时使用

java中的一元运算符后缀和前缀同时使用,java,prefix,unary-operator,postfix-operator,Java,Prefix,Unary Operator,Postfix Operator,我用简单的英语提出的问题是:someObject.methodReturnsInteger().getClass()(我不是说getClass方法,只是一个处理整数的方法。我也不是说一个专门返回整数的方法。)但这不是++a++ 换句话说,为什么(或如何)解析(或标记化)允许在第一个中使用返回值,而在第二个中不允许?我的意思是,它不应该这样解析后者:(++a)+++并使用++a的返回作为一个数字吗 这同样适用于以下情况:a+b 我希望这个问题足够清楚 谢谢您的时间。存储值的操作需要一个放置位置。不

我用简单的英语提出的问题是:
someObject.methodReturnsInteger().getClass()
(我不是说
getClass
方法,只是一个处理整数的方法。我也不是说一个专门返回整数的方法。)但这不是
++a++

换句话说,为什么(或如何)解析(或标记化)允许在第一个中使用返回值,而在第二个中不允许?我的意思是,它不应该这样解析后者:
(++a)+++
并使用
++a
的返回作为一个数字吗

这同样适用于以下情况:
a+b

我希望这个问题足够清楚

谢谢您的时间。

存储值的操作需要一个放置位置。不能说
(a*2)+
,因为表达式
(a*2)
返回一个临时结果。增加它将没有效果,因为临时结果将立即被丢弃。出于同样的原因,你不能说
(a*2)=10

++(a*2)
可能更有意义,但这仍然表明,当您没有有效的位置放置增量值时,您希望存储增量值,因此语言设计者宁愿您编写
(a*2)+1


“修复后”和“修复前”增量运算符也会返回临时结果,这就是为什么不能将它们应用两次或组合使用。

运算符对数字不起作用,对变量起作用<允许使用code>x++,因为
x
是一个变量。类似于
++(x++)
的内容是不允许的,因为
(x++)
的结果是一个数字而不是一个变量。

表达式
++a++
由3个部分组成,通过添加括号突出显示:
(++(a))++

  • a
    变量参考
  • ++X
    前缀增量运算符()
  • X++
    Postfix增量运算符()
Javadoc说:

[X]必须是可转换()为数值类型的变量,否则会发生编译时错误。[…]增量表达式[prefix/postfix]的结果不是一个变量,而是一个值

因此,在表达式中,
++a
起作用,因为
a
是一个变量,但结果是一个值,所以
(++a)+
不起作用


a+++b
不起作用,因为编译器将其解析为
((a++++)++b
),正如我们刚刚了解到的,
X++
需要一个变量

它是这样解析的,因为Java标记器将使用尽可能多的连续字符来形成有效的运算符

现在,如果您添加空格或括号,它可以工作,这取决于您希望该表达式执行的操作。以下都是相同的:

(a++)+(++b)
a+++(++b)
a++ + ++b
a+++ ++b

表达式
someObject.methodReturnsInteger().getClass()
称为“”

这是因为
是一个左关联运算符,
左侧的值必须是一个对象(或静态方法调用的类,但让我们跳过它)

因此表达式的解析方式如下:
(someObject.methodReturnsInteger())。getClass()

第一个
之所以有效,是因为
someObject
是一个对象。第二个
有效,因为括号中表达式的结果是一个对象

方法链接非常常见,并且在使用


@SotiriosDelimanolis,在转换为
整数
引用之前,它是一个
int
——一个32位整数。这是不是
对象的基元类型。在许多情况下,Java会自动将
int
s与
Integer
对象进行转换,主要是为了使泛型类更好地工作。看:@SotiriosDelimanolis,啊,真的。我没有试过其他的含蓄演员。我将删除答案的这一部分
String s = new StringBuilder()
        .append("Hello ")
        .append(person.getFirstName())
        .append(", please say hello to your father, ")
        .append(person.getFather().getFirstName())
        .append(".")
        .toString();