пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

Базовые понятия языка С. Алфавит, идентификаторы, служебные слова, константы.

зеленая методичка страница 53

Компилятор, выполняя лексический анализ текста программы, выделяет лексемы.
Лексемой называют единицу текста программы, которая при компиляции воспринимается как единое целое и по смыслу не может быть разделена на более мелкие единицы. Для распознавания начала и (или) конца лексем компилятор использует пробельные разделители. К ним относятся: символы пробелов, символы табуляции, символы перехода на новую строку и комментарии. Известны два способа задания комментариев.

Традиционный способ определяет комментарии как последовательность символов, ограниченных слева знаками /*, а справа знаками */. Между этими граничными парами можно помещать любой текст. Этот способ допустим в Си и Си++:

/* Это комментарий, допустимый в Си и Си++*/

ANSI-стандартом запрещено вкладывать комментарии друг в друга, например, запись

/* текст-1/*текст-2*/ текст-3*/

ошибочна – “текст-3”не считается комментарием.

Второй способ, введенный в Си++, определяет комментарии как последовательность символов, началом которой служат символы //, а концом – код перехода на новую строку:

// Это однострочный комментарий, специфический для С++

В алфавит языка Си и Си++ входят:

 

  • Прописные и строчные буквы латинского алфавита;
  • Цифры 0,1,2,3,4,5,6,7,8,9;
  • Специальные знаки :
                 “ { } , | [] ( ) + - / %\ ; ‘ : ? < = > _ ! & # ~ ^ . *

Из  символов алфавита формируются лексемы языка:

  • Идентификаторы;
  • Ключевые (служебные, иначе зарезервированные) слова;
  • Константы;
  • Знаки операций;
  • Разделители (знаки пунктуации).

 

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

Из перечисленного списка:

abc, Abc, _ss, ww1, rt_2, 3er

последний не является идентификатором (начинается с цифры), а два первых идентификатора различны, так как а и А – разные буквы.

Одним из основных понятий языка Си является объект – именованная область памяти. Частный случай объекта – переменная. Отличительная  особенность переменной состоит в возможности связывать с ее именем (идентификатором) различные значения, совокупность которых определяется типом переменной. При задании значения переменной в соответствующую ей область памяти помещается код этого значения. Доступ к значению переменной обеспечивает ее имя (идентификатор). Таким образом, переменные представляются в программе идентификаторами, а понятие переменной можно интерпретировать парой «идентификатор-значение». Все переменные в программе на Си обязательно описываются (объявляются) в программе специальными операторами. Описания переменных в программе обязательно должно появиться до первого ее использования. Пример описания переменных:

int i,k;
  
float x,y;
  
char a,b;
      
char z[10];

Эти описания сообщают, что в программе будет использоваться 7 переменных: i,k –переменные целого типа (для хранения каждой  выделяется 2 байта); x,y – вещественные переменные (для хранения каждой выделяется 4 байта); a,b – символы (для хранения каждой выделяется по одному байту); z – строковая переменная (для ее хранения выделяется 10 байтов, причем программист должен помнить, что один байт нужно резервировать для признака окончания строки – нуль-символ ‘\0’ ).

Ключевые (служебные слова) – это идентификаторы, зарезервированные в языке для специального использования. Например, уже знакомое нам слово int используется для объявления переменных целого типа. Поскольку не все служебные слова сразу же нужны программисту, мы не будем здесь их приводить, а будем их вводить по мере необходимости. Отметим только, что программисту запрещено использовать служебные слова в качестве произвольно выбираемых имен в программе. Кроме того, идентификаторы, включающие два подряд символа подчеркивания “__”, резервируются для реализации С++ и стандартных библиотек. Идентификаторы, начинающиеся с символа подчеркивания “_”, используются в реализации языка Си. В связи с этим, программисту не рекомендуется использовать два символа подряд в идентификаторе или один символ подчеркивания в его начале.

Константа – это лексема, представляющая изображение фиксированного числового, символьного или строкового значения. Константы делятся на пять групп: целые, вещественные ( с плавающей точкой), перечислимые, символьные, (литерные) и строковые. Перечислимые константы (константы перечислимого типа) проект стандарта языка Си++ относит к одному из целочисленных типов. В настоящей юните этот тип констант не будем рассматривать, т. к. в ближайшее время он нам не понадобится.

