Что означает "квалификатор"?

Что означает "квалификатор" и разница между "классификатором" и "ключевым словом"?

Для volatile классификатор в C, и мы можем сказать, что volatile является ключевым словом, так что означает "квалификатор"?

1 ответ

Решение

Квалификатор добавляет дополнительное "качество", такое как указание изменчивости или постоянства переменной. Они похожи на прилагательные: " непостоянный человек", " изменчивый int", " нетленная леди", " const double". С или без квалификатора, сама переменная все еще занимает тот же объем памяти, и каждый бит имеет одинаковую интерпретацию или вклад в состояние / значение. Классификаторы просто указывают что-то о том, как к нему можно получить доступ или где оно хранится.

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

Примеры

  • volatile а также const оба являются определителями и ключевыми словами
  • if, class, namespace ключевые слова, но не классификаторы
  • std, main, iostream, x, my_counter все идентификаторы, но не ключевые слова и не классификаторы

Полный список ключевых слов можно найти по адресу http://www.cppreference.com/wiki/keywords/start. В C++ в настоящее время нет квалификаторов, которые не являются ключевыми словами (т. Е. Все они являются "словами", а не символами пунктуации).


Где появляются классификаторы относительно информации другого типа?

Небольшое отступление от "что означает классификатор" в синтаксисе использования классификатора - как Zaibis комментирует ниже:

... [квалификаторы] определяют только то, что следует [когда] ничего не предшествует. так что если вы хотите const указатель на неconst объект, который вы должны были написать char * const var...


Немного (много?) Об идентификаторах

Самиидентификаторы являются лексическими токенами (отдельными частями исходного кода C++), которые:

  • начинаться с буквенного / буквенного символа или подчеркивания
  • продолжить с 0 или более буквенно-цифровыми или подчеркиваниями

Если это помогает, вы можете думать об идентификаторах, как указано в регулярном выражении "[A-Za-z_][A-Za-z_0-9]*". Примерами являются "egg", "string", "__f", "x0", но не "4e4" (a double литерал), "0x0a" (это шестнадцатеричный литерал), "(f)" (это три лексических токена, середина - идентификатор "f").

Но являются ли ключевые слова идентификаторами?

Для C++ терминология не используется последовательно. В общем вычислительном использовании ключевые слова являются подмножеством идентификаторов, и некоторые места / применения в Стандарте C++11 четко отражают следующее:

  • "Идентификаторы, показанные в таблице 4, зарезервированы для использования в качестве ключевых слов" (первое предложение в 2.12 Ключевые слова)
  • "Идентификаторы, которые являются ключевыми словами или операторами в C++..." (из сноски 7 в 17.6.1.2)

(Существуют альтернативные формы некоторых операторов - not, and, xor, or - хотя досадно Visual C++ отключает их по умолчанию, чтобы избежать взлома старого кода, который использовал их, но не как операторы.)

Как указывает Potatoswatter в комментарии, во многих других местах Стандарт определяет лексические токены identifier а также keyword как взаимоисключающие токены в грамматике:

  • "Существует пять видов токенов: идентификаторы, ключевые слова, ..." (2.7 токены)

Существует также крайний случай, когда определение является чувствительным к контексту:

  • Если ключевое слово (2.12) или альтернативный токен (2.6), который удовлетворяет синтаксическим требованиям идентификатора (2.11), содержится в атрибуте-токене, он считается идентификатором. (7.6.1. Синтаксис и семантика атрибутов 2)

Идентификаторы не ключевых слов, которые вы все равно не должны использовать

Некоторые идентификаторы, такие как "std" или "string", имеют конкретное использование, указанное в Стандарте C++, хотя они не являются ключевыми словами. Как правило, сам компилятор не обрабатывает их иначе, чем ваш собственный код, и если вы не включите какие-либо стандартные заголовки, то компилятор, вероятно, даже не будет знать о применении стандартного мандата "std". Вы можете создать свою собственную функцию, переменную или тип с именем "std". Хотя это не очень хорошая идея... хотя приятно понимать общее разделение между ключевыми словами и стандартной библиотекой, реализации могут свободно стирать границы, поэтому вы должны просто предполагать, что функции C++ работают, когда включены соответствующие заголовки и ваше использование соответствует документации, и не делайте ничего, что может конфликтовать.

Другие вопросы по тегам