Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы!по теории.docx
Скачиваний:
1
Добавлен:
23.12.2018
Размер:
48.3 Кб
Скачать
  1. Элементы языка С++

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

  • латинские буквы: от а до z (строчные) и от А до Z (прописные);

  • десятичные цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

  • специальные символы: " { } , | [ ] ()+-/% \ ;': ?< = >_ ! & # * ~ ^ .

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

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

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

Идентификаторы. Последовательность латинских букв, цифр, символов подчеркивания (_), начинающаяся с буквы или символа подчеркивания, является идентификатором. Например:

В12 rus hard_RAM_disk MAX ris__32

В отличие от Паскаля в Си/Си++ различаются прописные и строчные буквы. Это значит, что, например, flag, flag, Flag, FlAg — разные идентификаторы.

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

asm

else

operator

template

auto

enum

private

this

break

extern

protected

throw

2. Типы данных

В Си/Си++ имеется четыре базовых арифметических (числовых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double.

Кроме того, в программах можно использовать некоторые модификации этих типов, описываемых с помощью служебных слов — модификаторов. Существуют два модификатора размера — short (короткий) и long (длинный) — и два модификатора знаков — signed (знаковый) и unsigned (беззнаковый). Знаковые модификаторы применяются только к целым типам.

Анализируя данные таблицы, можно сделать следующие выводы:

  • если не указан базовый тип, то по умолчанию подразумевается int;

  • если не указан модификатор знаков, то по умолчанию подразумевается signed;

  • с базовым типом float модификаторы не употребляются;

  • модификатор short применим только к базовому типу int.

3. Описание переменных в программах на Си/Си++ имеет вид:

имя_типа список_переменных;

Примеры описаний:

char symbol,ее;

unsigned char code;

int number,row;

unsigned long long_number;

float x,X,cc3;

double e,b4;

long double max_num;

Одновременно с описанием можно задать начальные значения переменных. Такое действие называется инициализацией переменных. Описание с инициализацией производится по следующей схеме:

тип имя_переменной = начальное_значение

Например:

float pi=3.14159,с=1.23; unsigned int year=2000;

Константы. Запись целых констант. Целые десятичные числа, начинающиеся не с нуля, например: 4, 356, —128.

Целые восьмеричные числа, запись которых начинается с нуля, например: 016, 077.

Целые шестнадцатеричные числа, запись которых начинается с символов Ох, например: OxlA, 0x253, OxFFFF.

Тип константы компилятор определяет по следующим правилам: если значение константы лежит в диапазоне типа int то она получает тип int; в противном случае проверяется, лежит ли константа в диапазоне типа unsigned int, в случае положительного ответа она получает этот тип; если не подходит и он, то пробуется тип long и, наконец, unsigned long: Если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.

Диапазон шестнадцатеричных констант

Диапазон восьмеричных констант

Тип

0x0-0x7FFF

0-077777

Int

0X8000-0XFFFF

0100000-0177777

Unsigned int

0X10000-0X7FFFFFFF

0200000-017777777777

Long

0X80000000-0XFFFFFFFF

020000000000-037777777777

Unsigned long

Запись вещественных констант. Если в записи числовой константы присутствует десятичная точка (2.5) или экспоненциальное расширение (1Е-8), то компилятор рассматривает ее как вещественное число и ставит ей в соответствие тип double. Примеры вещественных констант: 44. 3.14159 44Е0 1.5Е-4.

использование суффиксов. Программист может явно задать тип константы, используя для этого суффиксы. Существуют три вида суффиксов: F (f) - float; U(u) —unsigned; L(l) — long (для целых и вещественных констант). Кроме того, допускается совместное использование суффиксов l и L в вариантах UL или LU

Примеры:

3.14159F — константа типа float, под которую выделяется 4 байта памяти;

3.14L — константа типа long double, занимает 10 байт;

50000U — константа типа unsigned int, занимает 2 байта памяти (вместо четырех без суффикса);

0LU — константа типа unsigned long, занимает 4 байта;

24242424UL — константа типа unsigned long, занимает 4 байта.

4. Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления:' \ddd'. Здесь ddd - восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:' \xhh' (или ' \Xhh'), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами

'А', ' \101 ', '\х41' .

Запись символьных и строковых констант. Символьные константы заключаются в апострофы. Например:'А','а','5',' + '. Строковые константы, представляющие собой символьные последовательности, заключаются в двойные кавычки. Например: "result", "введите исходные данные".

5. Операции и выражения

+ сложение, - вычитание, * умножение, / деление (аналог div), % деление по модулю (аналог mod), ++ -увеличение на единицу(инкремент), -- уменьшение на единицу(декремент), == равно, != не равно, ! не , && логическое умножение(И конъюнкция), & поразрядная конъюнкция, || логическое сложение (ИЛИ дизъюнкция), | поразрядная дизъюнкция, ~ поразрядное отрицание НЕ, ^ поразрядное исключающее ИЛИ

Рассмотрим особенности выполнения операции деления. А делимое и делитель целые числа, то и результат целое чисо в этом случае операция / действует аналогично Div в Паскале, например, значение выражения 5/3 будет равно 2, а при вычислении 1/5 получится 0.

Если хотя бы один из операндов имеет вещественный тип, то и результат будет вещественным. Например, операции 5./3, 5./3., 5/3. дадут вещественный результат 1.6666.

Операции инкремента и декремента могут применяться только к переменным и не могут — к константам и выражениям. Оба знака операции мол, записываться как перед операндом (префиксная форма), таи после операнда (постфиксная форма), например: ++Х или Х++. Три следующих оператора дают один и тот же результат:

х=х+1; х++; ++х.

Различие проявляется при использовании префиксной и постфиксной форм в выражениях. Проиллюстрируем это на примерах. Первый пример:

а=3; b=2;

с=а++*b++;

В результате выполнения переменные получат следующие значения: а =4, b=3, с= 6. Второй пример:

а=3; b=2;

с=++а*++b;

Результаты будут такими: а = 4, b = 3, с = 12.

Операции отношения.>, <, >=, <= Как уже говорилось раньше, в стандарте Си нет логического типа данных. Поэтому результатом операции отношения является целое число: если отношение истинно — то 1, если ложно — то 0. Примеры отношений:

а<0, 101>=105, 'а'=='А, 'а'! = 'А'

Результатом второго и третьего отношений будет 0 — ложь; результат четвертого отношения равен 1 — истина; результат первого отношения зависит от значения переменной а.

Логические операции. Логическое выражение, соответствующее системе неравенств 0 < х < 1 в программе на Си запишется в виде следующего логического выражения:

х>0 && х<1

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

а=b=с=х+у;

В языке Си имеются дополнительные операции присваивания, совмещающие присваивание с выполнением других операций. Среди них: +=, -=, /=, *=, %=. Приоритет у них такой же, как и у простого присваивания. Примеры использования этих операций: I

а+=2 эквивалентно а=а+2,

х-=а+b эквивалентно х=х-(а+Ь),

р /=10 эквивалентно р=р /10,

m*=n эквивалентно m=m*n,

г%=5 эквивалентно г=г%5.

Заметим, что вместо выражения а=а+2 предпочтительнее писать в программе а+=2, поскольку второе выражение будет вычисляться быстрее.

6. Операция явного преобразования типа (операция «тип»). Применение этой операции имеет следующий формат:

(имя_типа) операнд

Операндом могут быть константа, переменная, выражение в результате значение операнда преобразуется к указанному типу Примеры использования преобразования типа:

(long)8, (float)1, (int)x%2

Например:

float с;

int a=l, b=2;

с=(float)a/b;

В результате переменная с получит значение 0,5. Без преобразования типа ее значение стало бы равно 0.

Операция sizeof. Эта операция имеет две формы записи:

sizeof(выражение) sizeof(тип)

Результатом операции является целое число, равное количеству байтов, которое занимает в памяти величина явно указанного типа или величина, полученная в результате вычисления выражения. Последняя определяется также по типу результата выражения.

Пример:

sizeof(int) результат — 2

sizeof(1) результат — 2

sizeof (0.1) результат — 8

sizeof(1L) результат — 4

sizeof(char) результат — 1

sizeof('a') результат — 2

7. Операция арифметического отрицания (-) вырабатывает отрицание своего операнда. Операнд должен быть целой или плавающей величиной. При выполнении осуществляются обычные арифметические преобразования.

Пример:

double u = 5;

u = -u; /* переменной u присваивается ее отрицание,

т.е. u принимает значение -5 */

Операция логического отрицания "НЕ" (!) вырабатывает значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю (0). Результат имеет тип int. Операнд должен быть целого или плавающего типа или типа указатель.

Пример:

int t, z=0;

t=!z;

Переменная t получит значение равное 1, так как переменная z имела значение равное 0 (ложно).

Операция двоичного дополнения (~) вырабатывает двоичное дополнение своего операнда. Операнд должен быть целого типа. Осуществляется обычное арифметическое преобразование, результат имеет тип операнда после преобразования.

Пример:

char b = '9';

unsigned char f;

b = ~f;

Шестнадцатеричное значение символа '9' равно 39. В результате операции ~f будет получено шестнадцатеричное значение С6, что соответствует символу 'ц'.

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

8. . Операции разадресации и адреса

Эти операции используются для работы с переменными типа указатель.

Операция разадресации (*) осуществляет косвенный доступ к адресуемой величине через указатель. Операнд должен быть указателем. Результатом операции является величина, на которую указывает операнд. Типом результата является тип величины, адресуемой указателем. Результат не определен, если указатель содержит недопустимый адрес.

Рассмотрим типичные ситуации, когда указатель содержит недопустимый адрес:

- указатель является нулевым;

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

- указатель определяет адрес, который не выровнен до типа объекта, на который он указывает;

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

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

Операция адрес не может применятся к элементам структуры, являющимися полями битов, и к объектам с классом памяти register.

Примеры:

int t, f=0, * adress;

adress = &t /* переменной adress, объявляемой как

указатель, присваивается адрес переменной t */

* adress =f; /* переменной находящейся по адресу, содержащемуся

в переменной adress, присваивается значение

переменной f, т.е. 0 , что эквивалентно

t=f; т.е. t=0; */

9. Мультипликативные операции

К этому классу операций относятся операции умножения (*), деления (/) и получение остатка от деления (%). Операндами операции (%) должны быть целые числа. Отметим, что типы операндов операций умножения и деления могут отличаться, и для них справедливы правила преобразования типов. Типом результата является тип операндов после преобразования.

Операция умножения (*) выполняет умножение операндов.

int i=5;

float f=0.2;

double g,z;

g=f*i;

Тип произведения i и f преобразуется к типу double, затем результат присваивается переменной g.

Операция деления (/) выполняет деление первого операнда на второй. Если две целые величины не делятся нацело, то результат округляется в сторону нуля.

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

int i=49, j=10, n, m;

n = i/j; /* результат 4 */

m = i/(-j); /* результат -4 */

Операция остаток от деления (%) дает остаток от деления первого операнда на второй.

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

int n = 49, m = 10, i, j, k, l;

i = n % m; /* 9 */

j = n % (-m); /* 9 */

k = (-n) % m; /* -9 */

l = (-n) % (-m); /* -9 */