在 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))++
:
a
变量参考
++X
前缀递增运算符(JLS §15.15.1)
X++
后缀递增运算符 (JLS §15.14.2)
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();
我的问题是简单的英语:为什么这有效 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))++
:
a
变量参考++X
前缀递增运算符(JLS §15.15.1)X++
后缀递增运算符 (JLS §15.14.2)
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();