Что означает "квалификатор"?
Что означает "квалификатор" и разница между "классификатором" и "ключевым словом"?
Для 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++ работают, когда включены соответствующие заголовки и ваше использование соответствует документации, и не делайте ничего, что может конфликтовать.