Десятичная целая константа определяется как последовательность десятичных цифр, начинающаяся не с нуля, если это число не нуль: 12, 455, 0, 5. Возможные предельные значения целых чисел рассмотрены нами ранее.

Восьмеричные целые константы начинаются всегда с нуля: 014 (1210), 07(710), 034 (2810). Если в записи восьмеричной константы встречаются недопустимые цифры 9 или 8 , то это воспринимается как ошибка.

Последовательность шестнадцатеричных цифр, которой предшествуют символы считается шестнадцатеричной константой : 0х1А имеет десятичное значение 26, а 0хЕ – десятичное значение 14. Отрицательные константы – это константы без знака, к которым применена операция изменения знака.

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

 

Целые константы и выбираемые для них типы                                  

Диапазоны значений констант

Тип

данных

десятичные

восьмеричные

шестнадцатеричные

От 0 до 32767

От 00 до 077777

От 0 до 0х7FFF

int

-

От 0100000 до

0177777

От 0х8000 до 0хFFFF

unsigned

int

от 32768

до 2147483647

От 0200000

До 017777777777

От 0х10000

До 0х7FFFFFFF

long

От 2147483648

До 4294967295

От 020000000000

До 037777777777

От 0х80000000

До 0хFFFFFFFF

unsigned

long

>4294967295

>037777777777

>0хFFFFFFFF

Ошибка

 

Если программиста по каким-либо причинам не устраивает тип данных, приписываемых компилятором константе, то он может явным образом повлиять на его выбор. Это делается с помощью суффиксов L, l (long) и U, u (unsigned). Пример: константа 35L, будет иметь тип long, хотя по значению 64 ей должен быть приписан тип int (см. табл.9). Суффиксы U(u) и L(l) могут использоваться для одной константы одновременно и в произвольном порядке. Пример: константы 0х34ul, 0x24Lu будут иметь тип unsigned long.

Вещественные константы имеют внутреннюю форму представления с плавающей точкой

( нормализованную двоичную). Такие константы компилятор распознает по внешним признакам. Вещественные константы могут включать следующие элементы: целая часть

( десятичная целая константа); десятичная точка; дробная часть ( десятичная целая константа); признак экспоненты e или E; показатель десятичной степени (десятичная целая константа, возможно со знаком);суффикс F(или l) либо L (или l).

В записях вещественных констант могут опускаться: целая или дробная часть (но не одновременно); десятичная точка или признак экспоненты с показателем степени (но не одновременно); суффикс. Примеры:

56.    .3     .0    .034    3.1415F    1.76e-2     5E+6L       78.95

При отсутствии суффиксов F(f) или L(l) вещественные константы имеют форму внутреннего представления double. Добавив суффикс F или f , константе придают тип float. Константа имеет тип long double, если в ее представлении используется суффикс L или l

Перечислимые константы (константы перечислимого типа) – вводятся с помощью служебного слова enum. Это обычные целочисленные константы (типа int), которым приписаны уникальные и удобные для использования обозначения. В качестве обозначений используются произвольные идентификаторы, не совпадающие со служебными словами и именами других объектов программы. Обозначения присваиваются константам с помощью определения вида:

enum {one = 0, two = 1, three = 2};

здесь enum - служебное слово, определяющая тип данных “перечиcляемый”, one,two, three – имена, введеные программистом для обозначения констант 1,2,3. После такого определения в программе вместо этих констант (и наряду с ними) можно использовать их обозначения.

Символьные (литерные) константы – это один или два символа, заключенные в апострофы ( ‘ ’). Односимвольные константы имеют стандартный тип char и занимают в памяти один байт. Двухсимвольные константы представляются двухбайтовыми значениями типа int. Примеры:

односимвольные константы -                     ‘t’, ‘*’, ‘\014’, ‘\0’, ‘\n’;

двухсимвольные константы -                         db’, ‘\x07\x07’, ‘\n\t’.

 

Обратите внимание в этих примерах на последовательности знаков, начинающихся со знака ‘\n’. Символ обратной косой черты ‘\’ используется для:

  • Записи кодов, не имеющих графического изображения,
  • Для записи символов апостроф ( ), обратная косая черта ( \ ),  знак вопроса ( ? ) и кавычки ( ),
  • Для задания символьных констант их кодами в восьмеричном и шестнадцатеричном виде.

Последовательность литер, начинающаяся со знака ‘\’ называют эскейп-последовательностями. В табл. 10 приведены их допустимые значения.

 

