Question

Lorsque je tente d'écrire un postfix / préfixe / décrément, suivi d'un poste / préfixe / décrément, je reçois l'erreur suivante:. Invalid argument à l'opération ++ / -

Mais, selon JLS:

PostIncrementExpression:
        PostfixExpression ++

et

PostfixExpression:
        Primary
        ExpressionName
        PostIncrementExpression
        PostDecrementExpression

écrit donc:

PostfixExpression ++ ++

devrait être possible ... Toute pensée?

Était-ce utile?

La solution

Notez que la grammaire brute n'a pas une sémantique. Il est la syntaxe juste, et non tous les programmes syntaxiquement valide sera généralement valide. Par exemple, l'exigence que les variables doivent être déclarées avant utilisation est généralement pas couvert par la grammaire (vous pouvez, mais il est lourd).

Postfix-incrément donne un rvalue - et tout comme vous ne pouvez pas littéraux postfix-incrément, vous ne pouvez pas postfix incrémentation le résultat de i++

.

citant le JLS (3 e ed, page 486.):

  

Le résultat de l'expression de l'incrément postfix est pas une variable, mais une valeur.

Autres conseils

L'erreur vous indique la réponse:

unexpected type
required: variable
found   : value
        (i++)++;

Ainsi, le i ++ renvoie une valeur alors que l'opérateur demande une variable.

Vous ne pouvez appliquer ++ ou -- à une expression qui désigne un emplacement modifiable (un lvalue). Le résultat d'une ++ ou -- est la valeur de l'emplacement (e rvalue - soit avant, soit après l'augmentation ou la diminution), et non pas lui-même un emplacement modifiable. Donc, vous ne pouvez pas dire (a++)++ plus que vous pouvez dire (a+b)++ -. Il n'y a pas lieu d'être modifié

Le problème avec cette expression i = (i ++) ++; est que (i ++) se résoudre à une valeur et la définition de l'opérateur ++ indique que 1. il incrémente la variable spécifiée et mettra / retourner une valeur pour ce que vous utilisez Postfix ou préfixe. 2. Cet opérateur nécessite la variable si le préfixe ou le suffixe. Mais ce qui se passe ici est (i ++) est de retour une valeur et de le mettre en place (i ++), puis vous rencontrez (valeur) ++ et (valeur) est pas le type prévu pour cet opérateur car elle nécessite une variable à la place de la valeur.

par exemple en Java si vous compilez le code suivant extrait vous obtiendrez erreur est affiché après l'extrait:

public class A {     essai public void () {         int i = 0;         i = (i ++) ++;     } }

sortie Compilation:

A.java:4: Type inattendu nécessaire: Variable trouvé: valeur                 i = (i ++) ++;                       ^ Une erreur

i ++ est essentiellement un raccourci pour:

(i = i + 1)

Et il ne serait pas de sens d'écrire:

(i = i + 1) ++;

droite? :)

Quel devrait être le résultat d'une telle opération? Le résultat de i++ est (une copie de) la valeur actuelle de i et i est incrémenté après ( après ). Alors, comment imaginez-vous incrémenter encore une fois le résultat de i++? Si i était à l'origine 1, ce qui devrait être sa valeur après i++++, et quel doit être le résultat de cette opération?

Si vous y pensez, vous savez sans doute qu'il serait très difficile de définir ce bien. Étant donné que les concepteurs de Java destinés à éviter le C / C ++ pièges « non défini » (et puisque la valeur d'une telle déclaration est douteuse au mieux),

ils ont probablement décidé de rejeter explicitement.

ne faut pas oublier: Incrémenter et décrémenter opérateur (préfixe et postfix) toujours travailler avec variable pas valeur

Ici, je suis Illustrons cela par un exe:

int i = 0;

int j = (i++)++;

ci-dessus exe.

  

valeur initialisation de i 0 (zéro)

     

(i ++) '++' travail avec i qui est variable et après l'exécution de l'opération de retour (1)

     

(1) ++ '++' travail avec (1), qui est la valeur non variable qui est s'opposer aux règles de java qui est pourquoi erreur de compilation générer argument non valide pour opération ++ / -

Ce que vous essayez d'atteindre (i ++) ++?

incrémenter deux fois !!

Utilisez Looping

incrément dans une boucle:)

i ++, ++ est un opérateur de Postfix, il retourne la valeur de i, puis incrémente. Que voudriez-vous (i ++) ++ faire? Faut-il revenir i + 1 car (i ++ == i)? Dans le cas contraire serait-ce pas étrange que je ++ = i mais (i ++) ++ = i) considère les expressions suivantes:

i++  ==  i;   // true
j = i++  // j gets the value of i
j++ == i //  still true since j== i

(i++) ++ ==  j ++    //  what should be the answer here?

Avez-vous envisagé i + = 2?

Pourquoi ne pas simplement utiliser l'opérateur d'incrémentation de raccourci?

i+=2

.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top