gpt4 book ai didi

据说 Java 会忽略多余的空格。为什么 c=a+++++b 没有空格就不能编译?

转载 作者:搜寻专家 更新时间:2023-11-01 01:07:26 25 4
gpt4 key购买 nike

在所有关于 Java 的书籍中,我都读到编译器以相同的方式处理所有空白并简单地忽略额外的空白,因此最佳做法是自由使用它们以提高代码的可读性。我在我写的每一个表达式中都找到了这一点的证据:有没有空格,有多少(或者也许我只是没有注意)并不重要。

最近我决定对运算符优先级和结合性进行一些实验,以实际测试优先级表并尝试编译

int a = 2;
int b = 3;
int c = a+++b;
int d = a+++++b;

虽然前一条语句编译完美,但后者产生了异常:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - unexpected type. Required: variable. Found: value.

但是,当我添加空格时:int d = a+++++b,它编译了。为什么会这样?据说 Java 无论如何都会忽略额外的空格。 (如果重要的话,我有 Java 8 和 Netbeans IDE 8.2。)

我想这可能与表达式的解析方式有关,但我不确定。我尝试在 SO 和 Google 上查找有关解析、空格和运算符的几个问题,但找不到明确的答案。

更新。为了解决评论,它是重要的“额外”,而不是所有空格:因为 int c = a++ + b;int c=a+++b; 两者编译,可以类推地说,在 int d = a+++++b; 中,空格也是“额外的”。

最佳答案

Java Language Specification section 3.2 ,“词汇翻译”,说(强调我的):

A raw Unicode character stream is translated into a sequence of tokens, using the following three lexical translation steps, which are applied in turn:

  1. A translation of Unicode escapes [...]

  2. A translation [...] into a stream of input characters and line terminators [...].

  3. A translation of the stream of input characters and line terminators resulting from step 2 into a sequence of input elements (§3.5) which, after white space (§3.6) and comments (§3.7) are discarded, comprise the tokens (§3.5) that are the terminal symbols of the syntactic grammar (§2.3).

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.

所以空白字符被丢弃,但是在确定“输入元素的序列”之后。第 3.5 节“输入元素和标记”说:

White space (§3.6) and comments (§3.7) can serve to separate tokens that, if adjacent, might be tokenized in another manner. For example, the ASCII characters - and = in the input can form the operator token -= (§3.12) only if there is no intervening white space or comment.

关于据说 Java 会忽略多余的空格。为什么 c=a+++++b 没有空格就不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53743953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com