Je me demande pourquoi en C # Ce qui suit va bien: mais p>
3 Réponses :
J'utilise vs 2012. C'est un peu intéressant.
Le premier peut être analysé dans: p> sans changer le résultat final. Vous pouvez donc voir pourquoi il serait valide. P> Le second, cependant, a un problème avec le est valide. P> Je suis sûr que Jon Skeet ou Eric Lippert ou une personne apparaîtra et signalez la partie pertinente de la spécification C #. Je ne suis même pas sûr où commencer. Mais juste suivant le général de gauche à droite à l'analyse de jeton à droite, vous pouvez voir où il s'étoufferait sur le second. P> p> +++ x code> parce que (je devine) il voit les deux ++ et essaie d'appliquer cet opérateur unaire à la valeur R, qui est une autre + (et non une valeur R valide).
Vous pouvez le regrouper de différentes manières de le faire fonctionner, bien que: p>
FYI Toute la grammaire est à la fin de la spécification dans une annexe.
Je ne vois rien que "l'un des" sur la grammaire de l'opérateur, que ce soit pour préférer + code> ou
++ code> à n'importe quelle étape semble vague.
@ Jochimisaksson: Section 2.3 de la spécification dit "Lorsque plusieurs productions de grammaire lexicales correspondent à une séquence de caractères dans un fichier source, le traitement lexical forme toujours l'élément lexical le plus long possible." I>
Le compilateur recherche une variable ou une propriété après le second Vous pouvez faire quelque chose comme: p> ou p> si vous le souhaitez. P> La raison Le premier exemple que vous avez énuméré a fonctionné est que le compilateur peut déterminer que Les deux sont probablement valables à l'aide d'un autre compilateur. Cela dépend de la sémantique. P> p> ++ code> dans
int y = x +++ - +++ x code> et ne peut pas déterminer que sans espace ou des parenthèses.
+ - code> à partir du
++ x code>; Alors que dans le deuxième exemple, il ne peut pas déterminer où séparer le
+++ code> et on s'attend naturellement à une variable après sa lit le premier
++ code>; Donc, en bref, le compilateur essayant d'utiliser
+ x code> comme une variable qui n'est pas valide. p>
Les deux autres réponses sont correctes; Je leur ajouterai que cela illustre certains principes de base d'analyse lexicale: p>
Ces principes impliquent que L'analyseur parsa ensuite Voir aussi: http: //blogs.msdn .COM / B / ERICLIPPERT / Archive / 2010/10/11 / 10070831.aspx P> +++ x code> sera lexé comme
++ + x code> et non
+ ++ x code>. P >
++ + x code> comme
++ (+ x) code> et
(+ x) code> n'est pas un < em> variable em>, c'est une valeur em>, elle ne peut donc pas être incrémentée. P>
+1, bien que cela soit étrange que mono puisse compiler le même code. Soit la spécification est un peu "ouverte" de ce côté-là, soit l'un des compilateurs n'est pas tout à fait à la hauteur de la spécification.
@ Jochimisaksson: Mono a un petit bug; Je soupçonne que c'est dans l'analyseur sémantique, pas l'analyseur lexical. C'est-à-dire qu'il est pas b> le cas que mono est lexing +++ x code> comme
+ ++ x code>. Plutôt, je soupçonne que c'est le lexing correctement comme
++ + x code>, puis l'analyseur sémantique traite
+ x code> comme
x code>, mais oubliant que
+ x code> est une valeur, pas une variable, et donc non admissible en tant qu'opérande de l'incrément.
@ Jochimisaksson: En effet. Le compilateur Microsoft C # avait un certain nombre de ces sortes de bugs en C # 2.0; J'ai enlevé beaucoup d'entre eux en C # 3.0. Quelques-uns nous avons gardé parce qu'ils étaient inoffensifs et que le changement de rupture aurait été perturbateur.
Une meilleure question est de savoir pourquoi voudriez-vous utiliser cela?
Cela dépend du compilateur (.NET 4.5 sur VS 2012 se plaint)
Nous avons besoin de spécificités sur le compilateur que vous utilisez, ce que vous ciblez, etc.
Oui, pourquoi voudriez-vous utiliser cela?
Je ne pense pas que cela devrait être en attente, c'est une question légitime sur C # et est sur le sujet.
C'est une question technique parfaitement raisonnable avec une réponse spécifique qui n'est pas évidente. Il ne devrait pas être fermé comme hors sujet.