2016-09-02 2 views
2

J'ai toujours cru comprendre que les valeurs l devaient être évaluées, mais pour des raisons évidentes et faciles à expliquer. Un identifiant représente une région de stockage, et la valeur est dans ce stockage et doit être récupérée. Ça a du sens. Mais un programme ayant besoin d'évaluer un littéral (par exemple, l'entier 21) n'a pas vraiment de sens pour moi. La valeur est là, combien plus explicite pouvez-vous obtenir? Eh bien, en plus d'ajouter U pour non signé, ou un autre suffixe. C'est pourquoi je suis curieux de savoir si les littéraux ont besoin d'être évalués, car je n'ai vu cela que dans un seul endroit. La plupart des livres changent également de terminologie, comme «Expression primaire», «opérande» ou «sous-expression» et autres, au point que les lignes commencent à se brouiller. Pendant tout ce temps, je n'ai pas encore vu d'explication claire pour cette chose particulière. Cela semble être un gaspillage de puissance de traitement.Est-ce que les littéraux en C++ sont vraiment évalués?

+1

* "Je n'ai vu que ceci mentionné au même endroit" * - soin de partager? – LogicStuff

+2

"Les valeurs-l doivent évaluer" Qu'est-ce que cela signifie? – juanchopanza

+0

Les valeurs l ont des valeurs variables qui doivent être récupérées –

Répondre

6

Un littéral ordinaire n'a besoin d'être évalué que pendant la compilation, par le compilateur.

Un littéral défini par l'utilisateur peut également être évalué au moment de l'exécution. Par exemple, après avoir inclus l'en-tête <string> et rendu ses littéraux ...s disponibles par la directive using namespace std::string_literals;, "Blah"s est un littéral défini par l'utilisateur de type std::string. La partie "Blah" est évaluée par le compilateur, au moment de la compilation. La conversion en std::string, qui implique une allocation dynamique, se produit nécessairement au moment de l'exécution.

+0

* Un littéral ordinaire n'a besoin d'être évalué que pendant la compilation, par le compilateur. * Strictement parlant, ce n'est pas tout à fait vrai pour les types à virgule flottante. Voir [ma réponse] (http://stackoverflow.com/a/39293264/6394138). – Leon

+0

@Leon Il a dit un * ordinaire * littéral ..... – DarthRubik

+0

@Leon: Je ne peux pas imaginer qu'il puisse y avoir plus de deux résultats binaires possibles pour chaque littéral fp. Il n'y a donc aucun problème à générer les deux à la compilation. Au moment de l'exécution, le mode d'arrondi peut simplement basculer entre les blocs de valeurs. Mais puisque je n'ai pas entendu parler d'un tel système, je pense que ce n'est pas fait dans la pratique. –

1

Mais un programme ayant besoin d'évaluer un littéral (par exemple, l'entier 21) n'a pas vraiment de sens pour moi. La valeur est juste là, combien plus explicite pouvez-vous obtenir ?

Les choses sont un peu plus compliquées pour les types à virgule flottante. Considérez le numéro 0.1. En binaire, il ne peut pas être représenté exactement et la représentation en virgule flottante la plus proche doit être sélectionnée pour cela. Si vous entrez ce nombre pendant l'exécution, la conversion de 0.1 en représentation binaire doit respecter le mode d'arrondi (vers le haut, vers le bas, vers zéro, vers l'infini). Le traitement strict de l'arithmétique en virgule flottante suggère que la conversion du littéral en virgule flottante 0.1 en représentation binaire doit également être effectuée en respectant le mode d'arrondi (qui ne devient connu que pendant l'exécution) et ne peut donc pas être effectué par le compilateur. peut être fait par le compilateur mais l'arrondi final doit être effectué pendant l'exécution, en tenant compte du mode d'arrondi).

+1

Il n'est pas obligatoire de le faire à l'exécution. La norme C++, §2.13.4 indique "... Si la valeur mise à l'échelle est dans la plage des valeurs représentables pour son type, le résultat est la valeur scalable si représentable, sinon la valeur représentable la plus grande ou la plus petite la plus proche de la valeur une manière définie par l'implémentation. ... ". Cela signifie qu'un compilateur doit * documenter * comment cela est fait, mais cela peut aussi être fait au moment de la compilation. – alain