Допустимые ESC-последовательности в языках  Си Си++                              

Изображение

Внутренний код

Обозначаемый символ (название)

Смысл или вызываемое действие

\a

0x07

bel (audible bell)

Звуковой сигнал

\b

0x08

bs (backspace)

Возврат на шаг(забой)

\f

0x0C

ff (formfeed)

Перевод страницы

\n

0x0A

lf (line feed)

Перевод строки (новая строка)

\r

0x0D

cr (carriage return)

Возврат каретки (сдвиг назад на одну позицию)

\t

0x09

ht (horizontal tab)

Табуляция горизонтальная (сдвигает курсор или печатающую головку на некоторое фиксированное число горизонтальных позиций 5 или 8)

\v

0x0B

vt (vertical tab)

Табуляция вертикальная

\\

0x5C

\ (backslash)

Обратная косая черта

\’

0x27

(single quote)

Апостроф (одинарная кавычка)

\”

0x22

(double quote)

Двойная кавычка

\?

0x3F

? (question mark)

Вопросительный знак

\000

000

0 – любая восьмеричная цифра

Восьмеричный код символа

\xhh

xhh

h –любая шестнадцатеричная цифра

Шестнадцатеричный код символа

Если непосредственно за символом ‘\’ поместить символ, не предусмотренный табл. 10, то результат будет неопределенным. Для использования внутренних кодов символов при работе, например, с экраном дисплея нужна таблица, в которой каждому изображаемому на экране символу соответствует число (код) в десятичном, восьмеричном или шестнадцатеричном представлении. На IBM - совместимых компьютерах применяется таблица кодов ASCII ( см. файл материалов, приложение 1).

Значением символьной константы является числовое значение ее кода. При использовании кодов ASCII нужно помнить о различии между числами и символами, обозначающими числа. Например, символу ‘5’ или '\65' соответствует код ASCII, равный 53, который и является ее значением. На будущее запомним полезный совет: из двух форм записи эскейп-последовательности (скажем ‘\n’ или ‘\0x0A’ ) лучше использовать первую. Во-первых,  это более  наглядно. Во-вторых,  согласуется с требованием переносимости программ, поскольку даже в том случае, если в системе не используется код ASCII, обозначение ‘\n’ продолжать «работать».

Строки, или строковые константы определяются как последовательность символов, заключенных в кавычки:

“это строка, называемая также строковой константой”.

Среди символов строки могут быть эскейп-последовательности, т. е. сочетания, соответствующие неизображаемым символьным константам или символам, задаваемым значениями их внутренних кодов. В этом случае, как и в представлениях отдельных символов, они начинаются с обратной косой черты ‘\’:

# include <stdio.h>

# include <conio.h>

void main ( )

{

printf (“ Это строка, \nиначе – \“стринг\”, \nиначе -\”строковая константа\”.”

getch();

}

При выполнении этой программы на экране дисплея получим текст в следующем виде:

Это строка,

иначе – “стринг”,

иначе – “строковая константа”.

Обратите внимание на наличие символа ‘\’ перед двойной кавычкой внутри строки. Именно по наличию этого символа компилятор отличает внутреннюю кавычку от кавычки, ограничивающей строку.

Размещая строку в памяти транслятор, транслятор автоматически добавляет в ее конец символ ‘\0’, т.е. нулевой байт. Этот символ в Си и Си++ служит признаком окончания строки. Таким образом, количество символов во внутреннем представлении строки на 1 больше числа символов в ее записи.
Разделители, или знаки пунктуации, в Си и Си++ представляются следующим набором знаков:

[ ]   ( )  { }  ,   ;   :   …   *   =    #

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

  • Фигурные скобки ‘{ }’использовались для выделения блока тела функции (в нашем случае для выделения тела функции main);
  • Точка с запятой ‘;’ использовалась для завершения описаний и операторов. Любое допустимое выражение, за которым следует ‘;’ воспринимается как оператор. Это справедливо и для пустого выражения, т. е. отдельный символ “точка с запятой” считается пустым оператором;
  • Символ ‘#’(знак номера диеза в музыке) использовались для обозначения директив (команд) препроцессора. Если этот символ является первым отличным от пробела символом в строке программы, то строка воспринимается как директива препроцессора.
  • Знак ‘=’ использовался в операторе присваивания 

21.06.2017; 15:10
хиты: 73
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь