4.Состав языка С и 5. Знаки операции


4.Состав языка С++.
• Алфавит языка, или его символы — это основные неделимые знаки, с помощью
которых пишутся все тексты на языке.
• Лексема, или элементарная конструкция, — минимальная единица языка, имеющая
самостоятельный смысл.
• Выражение задает правило вычисления некоторого значения.
• Оператор задает законченное описание некоторого действия.
Алфавит C++ включает:
• прописные и строчные латинские буквы и знак подчеркивания;
• арабские цифры от 0 до 9;
• специальные знаки:
" { } , | : [ ] ( ) + - . / % * . \
‘ : ?< = >!& # ~ ; ^
• пробельные символы: пробел, символы табуляции, символы перехода на новую строку.
Из символов алфавита формируются лексемы языка:
• идентификаторы;
• ключевые (зарезервированные) слова;
• знаки операций;
• константы;
• разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими, как разделители или знаки
операций.
Ключевые слова
Ключевые слова – это зарезервированные идентификаторы, которые имеют специальное значение
для компилятора. Их можно использовать только в том смысле, в котором они определены.
Список ключевых слов C++ приведен в таблице
asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar t
double mutable switch while
dynamic_cast namespace template
Знаки операций
Знак операции – это один или более символов, определяющих действие над операндами.
Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и
тернарную по количеству участвующих в них операндов. Один и тот же знак может
интерпретироваться по-разному в зависимости от контекста. Все знаки операций заисключением [ ], ( ) и ? : представляют собой отдельные лексемы.
Лексема - единица текста программы, которая прикомпиляции воспринимается как единое целое и посмыслу не может быть разделена на более мелкиеэлементы.Примеры: asm1, case25, structure.
Унарные операции
++ увеличение на 1
-- уменьшение на 1
sizeof размер
~ поразрядное отрицание
! логическое отрицание
- арифметическое отрицание (унарный минус)
+ унарный плюс
& взятие адреса
* разадресацияnew выделение памяти
delete освобождение памяти
(type) преобразование типа
Идентификаторы
Идентификатор — это имя программного объекта. В идентификаторе могут
использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы
различаются, например, sysop, SySoP и SYSOP – три различных имени. Первым символом
идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен
не допускаются.
Для улучшения читаемости программы следует давать объектам осмысленные имена.
Существует соглашение о правилах создания имен, называемое венгерской нотацией (посколькупредложил ее сотрудник компании Microsoft венгр по национальности), по которому каждое
слово, составляющее идентификатор, начинается с прописной буквы, а вначале ставится
префикс, соответствующий типу величины, например, iMaxLength, TpfnSetFirstDialog. Другая
традиция – разделять слова, составляющие имя, знаками подчеркивания: max_ length,
number_of_galosh.
Длина идентификатора по стандарту не ограничена, но некоторые компиляторы и
компоновщики налагают на нее ограничения. Идентификатор создается на этапе объявления
переменной, функции, типа и т. п., после этого его можно использовать в последующихоператорах программы. При выборе идентификатора необходимо иметь в виду следующее:
• идентификатор не должен совпадать с ключевыми словами (см. следующий раздел) и
именами используемых стандартных объектов языка;
• не рекомендуется начинать идентификаторы с символа подчеркивания, поскольку они
могут совпасть с именами системных функций или переменных, и, кроме того, это
снижает мобильность программы;
• на идентификаторы, используемые для определения внешних переменных, налагаются
ограничения компоновщика (использование различных компоновщиков или версийкомпоновщика накладывает разные требования на имена внешних переменных).
Операция определения размера sizeof предназначена для вычисления размера объекта
или типа в байтах, и имеет две формы:
sizeof выражение
sizeof ( тип )
Константы
Константами называются неизменяемые величины. Различают целые, вещественные,
символьные и строковые константы.
Константы Формат Примеры
Целая Десятичный
Восьмеричный
Шестнадцатеричный
8, 0, 125,
01, 020
0хА
Вещественные Десятичный
[цифры].[цифры]
экспоненциальный 02Е6
Символьная 1 или 2 символа, заключенных в
апострофы
‘A’,’*’
Строковая
(литералы)
Последовательность символов,
заключенных в кавычки
‘hello’
Символьные константы, состоящие из одного символа, занимают в памяти 1 байт, и
имеют тип char. Двухсимвольные константы, имеют тип int, занимают 2 байта.
Последовательность символов, начинающаяся с обратной косой черты, называются
управляющимися или escape-последовательностями. Управляющие последовательность
интерпретируются как одиночный символ.
\a Звуковой сигнал
\b Возврат на шаг
\f Перевод страницы (формата)
\n Перевод строки
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\\ Обратная косая черта
\` апостроф
\\`` кавычки
\? Вопросительный знак
\0ddd Восьмеричный код символа
\0xddd Шестнадцатеричный код символа
Управляющие последовательности можно использовать в строковых константах. В конец
каждой строковой константы компилятором добавляется нулевой символ, предоставляемый
управляемой последовательностью \0, поэтому длина строки всегда на единицу больше
количества символов в ее записи.
5. Знаки операций
Знаки операций
Знак операции – это один или более символов, определяющих действие над операндами.
Внутри знака операции пробелы не допускаются. Операции делятся на унарные, бинарные и
тернарную по количеству участвующих в них операндов. Один и тот же знак может
интерпретироваться по-разному в зависимости от контекста. Все знаки операций заисключением [ ], ( ) и ? : представляют собой отдельные лексемы.
Операции
В таблице приведен список основных операций, определенных в языке C++, всоответствии с их приоритетами (по убыванию приоритетов, операции с разными приоритетамиразделены чертой).
В соответствии с количеством операндов, которые используются в операциях, они
делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда). Все
приведенные в таблице операции, кроме условной и sizeof, могут быть перегружены.
Операция Краткое описание
Бинарные и тернарная операции
* умножение
/ деление
% остаток от деления
+ сложение
- вычитание
« сдвигвлево» сдвигвправо< меньше
<= меньшеили равно
> больше
>= большеилиравно= = равно
!= неравно
& поразрядная конъюнкция (И)
^ поразрядное исключающее ИЛИ
| поразрядная дизъюнкция (ИЛИ)
&& логическое И|| | логическое ИЛИ.
Операция Краткое описание
? : условная операция (тернарная)
= присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток отделения с присваиванием
+= сложение с присваиванием
- = вычитание с присваиванием
«= сдвиг влево с присваиванием
»= сдвиг вправо с присваиванием
&= поразрядное И с присваиванием
|= поразрядное ИЛИ с присваиванием
^= поразрядное исключающее ИЛИ с присваиванием
, последовательное вычисление
Операции увеличения и уменьшения на 1 (++ и - -). Эти операции, называемые также
инкрементом и декрементом, имеют две формы записи – префиксную, когда операция
записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется
операнд, а затем его значение становится результирующим значением выражения, а впостфиксной форме значением выражения является исходное значение операнда, после чего он
изменяется.
#include <stdio.h>
int main(){
int x = 3, у = 3;
printf("Значение префиксного выражения: %d\n", ++х);
printf("Значение постфиксного выражения: %d\n", у++):
printf("Значение х после приращения: %d\n", x):
printf("Значение у после приращения: %d\n", у) ;
return 0:
}
Результат работы программы:
Значение префиксного выражения: 4
Значение постфиксного выражения: 3
Значение х после приращения: 4
Значение у после приращения: 4
Операндом операции инкремента в общем случае является так называемое L-значение (Lvalue). Так обозначается любое выражение, адресующее некоторый участок памяти, в который
можно занести значение. Название произошло от операции присваивания, поскольку именно ее
левая (Left) часть определяет, в какую область памяти будет занесен результат операции.
Переменная является частным случаем L-значения. Базовые средства языка С++
6
Операции отрицания (-, ! и ~). Арифметическое отрицание (унарный минус -) изменяет
знак операнда целого или вещественного типа на противоположный. Логическое отрицание (!)
дает в результате значение 0, если операнд есть истина (не нуль), и значение 1, если операнд
равен нулю. Операнд должен быть целого или вещественного типа, а может иметь также тип
указатель. Поразрядное отрицание (-), часто называемое побитовым, инвертирует каждый разряд
в двоичном представлении целочисленного операнда.
Деление (/) и остаток от деления (%). Операция деления применима к операндам
арифметического типа. Если оба операнда целочисленные, результат операции округляется доцелого числа, в противном случае тип результата определяется правилами преобразования.
Операция остатка от деления применяется только к целочисленным операндам. Знак результата
зависит от реализации.
#include <stdio.h>
int main(){ int x = 11, у = 4:
float z = 4:
printf("Результаты деления: %d %f\n", x/y, x/z);
printf("Остаток: *d\n".
return 0;
}
Результат работы программы:
Результаты деления: 2 2.750000
Остаток: 3
Операции сдвига (<< и >>) применяются к целочисленным операндам. Они
сдвигают двоичное представление первого операнда влево или вправо на количество двоичныхразрядов, заданное вторым операндом. При сдвиге влево (<<) освободившиеся разряды
обнуляются. При сдвиге вправо (>>) освободившиеся биты заполняются нулями, если первый
операнд беззнакового типа, и знаковым разрядом в противном случае. Операции сдвига не
учитывают переполнение и потерю значимости.
Операции отношения (<, <=, >, >=, = =, ! =) сравнивают первый операнд со вторым.
Операнды могут быть арифметического типа или указателями. Результатом операции является
значение true или false (любое значение, не равное нулю, интерпретируется как true). Операции
сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции
сравнения.
Поразрядные операции (&, |, ^) применяются только к целочисленным операндам и
работают с их двоичными представлениями. При выполнении операций операнды
сопоставляются побитово (первый бит первого операнда с первым битом второго, второй битпервого операнда со вторым битом второго, и т д.).
При поразрядной конъюнкции, или поразрядном И (операция обозначается &) бит
результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.
При поразрядной дизъюнкции, или поразрядном ИЛИ (операция обозначается |) бит
результата равен 1 тогда, когда соответствующий бит хотя бы одного из операндов равен 1.
При поразрядном исключающем ИЛИ (операция обозначается ^) бит результата равен 1
только тогда, когда соответствующий бит только одного из операндов равен 1. Базовые средства языка С++
7
#include <iostream.h>
int main(){
cout « "\n 6 & 5, = " « (6 & 5);
cout « "\n 6 | 5 = " « (6 | 5);
cout « "\n 6 " 5 = " « (6 ^ 5);
return 0; }
Результат работы программы:
6 & 5 = 4
6 | 5 = 7
6^5 = 3
Логические операции (&& и ||). Операнды логических операций И (&&) и ИЛИ
(||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой
операции могут быть различных типов. Преобразования типов не производятся, каждый
операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю – как true).
Результатом логической операции является true или false. Результат операции
логическое И имеет значение true только если оба операнда имеют значение true.
Результат операции логическое ИЛИ имеет значение true, если хотя бы один изоперандов имеет значение true. Логические операции выполняются слева направо. Если
значения первого операнда достаточно, чтобы определить результат операции, второй
операнд не вычисляется.
Операции присваивания (=, +=, -=, *= и т. д.). Операции присваивания могут
использоваться в программе как законченные операторы. Формат операции простогоприсваивания (=): операнд_1 = операнд_2
Первый операнд должен быть L-значением, второй – выражением. Сначала
вычисляется выражение, стоящее в правой части операции, а потом его результат
записывается в область памяти, указанную в левой части (мнемоническое правило: «присваивание – это передача данных "налево"»). То, что ранее хранилось в этой
области памяти, естественно, теряется.
При присваивании производится преобразование типа выражения к типу L-значения,
что может привести к потере информации.
В сложных операциях присваивания ( +=, *=, /= и т.п.) при вычислении
выражения, стоящего в правой части, используется и L-значение из левой части.
Например, при сложении с присваиванием ко второму операнду прибавляется первый, и
результат записывается в первый операнд, то есть выражение а += b является более
компактной записью выражения а = а + b.
Условная операция (?:). Эта операция тернарная, то есть имеет три операнда. Ее
формат:
операнд_1 ? операнд_2 : операнд_3
Первый операнд может иметь арифметический тип или быть указателем. Он
оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления
операнда 1 равен true, то результатом условной операции будет значение второго
операнда, иначе – третьего операнда. Вычисляется всегда либо второй операнд, либо
третий. Их тип может различаться. Условная операция является сокращенной формой
условного оператора if.
#include <stdio.h>
int main(){ Базовые средства языка С++
8
int a = 11, b = 4, max;
max = (b > a ) ? b : a;
рrint (“Наибольшее число: %d”, max);
return 0; }
Результат работы программы: Наибольшее число: 11
Другой пример применения условной операции. Требуется, чтобы некоторая целая
величина увеличивалась на 1, если ее значение не превышает n, а иначе принимала
значение 1:
i = (i < n) ? i + 1: 1;
Выражения
Выражения состоят из операндов, операций и скобок и используются длявычисления некоторого значения определенного типа. Каждый операнд является, в своюочередь, выражением или одним из его частных случаев – константой или переменной.
Операции выполняются в соответствии с приоритетами. Для изменения порядка
выполнения операций используются круглые скобки. Если в одном выражении записано
несколько операций одинакового приоритета, унарные операции, условная операция и
операции присваивания выполняются справа налево, остальные – слева направо. Например,
а = b = с означает а= (b = c ) , a a + b + c означает (а + b) + с. Порядок вычисления
подвыражений внутри выражений не определен: например, нельзя считать, что в
выражении ( s in ( x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к
косинусу, и что х + 2 будет вычислено раньше, чем y + 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 впротивном случае.
После этого операнды преобразуются к типу наиболее длинного из них, и он используется
как тип результата.

Приложенные файлы

  • docx 23933349
    Размер файла: 32 kB Загрузок: 0

Добавить комментарий