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

Unary-Operators postfix and prefix at the same time in java

我的问题是简单的英语:为什么这有效 someObject.methodReturnsInteger().getClass()(我并不是真正的意思是 getClass 方法。只是一种适用于 Integer 的方法。而且我并不是真正的意思return 是一个整数的方法。)但这不是 ++a++?

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

类似的情况也是如此:a+++++b

希望问题够清楚。

感谢您的宝贵时间。

存储值的操作需要一个地方来放置它。您不能说 (a*2)++,因为表达式 (a*2) return 是一个临时结果。增加它不会有任何效果,因为临时结果会立即被丢弃。出于同样的原因,你不能说 (a*2)=10.

++(a*2) 可能更有意义,但这仍然表明当您没有有效的地方放置它时,您希望存储增量值,因此语言设计者会相反,您应该写 (a*2)+1

post-fix 和前缀增量运算符 also return 临时结果,这就是为什么你不能应用它们两次或在组合.

++ 运算符不适用于数字,它适用于变量。 x++ 是允许的,因为 x 是一个变量。 ++(x++) 之类的东西是不允许的,因为 (x++) 的结果是一个数字而不是变量。

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

Java医生说:

[X] must be a variable of a type that is convertible (§5.1.8) to a numeric type, or a compile-time error occurs. [...] The result of the [prefix/postfix] increment expression is not a variable, but a value.

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


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

之所以这样解析,是因为 Java 分词器会消耗尽可能多的连续字符以形成有效的运算符。

现在,如果您添加空格或括号,它就可以工作,具体取决于您打算让该表达式执行的操作。以下都是一样的:

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

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

这是有效的,因为 . 是一个左关联的 method invocation 运算符,. 左边的值必须是一个对象(或者 class 用于静态方法调用,但让我们跳过它)。

所以表达式被解析成这样:
( someObject . methodReturnsInteger() ) . getClass()

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

方法链接很常见,在使用 builder pattern 时非常好用,例如

String s = new StringBuilder()
        .append("Hello ")
        .append(person.getFirstName())
        .append(", please say hello to your father, ")
        .append(person.getFather().getFirstName())
        .append(".")
        .toString();