爪哇。算术运算。标记化。如何?

发布于 2024-09-30 05:44:02 字数 195 浏览 1 评论 0原文

谁能解释一下或为理解这个例子提供一个很好的参考:

int a=1;
int b=2;
System.out.println(a---b); //correct
System.out.println(a- -b); //correct
System.out.println(a--b); //wrong

谢谢。

Who can explain or give a good reference for understanding this example:

int a=1;
int b=2;
System.out.println(a---b); //correct
System.out.println(a- -b); //correct
System.out.println(a--b); //wrong

thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

箹锭⒈辈孓 2024-10-07 05:44:02

表达式 a---b 并未(如您所期望的那样)解析为 a-(-(-b)) ,而是解析为 (a-- ) - b

这个例子说明了这一点:

int a = 0;
int b = 0;
System.out.println(a---b);  // prints 0
System.out.println(a);      // prints -1

考虑到这种行为,a--b 被解析为 (a--)b 这显然是一个错误。

当您在减号之间放置空格时,a- -b 它不再被解析为 -- 运算符,而是解析为二进制和一元减号:a - (-b)

请注意,您可以编写 a- - -b,它会被解释为 a-(-(-b))

那么为什么会这样解释呢? @EJP 对另一个答案给出了很好的评论。在 JLS,第 3.2 节中,您可以阅读下列:

每一步都会使用尽可能长的翻译,即使结果最终没有生成正确的程序,而另一个词法翻译却可以。因此,输入字符 a--b 被标记(§3.5)为 a--b、它不是任何语法正确的程序的一部分,即使标记化 a--b 可以成为语法正确的程序的一部分。

The expression a---b is not (as you perhaps expected) parsed as a-(-(-b)) but rather as (a--) - b.

This example illustrates it:

int a = 0;
int b = 0;
System.out.println(a---b);  // prints 0
System.out.println(a);      // prints -1

With this behaviour in mind, a--b is parsed as (a--)b which is obviously an error.

When you put a space between the minuses, a- -b it's no longer parsed as the -- operator, but as a binary and unary minus: a - (-b).

Note that you can write a- - -b which is interpreted as a-(-(-b)).

So why is it interpreted like this? Well @EJP gave an excellent comment on another answer. In the JLS, section 3.2 you can read the following:

The longest possible translation is used at each step, even if the result does not ultimately make a correct program while another lexical translation would. Thus the input characters a--b are tokenized (§3.5) as a, --, b, which is not part of any grammatically correct program, even though the tokenization a, -, -, b could be part of a grammatically correct program.

情话墙 2024-10-07 05:44:02

--- 是一元运算符。因此不能与两个操作数一起使用。这就是为什么

System.out.println(a--b);

是错误的。 -- 应用于 a,因此 a 的新值为 0。如果再添加一个-,那么a的值减去1后,就会减去b的值> 产生-2

- and -- are unary operators. Therefore can't be used with two operands. That's why

System.out.println(a--b);

is wrong. -- is applied to a, so the new value of a is 0. If you add one more -, then the value of a decremented by 1 will be subtracted by the value of b yielding -2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文