-1

我用简单的英语提出的问题:为什么这行得通someObject.methodReturnsInteger().getClass()(我不是真的指getClass方法。只是一种与 Integer 一起工作的方法。而且我并不是真的指专门返回 Integer 的方法。)但这不是++a++吗?

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

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

我希望这个问题足够清楚。

感谢您的时间。

4

3 回答 3

3

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

Javadoc 说:

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

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


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

以这种方式解析它是因为 Java 分词器将使用尽可能多的连续字符来形成有效的运算符。

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

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

该表达式someObject.methodReturnsInteger().getClass()称为“方法链接”。

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

所以表达式解析如下:
( someObject . methodReturnsInteger() ) . getClass()

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

方法链非常常见,在使用构建器模式时非常好,例如

String s = new StringBuilder()
        .append("Hello ")
        .append(person.getFirstName())
        .append(", please say hello to your father, ")
        .append(person.getFather().getFirstName())
        .append(".")
        .toString();
于 2016-07-10T15:16:31.730 回答
2

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

于 2016-07-10T14:58:20.447 回答
1

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

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

post-fix 和 pre-fix 增量运算符返回临时结果,这就是为什么您不能应用它们两次或组合使用它们的原因。

于 2016-07-10T14:57:57.743 回答