2011-11-07 25 views
8

He leído que hay constantes léxicas, operadores léxicos, alcance léxico, etc. ¿cómo el término "léxico" cambia el significado de una constante, por ejemplo, literal de cadena, para cualquier operador o un alcance de algún identificador?¿Qué significa el término "léxico" en C++?

Respuesta

0

poner usando el término 'constante léxica' no implica un tipo diferente de constante.

En general, cuando se habla de gramática C++, usará el término léxico esto, léxico. A diferencia de tener constantes almacenadas en objetos, y el alcance de un archivo, o un operador en una matriz.

Así que si yo estoy hablando de una línea de código, que tiene una constante como: (32786) puedo usar la palabra léxica (tal vez innecesariamente) para confirmar el sentido de que el número sólo existe como una muestra de C++.

Así que cuando estoy hablando de C++ tokens y sus relaciones, estoy usando la palabra léxico como wikipedia does.

7

"lexical" significa que está relacionado con el código fuente.

Por ejemplo, 1 es una constante léxica. OTOH, sizeof(char) es también una expresión constante integral en tiempo de compilación, pero no es una constante léxica. Léxicamente, es una invocación del operador sizeof.

Operadores léxicos trabajan en el código fuente. Los operadores preprocesadores entran en esta categoría.

En la mayoría de los casos, no importa si utilizo 1 o sizeof(char) en cualquier lugar de mi programa. Pero, como el argumento de los operadores léxicas # o ## se hace una diferencia considerable, ya que estos trabajos sobre el código real y no el resultado de la evaluación:

#define STR(x) #x 

std::string one = STR(1); 
std::string also_one = STR(sizeof(char)); 

Por último, ámbito léxico se entenderá la parte de la fuente de programas código donde existe el identificador (se reconoce, se puede usar). Esto está en contraste con el alcance dinámico, también conocido como duración del objeto, que es la parte del programa donde existe el objeto (mantiene su valor y puede manipularse indirectamente a través de un puntero o referencia, aunque el nombre no esté en el alcance léxico) .

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 
}