2015-04-07 2 views
-1

Quelqu'un peut-il résoudre ma confusion ici est mon code:Différence entre i = i + 1 et i ++

byte i = 0; 

i++; 
System.out.println(i); 

Résultat:

byte i = 0; 

i = i+1; 
System.out.println(i); 

Generate erreur de compilation de temps: Incompatibilité de type: impossible de convertir d'int en octet

Quand je convertir en octets comme: i = (byte) (i+1); puis obtenir joyeusement résultat

du spectacle cet exemple, je suis COMPRENDRE i = i + 1 & i ++ effectuer ne peut pas même l 'opération ne maintenant i Je veux savoir quelle est exactement la différence entre eux ... !!! Implicitement renvoyé le résultat au type i

+0

Vérifiez ceci: http://stackoverflow.com/questions/13100019/why-can-not-i-add-two-bytes -et-get-an-int-et-i-can-add-deux-final-bytes-get-ab – atom

+0

La distribution implicite se produit en faisant l'incrément .. donc les deux sont identiques à la fin. – Selva

+0

Je pense que vous devriez concentrer votre apprentissage sur les différences entre les types de données primitifs ** octet ** et ** int ** - et les conversions entre ceux-ci. – GhostCat

Répondre

-2

Enfin je suis mes problèmes (trouvé questions) supérieur comprennent donc ici la décrire comprend d'autres facilement .. !!!

1>i = i + 1

En java chaque fois qu'une opération arithmétique effectue entre deux ou plusieurs variables alors il est le type de valeur de retour dépend comme cette équation:

RETURN VALUE TYPE = (int, MAXIMUM RANGE OF VARIABLE-1, MAXIMUM RANGE OF VARIABLE-N)

ici, Retour Type de valeur: int

Pour eqution (int, byte, octet) donc int ont rang maximal e ..

octet -> 1 octet taille & int -> 4 octets taille

Voilà pourquoi ci-dessus exe je ne peux pas stocker cette valeur de retour dans l'octet directement, il est besoin coulée de type externei = (octet) (i + 1)

2>i ++

en Java chaque fois incrément & opération de décrémentation effectuer ce genre alors il est le type de valeur de retour dépend de l'équation suivante:

RETURN VALUE TYPE = (VARIABLE TYPE, VALUE + 1)

ces équations représentent coulée de type interne effectuer dans ce cas

doit se rappeler:

case 1: Fonte de type externe si nécessaire

Cas n ° 2: coulée de type interne effectue automatiquement

6

i++ et i+=1.

Donc, si i est un byte, alors i++; est pas équivalent à i = i + 1; - il est en fait équivalent à i = (byte)(i + 1);.

De la spécification du langage Java, section 15.14.2, Souligné par l'auteur:

... the value 1 is added to the value of the variable and the sum is stored back into the variable. Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.

Il n'y a aucune raison fondamentale à elle, autre que « parce que le cahier des charges le dit ». Les personnes qui ont écrit la spécification l'ont probablement écrit de cette façon, de sorte que ++ serait utile pour tous les types numériques (pas seulement int et long).

+0

Impossible de clarifier la différence encore –

+2

@DhruvRaval Connaissez-vous la différence entre 'i = i + 1' et' i = (byte) (i + 1) '? – immibis

2

interne pour court, char, byte et int type de données si une opération arithmétique est effectuée compilateur mettra à jour le type de données à int et effectuer l'opération. compilateur changer le type de données d'une valeur de résultat de l'expression de int

donc pour octet i

i = i+1; // will not work 

car i+1 entraînera une valeur de type de données entier. de sorte que vous devez typecast externe comme

i = (byte)(i+1); // this is equivalent to i +=1; or you can say i++; 
+0

@ Jägermeister: mec ajouter deux valeurs d'octet et affecter en variable octet et voir. – Prashant

+2

@ Jägermeister Non, * ce n'est pas vrai. Le résultat de l'ajout de deux 'byte's est un' int', [essayez et voyez] (http://ideone.com/D4WzNI). – immibis

+0

@ Jägermeister: selon vous 'byte b = 0; byte c = 0; \t octet d = b + c; 'cela devrait fonctionner? mais ça ne marchera pas parce que le résultat est un int. – Prashant