Что означает термин «лексический» в C ?

#c

#c

Вопрос:

Я читал, что существуют лексические константы, лексические операторы, лексическая область видимости и т.д. как термин «лексический» изменяет значение константы, например, строкового литерала, для любого оператора или области видимости некоторого идентификатора?

Ответ №1:

«лексический» означает, что он связан с исходным кодом.

Например, 1 является лексической константой. OTOH, sizeof(char) также является выражением интегральной константы во время компиляции, но это не лексическая константа. Лексически это вызов sizeof оператора.

Лексические операторы работают с исходным кодом. Операторы препроцессора попадают в эту категорию.

В большинстве случаев не имеет значения, использую ли я 1 или sizeof(char) где-либо еще в моей программе. Но в качестве аргумента лексических операторов # или ## это имеет существенное значение, потому что они работают с фактическим кодом, а не с результатом вычисления:

 #define STR(x) #x

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

Наконец, лексическая область видимости означает часть исходного кода программы, где существует идентификатор are (распознан, может быть использован). Это в отличие от динамической области видимости, также известной как время существования объекта, которая является частью программы, где существует объект (сохраняет свое значение и может управляться косвенно с помощью указателя или ссылки, даже если имя не входит в лексическую область видимости).

 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
}
  

Ответ №2:

использование термина «лексическая константа» не подразумевает другого вида константы.

Обычно, когда вы говорите о грамматике C , вы будете использовать термины «лексический это», «лексический то». В отличие от наличия констант, хранящихся в объектах, и области видимости файла или оператора в матрице.

Итак, если я говорю о строке кода, которая имеет константу типа: (32786) Я могу использовать слово lexical (возможно, без необходимости), чтобы подтвердить значение того, что число существует только как токен C .

Итак, когда я говорю о токенах C и их взаимосвязях, я использую слово «лексический», как это делает википедия.