31 votes

Pourquoi ce code Java avec "+ +" compile-t-il ?

Je suis curieux de savoir pourquoi ce programme simple a pu être compilé par java en utilisant IntelliJ (Java 7).

public class Main {
    public static void main(String[] args)
    {
        int e = + + 10;
        System.out.println(e);
    }
}

La sortie est toujours de 10.

60voto

Radiodef Points 7837

Il est le plus unaire deux fois. Ce n'est pas un incrément de préfixe car il y a un espace. Java considère les espaces blancs dans de nombreuses circonstances.

Le plus unaire ne fait rien, il ne fait que promouvoir l'opérande.

Par exemple, ceci ne compile pas, parce que le plus unaire provoque l'apparition de l'élément byte pour être promu à int :

byte b = 0;
b = +b; // doesn't compile

34voto

user3694267 Points 470

Dans ce cas, Java considère le + comme un opérateur unaire et donc le résultat est 10 . Essayez simplement avec le code suivant :

int e = + - 10; // result is -10
int e = - - 10; // result is 10

28voto

Anders R. Bystrup Points 7500

Le site + es sont les opérateur unaire plus indiquant le signe de la valeur située à droite de celui-ci, et non pas le opérateur d'addition utilisé lors de l'addition de deux valeurs.

Considérez cette ligne

int e = + + + + + + + + 10;

ce qui est équivalent à ceci

int e = +( +( +( +( +( +( +( +10)))))));

ce qui est à nouveau équivalent à ceci

int e = +10;

et est similaire (dans sa forme) à

int e = -10;

ce qui est probablement plus facile à comprendre.

Et d'ailleurs, + + n'est pas équivalente, ni évaluée par l'analyseur syntaxique comme l'option opérateur d'incrémentation ++ !

21voto

Bathsheba Points 23209

++ et + sont tous deux des opérateurs. Ils sont des éléments du langage. Techniquement, on peut les désigner par jetons . + + n'est pas un jeton unique en Java et est décomposé en deux jetons individuels lors des étapes d'analyse syntaxique de la compilation.

+ peut exister sous deux formes : (i) en tant que unaire opérateur ; par exemple +10 (ce qui est essentiellement un non-retour qui ne fait qu'ajouter à la confusion) ou (ii) en tant que binaire (c'est-à-dire qu'il agit sur deux choses) pour ajouter deux termes ; par exemple 10 + 10 .

Comme ils ont une valeur intrinsèque, vous pouvez également considérer 10 et +10 comme étant à la fois expressions . Vous devez également noter que l'expression unaire + a une précédence d'opérateur très élevée, de sorte qu'elle se liera étroitement à l'expression qui la suit immédiatement.

Donc, ce qui se passe dans votre code, c'est que le compilateur lie l'élément + juste à gauche de l'expression 10 pour produire une autre expression avec la valeur 10. Ensuite, cela lie le deuxième unaire le plus à gauche + pour produire, encore une fois, 10.

En résumé : sans l'espace, ++ est un seul jeton. Sans espace entre eux, les deux + agissent comme deux opérateurs unaires.

4voto

manouti Points 10398

C'est juste le plus unaire. Si vous compilez int e = + + 10 vous obtiendrez le bytecode suivant :

bipush 10
istore_1

ce qui est exactement équivalent à int e = 10

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X