Je lis qu'il existe des constantes lexicales, des opérateurs lexicaux, une portée lexicale, etc. En quoi le terme "lexical" change-t-il la signification d'une constante, par exemple d'une chaîne littérale, d'un opérateur quelconque, ou d'une portée d'un identificateur ?
Réponses
Trop de publicités?Le terme "lexical" signifie qu'il est lié au code source.
Par exemple, 1
est une constante lexicale. D'AUTRE PART, sizeof(char)
est également une expression de constante intégrale à la compilation, mais ce n'est pas une constante lexicale. D'un point de vue lexical, il s'agit d'une invocation de la fonction sizeof
de l'opérateur.
Les opérateurs lexicaux travaillent sur le code source. Les opérateurs du préprocesseur entrent dans cette catégorie.
Dans la plupart des cas, il n'y a pas de différence entre l'utilisation de 1
o sizeof(char)
n'importe où dans mon programme. Mais, comme l'argument des opérateurs lexicaux #
o ##
cela fait une différence considérable, car ces derniers travaillent sur le code réel et non sur le résultat de l'évaluation :
#define STR(x) #x
std::string one = STR(1);
std::string also_one = STR(sizeof(char));
Enfin, la portée lexicale désigne la partie du code source du programme où l'identificateur existe (est reconnu, peut être utilisé). Cela contraste avec la portée dynamique, également connue sous le nom de durée de vie de l'objet, qui est la partie du programme où l'objet existe (conserve sa valeur et peut être manipulé indirectement par le biais d'un pointeur ou d'une référence, même si le nom n'est pas dans la portée lexicale).
string f(string x) { return "2" + x; } // main's "y" is not in lexical scope, however it is in dynamic scope, and will not be destroyed yet
int main(void)
{
string y = "5.2"; // y enters lexical scope and dynamic scope
string z = f("y"); // y leaves lexical scope as f is called, and comes back into lexical scope when f returns
return z.size();
// z leaves lexical and dynamic scope, destructor is called
}
Le fait d'utiliser le terme "constante lexicale" ne signifie pas qu'il s'agit d'un autre type de constante.
En général, lorsque vous parlez de grammaire C++, vous utilisez le terme lexical ceci, lexical cela. Par opposition aux constantes stockées dans des objets, à la portée d'un fichier ou à un opérateur sur une matrice.
Donc, si je parle d'une ligne de code, qui a une constante comme : (32786)
Je peux utiliser le mot lexical (peut-être inutilement) pour confirmer que le nombre n'existe que sous la forme d'un jeton C++.
Ainsi, lorsque je parle de Jetons C++ et leurs relations, j'utilise le mot lexical comme wikipedia le fait .