2017-10-16 10 views
3

J'essaye d'employer l'octet comme variable de boucle de contrôle dans la boucle for. I utilisé en tant que la condition n < 128 (où 128 est hors de portée de l'octet)Pourquoi Java n'a pas vérifié la compatibilité de type pour les octets car il meurt avec int?

for (byte n =0; n < 128 ; n++) System.out.println("I am in For loop. "+ n); 

et la boucle va infiniment de 0 à 127 et -128 à 127.

quand j'essayé faire la même chose avec int. ça a donné l'erreur.

for (int n = 0; n < 2147483648; n++) 

Le 2147483648 littéral de type int est hors de portée

Pourquoi ne pas java vérifier la compatibilité de type avec octet comme il vérifié pour Int?

Répondre

3

Avec n < 128 int se produit la comparaison; n est propagé à un int. Cependant toute valeur d'octet en tant que int est inférieure à 128. Et n ++ déborde.

Pour l'autre cas:

n < 2147483648L 

aurait été accepté et causé le même problème.

7

La compatibilité de type n'est pas vérifiée par rapport au type de la variable de la boucle. Le type d'un entier littéral sans suffixe est toujours int. 128 est un int valide, donc la première boucle passe la compilation mais entraîne un débordement numérique menant à une boucle infinie. Par contre, 2147483648 n'est pas un int valide, donc la deuxième boucle ne réussit pas la compilation. Si vous remplacez 2147483648 par un littéral long (2147483648L), la deuxième boucle passera également la compilation.