Java é dito para ignorar espaços em branco extra. Por que c = a ++ + ++ b não compilar sem espaços?

John Allison:

Em todos os livros sobre Java, eu li que os compilador trata todos os espaços da mesma forma e simplesmente ignora espaços em branco extra, por isso é melhor prática para usá-los livremente para melhorar a legibilidade do código. Eu encontrei a prova de que, em cada expressão que eu escrevi: Não importava se havia espaços ou não, e como muitos (ou talvez eu simplesmente não prestar atenção).

Recentemente, decidi experimentar um pouco com precedência de operador e associação para testar a tabela de precedência em ação e tentou compilação

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

Enquanto a primeira declaração compilado perfeitamente, este último produziu uma exceção:

Exception in thread java.lang.RuntimeException "principal": o código-fonte Uncompilable - tipo inesperado. Necessário: variável. Encontrado: valor.

No entanto, quando eu adicionei espaços: int d = a++ + ++b, é compilado. Por que é este o caso? Java é dito para ignorar espaços em branco extra de qualquer maneira. (Eu tenho Java 8 e NetBeans IDE 8.2, se isso importa.)

Eu acho que isso pode ter algo a ver com a forma como expressões são analisados, mas eu não tenho certeza. Eu tentei olhar-se várias perguntas sobre a análise, os espaços em branco e operadores sobre SO e no Google, mas não conseguiu encontrar uma resposta definitiva.

UPD. Para lidar com os comentários que ele é o 'extra' que importa, não todos os espaços: uma vez int c = a++ + b;e int c=a+++b;ambos compilação, pode-se dizer, por analogia, que no int d = a ++ + ++b;espaço em branco é 'extra' também.

Daniel Pryden:

Java Specification Language secção 3.2 , "lexicais Traduções", diz (grifo meu):

Um fluxo de caracter Unicode bruto é traduzido para uma sequência de sinais , usando as seguintes três passos de tradução lexicais, os quais são aplicados, por sua vez:

  1. A tradução de Unicode escapa [...]

  2. Uma tradução [...] em uma corrente de caracteres de entrada e terminadores de linha [...].

  3. A tradução da sequência de caracteres de entrada e terminadores linha resultante da Fase 2 em uma sequência de elementos de entrada (§3.5) que, depois de o espaço em branco (§3.6) e comentários (§3.7) são descartados, compreendem as fichas (§3.5) que são os símbolos terminais da gramática sintática (§2.3).

O mais longo possível tradução é usado em cada etapa , mesmo que o resultado não, finalmente, fazer um programa correto, enquanto outra tradução lexical faria.

Assim, os caracteres de espaço em branco são descartados, mas após a "sequência de elementos de entrada" é determinada. Seção 3.5, "Input Elements e fichas", diz:

O espaço em branco (§3.6) e comentários (§3.7) pode servir para os tokens separados que, se adjacente, pode ser indexado de outra maneira. Por exemplo, os caracteres ASCII - e = no de entrada pode formar o operador símbolo - = (§3.12) somente se houver nenhum está intervindo espaço em branco ou comentário.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=182685&siteId=1
Recomendado
Clasificación