Основные элементы языка программирования. Лексемы языка: идентификаторы, константы, ключевые слова, знаки операций, разделители. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные элементы языка программирования. Лексемы языка: идентификаторы, константы, ключевые слова, знаки операций, разделители.



Лексема, или элементарная конструкция, — минимальная единица языка, имеющая самостоятельный смысл.

Идентификатор — это имя программного объекта. В идентификаторе могут использоваться

латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, sysop, SySoP и SYSOP — три различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются.

Длина идентификатора по стандарту не ограничена, но некоторые компиляторы и компоновщики налагают на нее ограничения. Идентификатор создается на этапе объявления переменной, функции, типа и т. п., после этого его можно использовать в последующих операторах программы. При выборе идентификатора необходимо иметь в виду следующее:

• идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

• не рекомендуется начинать идентификаторы с символа подчеркивания, поскольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

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

 

Ключевые слова — это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их можно использовать только в том смысле, в котором они определены. Список ключевых слов C++ (asm

Auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new perator private protected public register reinterpret_cast return short signed sizeof static static__cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while

 

Знак операции — это один или более символов, определяющих действие над операндами. Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов. Один и тот же знак может интерпретироваться по-разному в зависимости от контекста.

Все знаки операций за исключением [ ], () и?: представляют собой отдельные лексемы.

 

Константами называют неизменяемые величины. Различаются целые, вещественные, символьные и строковые константы. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду. Форматы констант, соответствующие каждому типу, приведены в

Если требуется сформировать отрицательную целую или вещественную константу, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -ОхЗС, -4.8, -0.1е4.

Вещественная константа в экспоненциальном формате представляется в виде мантиссы и порядка. Мантисса записывается слева от знака экспоненты (Е или е), порядок — справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. Обратите внимание, что пробелы внутри числа не допускаются, а для отделения целой части от дробной используется не запятая, а точка.

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char. Двухсимвольные константы занимают два байта и имеют тип int, при этом первый символ размещается в байте с меньшим адресом (о типах данных рассказывается в следующем разделе). Символ обратной косой черты используется для представления:

• кодов, не имеющих графического изображения (например, \а — звуковой сигнал, \п — перевод курсора в начало следующей строки);

• символов апострофа ('), обратной косой черты (\), знака вопроса (?) и кавычки (");

• любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от О до 255.

Последовательности символов, начинающиеся с обратной косой черты, называют управляющими, или escape-последовательностями.. Управляющая последовательность интерпретируется

как одиночный символ. Если непосредственно за обратной косой чертой следует символ, не предусмотренный табл. 1.3, результат интерпретации не определен.

Если в последовательности цифр встречается недопустимая, она считается концом цифрового кода.

Управляющие последовательности могут использоваться и в строковых константах, называемых иначе строковыми литералами. Например, если внутри строки требуется записать кавычку, ее предваряют косой чертой, по которой компилятор отличает ее от кавычки, ограничивающей строку: "Издательский дом \"Питер\""

Все строковые литералы рассматриваются компилятором как различные объекты. Строковые константы, отделенные в программе только пробельными символами, при компиляции объединяются в одну. Длинную строковую константу можно разместить на нескольких строках, используя в качестве знака переноса обратную косую черту, за которой следует перевод строки.

В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью \0. Поэтому длина строки всегда на единицу больше количества символов в ее записи. Таким образом, пустая строка "" имеет длину 1 байт. Обратите внимание на разницу между строкой из одного символа, например, "А", и и символьной константой 'А'. Пустая символьная константа недопустима.

 

Выражения и операторы.

 

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

Примеры выражений: (а + 0.12)/6, (t * sin(x)-L05e4)/((2 * к + 2) * (2 * к + 3))

Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо. Например, а = b = с означает а = (Ь = с), а а + b + с означает (а + Ь) + с.

Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем У+1.

Результат вычисления выражения характеризуется значением и типом. Например, если а и b — переменные целого типа и описаны так: int а = 2. b = 5:

 

то выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае 5) и тип, совпадающий с типом этой переменной. Таким образом, в C++ допустимы выражения вида а = b = с: сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.

В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями выполняются преобразования типов по определенным правилам, обеспечивающим преобразование более коротких типов в более длинные для сохранения значимости и точности.

Преобразования бывают двух типов:

• изменяющие внутреннее представление величин (с потерей точности или без потери точности); • изменяющие только интерпретацию внутреннего представления.

К первому типу относится, например, преобразование целого числа в вещественное (без потери точности) и наоборот (возможно, с потерей точности), ко второму — преобразование знакового целого в беззнаковое.

В любом случае величины типов char, signed char, unsigned char, short int и unsigned short int преобразуются в тип int, если он может представить все значения, или в unsigned int в противном случае. После этого операнды преобразуются к типу наиболее длинного из них, и он используется

как тип результата.

Итак, мы потратили достаточно много времени, рассматривая самый нижний уровень конструкций, составляющих язык программирования, и теперь пора начинать строить из них нечто более осмысленное — сначала отдельные операторы, а затем программы. Даже самая простая программа должна создаваться по определенным правилам, тогда она будет надежна, эффективна и красива. Изучением этих правил мы и займемся в следующем разделе.

Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор; (он используется, когда по синтаксису

оператор требуется, а по смыслу — нет). Примеры:

i++: // выполняется операция инкремента

а* = b + с; // выполняется умножение с присваиванием

Операторы ветвления

Условный оператор if Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 1.5. Формат оператора:

if (выражение) оператор_1; [else оператор_2;]

Сначала вычисляется выражение, которое может иметь арифметический тип или тип указателя. Если оно не равно нулю (имеет значение true), выполняется первый оператор, иначе — второй. После этого управление передается на оператор, следующий за условным.

Одна из ветвей может отсутствовать, логичнее опускать вторую ветвь вместе с ключевым словом еТ se. Если в какой-либо ветви требуется выполнить несколько операторов, их необходимо заключить в блок, иначе компилятор не сможет понять, где заканчивается ветвление. Блок может содержать любые операторы, в том числе описания и другие условные операторы (но не может состоять из одних описаний). Необходимо учитывать, что переменная, описанная в блоке, вне

блока не существует.

 

В примере 1 отсутствует ветвь else. Подобная конструкция называется «пропуск оператора», поскольку присваивание либо выполняется, либо пропускается в зависимости от выполнения условия.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Например, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие а<Ь и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом — ИЛИ.

Оператор в примере 3 вычисляет наименьшее значение из трех переменных. Фигурные скобки в данном случае не обязательны, так как компилятор относит

часть else к ближайшему if.

 

Тип переменных выбирается исходя из их назначения. Координаты выстрела нельзя представить целыми величинами, так как это приведет к потере точности результата, а счетчик очков не имеет смысла описывать как вещественный.

 

Если какая-либо переменная используется только внутри условного оператора, рекомендуется объявить ее внутри скобок, например:

i f (int i = fun(t)) a -= 1; else a += 1:

Объявление переменной в тот момент, когда она требуется, то есть когда ей необходимо присвоить значение, является признаком хорошего стиля и позволяет избежать случайного использования переменной до ее инициализации. Объявлять внутри оператора if можно только одну переменную. Область ее видимости начинается в точке объявления и включает обе ветви оператора.

 

Оператор switch

Оператор switch (переключатель) предназначен для разветвления процесса вычислений

па несколько направлений. Структурная схема оператора приведена на

рис. 1.7. Формат оператора:

switch (выражение){

case константное_выражение_1: [список_операторов_1]

case константное_выражение_2: [список_операторов_2]

case константное_выражение_п: [список_операторов_п]

[default: операторы ]

 

Выполнение оператора начинается с вычисления выражения (оно должно быть

целочисленным), а затем управление передается первому оператору из списка,

помеченгюго константным выражением, значение которого совпало с вычисленным.

После этого, если выход из переключателя явно не указан, последовательно

выполняются все остальные ветви.

Выход из переключателя обычно выполняется с помощью операторов break или

return. Оператор break выполняет выход из самого внутреннего из объемлющих

его операторов switch, for, while и do. Оператор return выполняет выход из функции,

в теле которой он записан.

Все константные выражения должны иметь разные значения, но быть одного и

того же целочисленного типа. Несколько меток могут следовать подряд. Если

совпадения не произошло, выполняются операторы, расположенные после слова

default (а при его отсутствии управление передается следующему за switch оператору).

 

 

Понятие переменной.

 

 

Переменная — это именованная область памяти, в которой хранятся данные определенного

типа. У переменной есть имя и значение. Имя служит для обращения

к области памяти, в которой хранится значение. Во время выполнения программы

значение переменной можно изменять. Перед использованием любая

переменная должна быть описана.

Пример описания целой переменной с именем а и вещественной переменной х:

1nt а; float х;

Общий вид оператора описания переменных:

[класс памяти] [const] тип имя [инициализатор];

Рассмотрим правила задания составных частей этого оператора.

• Необязательный класс памяти может принимать одно из значений auto, extern,

static и register. О них рассказывается чуть ниже.

• Модификатор const показывает, что значение переменной изменять нельзя.

Такую переменную называют именованной константой, или просто константой.

• При описании можно присвоить переменной начальное значение, это называется

инициализацией. Инициализатор можно записывать в двух формах — со

знаком равенства:

" значение

или в круглых скобках:

(значение)

Константа должна быть инициализирована при объявлении. В одном операторе

можно описать несколько переменных одного типа, разделяя их запятыми.

Примеры:

short int а = 1; // целая переменная а

const char С = ' С; // символьная константа С

char s. sf = 'f; // инициализация относится только к sf

char t (54);

float с = 0.22. x(3). sum;

Если тип инициализирующего значения не совпадает с типом переменной, выполняются

преобразования типа по определенным правилам (см. с. 38 и приложение

3).

Описание переменной, кроме типа и класса памяти, явно или по умолчанию задает

ее область действия. Класс памяти и область действия зависят не только от

собственно описания, но и от места его размещения в тексте программы.

Область действия идентификатора — это часть программы, в которой его можно

использовать для доступа к связанной с ним области памяти. В зависимости

от области действия переменная может быть локальной или глобальной.

Если переменная определена внутри блока (напомню, что блок ограничен фигурными

скобками), она называется локальной, область ее действия — от точки описания

до конца блока, включая все вложенные блоки. Если переменная определена

вне любого блока, она называется глобальной и областью ее действия считается

файл, в котором она определена, от точки описания до его конца.

Класс памяти определяет время жизни и область видимости программного объекта

(в частности, переменной). Если класс памяти не указан явным образом, он

определяется компилятором исходя из контекста объявления.

Время жизни может быть постоянным (в течение выполнения программы) и временным

(в течение выполнения блока).

Областью видимости идентификатора называется часть текста программы, из

которой допустим обычный доступ к связанной с идентификатором областью памяти.

Чаще всего область видимости совпадает с областью действия. Исключением

является ситуация, когда во вложенном блоке описана переменная с таким__

 

же именем. В этом случае внешняя переменная во вложенном блоке невидима,

хотя он и входит в ее область действия. Тем не менее к этой переменной, если она

глобальная, можно обратиться, используя операцию доступа к области видимости

::.

Для задания класса памяти используются следующие спецификаторы:

auto — автоматическая переменная. Память под нее выделяется в стеке и при необходимости

инициализируется каждый раз при выполнении оператора, содержащего

ее определение. Освобождение памяти происходит при выходе из блока,

в котором описана переменная. Время ее жизни — с момента описания до конца

блока. Для глобальных переменных этот спецификатор не используется, а для

локальных он принимается по умолчанию, поэтому задавать его явным образом

большого смысла не имеет.

extern — означает, что переменная определяется в другом месте программы

(в другом файле или дальше по тексту). Используется для создания переменных,

доступных во всех модулях программы, в которых они объявлены i. Подробнее об

употреблении внешних переменных рассказывается в разделе «Внешние объявления

», с. 98.

static — статическая переменная. Время жизни — постоянное. Инициализируется

один раз при первом выполнении оператора, содержащего определение переменной.

В зависимости от расположения оператора описания статические переменные

могут быть глобальными и локальными. Глобальные статические

переменные видны только в том модуле, в котором они описаны.

register — аналогично auto, но память выделяется по возможности в регистрах

процессора. Если такой возможности у компилятора нет, переменные обрабатываются

как auto.

int а: //1 глобальная переменная а

int main(){



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 503; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.192.3 (0.069 с.)