Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СиМП Ответы.docx
Скачиваний:
3
Добавлен:
24.12.2018
Размер:
131.07 Кб
Скачать
  1. Элементы языка С. Константы. Идентификаторы. Ключевые слова. Комментарии.

Символы, используемые для образования ключевых слов и идентификаторов. В эту группу входят прописные и строчные буквы английского алфавита, а также символ подчеркивания, также в языке С используются арабские цифры, пробелы, табуляции и различные знаки (&^(){} и т. д.). Следует отметить, что одинаковые прописные и строчные буквы считаются различными символами, так как имеют различные коды.

Управляющая последовательность

Наименование

Шеснадцатеричная замена

\b

Возврат на шаг

008

\t

Горизонтальная табуляция

009

\n

Переход на новую строку

00A

\v

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

00B

\r

Возврат в начало строки

00C

\f

Перевод формата

00D

\"

Кавычки

022

\'

Апостроф

027

\0

Ноль-символ

000

\\

Сам обратный слэш

05C

\ddd

Символ набора кодов ПЭВМ в восьмеричном представлении

 

\xddd

Символ набора кодов ПЭВМ в шестнадцатеричном представлении

 

Константами называются перечисление величин в программе. В языке СИ разделяют четыре типа констант: А) целые константы Б) константы с плавающей запятойВ) символьные константы Г) строчные константы

Целая константа: это десятичное, восьмеричное или шестнадцатеричное число, которое представляет целую величину в одной из следующих форм: десятичной, восьмеричной или шестнадцатеричной.

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

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

Шестнадцатеричная константа начинается с обязательной последовательности 0х или 0Х и содержит одну или несколько шестнадцатеричных цифр (цифры представляющие собой набор цифр шеснадцатеричной системы счисления: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

Константа с плавающей точкой - десятичное число, представленное в виде действительной величины с десятичной точкой или экспонентой. Формат имеет вид:

[ цифры ].[ цифры ] [ Е|e [+|-] цифры ] .

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

Примеры: 115.75, 1.5Е-2, -0.025, .075, -0.85Е2

Символьная константа - представляется символом заключенном в апострофы. Управляющая последовательность рассматривается как одиночный символ, допустимо ее использовать в символьных константах. Значением символьной константы является числовой код символа. Примеры:' '- пробел ,'\n' - символ новой строки .

Строчная константа (литерал) - последовательность символов (включая строковые и прописные буквы русского и латинского а также цифры) заключенные в кавычки (") . Например: "Школа N 35", "город Тамбов", "YZPT КОД".

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

Строковый литерал имеет тип char[] . Это означает, что строка рассматривается как массив символов. Отметим важную особенность, число элементов массива равно числу символов в строке плюс 1, так как нулевой символ (символ конца строки) также является элементом массива. Все строковые литералы рассматриваются компилятором как различные объекты.

Будьте внимательны и не путайте символьную константу со строкой, содержащей один символ: ‘X’ - это не то же самое, что “X”. Первое – это отдельный символ, использованный с целью получения численного значения,

соответствующего букве х в машинном наборе символов. Второе – символьная строка, состоящая из одного символа (буква х) и \0.

Идентификатором называется последовательность цифр и букв, а также специальных символов, при условии, что первой стоит буква или специальный символ. Для образования идентификаторов могут быть использованы строчные или прописные буквы латинского алфавита. В качестве специального символа может использоваться символ подчеркивание (_). Два идентификатора для образования которых используются совпадающие строчные и прописные буквы, считаются различными. Например: abc, ABC, A128B, a128b .

Ключевые слова - это зарезервированные идентификаторы, которые наделены определенным смыслом. Их можно использовать только в соответствии со значением известным компилятору языка СИ.Приведем список ключевых слов:auto double int struct break else long switch register tupedef char extern return void case float unsigned default for signed union do if sizeofvolatile continue enum short while_asm, fortran, near, far, cdecl, huge, paskal, interrupt .

/* комментарий*/

//однострочный коммнтар

2. Целочисленные типы. Объявление переменных. Инициализация переменных.

Тип данных

Байты

Биты

Min

Max

signed char

1

8

- 128

127

unsigned char

1

8

0

255

signed short

2

16

-32768

32767

unsigned short

2

16

0

65535

signed int

2

16

-32768

32767

unsigned int

2

16

0

65535

signed long

4

32

-2147483648

2147483647

unsigned long

4

32

0

4294967295

Объявление переменной имеет следующий формат

[модификаторы] спецификатор_типа идентификатор Модификаторы - ключевые слова signed, unsigned, short, long. Спецификатор типа - ключевое слово char или int, определяющее тип объявляемой переменной. Идентификатор - имя переменной.

3. Типы чисел с плавающей точкой. Объявление переменных. Инициализация переменных.

Объявление переменной имеет следующий формат:  [модификаторы]  спецификатор_типа  идентификатор  Модификаторы - long (олько у double) Спецификатор типа - ключевое слово double(1.7E-308 до 1.7E+308) или float(3.14E-38 до 3.14E+38.), определяющее тип объявляемой переменной. Идентификатор - имя переменной.

4. Выражения языка С. Операции. Операнды. Присваивание. Преобразования типов при вычислении выражений.

+ - * / % << >> & \^ \!

Если е1 и е2 - выражения, то

е1 оп= е2

эквивалентно

е1 = (е1) оп (е2)

- Типы CHAR и SHORT преобразуются в INT, а FLOAT в DOUBLE.

- Затем, если один из операндов имеет тип DOUBLE, то другой

преобразуется в DOUBLE, и результат имеет тип DOUBLE.

- В противном случае, если один из операндов имеет тип LONG, то другой

преобразуется в LONG, и результат имеет тип LONG.

- В противном случае, если один из операндов имеет тип UNSIGNED, то

другой преобразуется в UNSIGNED и результат имеет тип UNSIGNED.

- В противном случае операнды должны быть типа INT, и результат имеет

тип INT.

Подчеркнем, что все переменные типа FLOAT в выражениях пре-

образуются в DOUBLE; в “C” вся плавающая арифметика выполняется с

двойной точностью.

Преобразования возникают и при присваиваниях; значение правой части

преобразуется к типу левой, который и является типом результата. Символьные

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

него, как описано выше. Обратное преобразование INT в CHAR ведет себя

хорошо - лишние биты высокого порядка просто отбрасываются.

5 Операции сдвига языка С. Поразрядные операции. Логические операции.

Операции сдвига

Операции сдвига осуществляют смещение операнда влево (<<) или вправо (>>) на число битов, задаваемое вторым операндом. Оба операнда должны быть целыми величинами. Выполняются обычные арифметические преобразования. При сдвиге влево правые освобождающиеся биты устанавливаются в нуль. При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа первого операнда. Если тип unsigned, то свободные левые биты устанавливаются в нуль. В противном случае они заполняются копией знакового бита. Результат операции сдвига не определен, если второй операнд отрицательный.

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

Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.

Логические операторы

&& и

\!\! или

!не

== равно

!= не равно

Логические побитовые операторы

Существует шесть побитовых оператора:

   &   оператор И (AND)    |   оператор ИЛИ (OR)    ^   оператор XOR - исключающее ИЛИ, сложение по модулю 2    ~   оператор инверсии   >>   оператор сдвига вправо   <<   оператор сдвига влево .

Оператор &

Оператор & (И) сравнивает два значения и возвращает значение 1, только в том случае, если оба значения были установлены в 1. Биты сравниваются используя следующую таблицу

   1   &   1   ==   1    1   &   0   ==   0    0   &   1   ==   0    0   &   0   ==   0

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

BYTE b = 50; if ( b & 0x10 )     cout << "Четвертый бит установлен" << endl; else     cout << "Четвертый бит читс" << endl;

В результате будет выполнен следующий подсчет

    00110010  - b   & 00010000  - & 0x10   ----------     00010000  - результат

Теперь мы видим, что четвертый бит был установлен.

Оператор \!(или \!)

Оператор | (ИЛИ) сравнивает два значения и возвращает результат в виде единицы, если хотя бы один из битов будет установлен (равен единице). Биты сравниваются, используя следующую таблицу

   1   |   1   ==   1    1   |   0   ==   1    0   |   1   ==   1    0   |   0   ==   0

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

BYTE b = 50; BYTE c = b | 0x04; cout << "c = " << c << endl;

В результате будет выполнен следующий подсчет

    00110010  - b   | 00000100  - | 0x04   ----------     00110110  - результат

Оператор ^

Оператор ^ (XOR) сравнивает два значения и возвращает единицу в случае, если значения сравниваемых элементов различаются. То есть в случае, если сравниваемые значения одинаковы, будет возвращено новое значение. Биты сравниваются, используя следующую таблицу

   1   ^   1   ==   0    1   ^   0   ==   1    0   ^   1   ==   1    0   ^   0   ==   0

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

BYTE b = 50; cout << "b = " << b << endl; b = b ^ 0x18; cout << "b = " << b << endl; b = b ^ 0x18; cout << "b = " << b << endl;

В результате будут выполнены следующие подсчеты

    00110010  - b   ^ 00011000  - ^ 0x18   ----------     00101010  - result     00101010  - b   ^ 00011000  - ^ 0x18   ----------     00110010  - результат

Оператор \^(ВЕЗДЕ \^)

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

BYTE b = \^0x03; cout << "b = " << b << endl; WORD w = \^0x03; cout << "w = " << w << endl;

В результате будут выполнены следующие подсчеты

    00000011  - 0x03     11111100  - ~0x03  b     0000000000000011  - 0x03     1111111111111100  - ~0x03  w

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

BYTE b = 50; cout << "b = " << b << endl; BYTE c = b & ~0x10; cout << "c = " << c << endl;

В результате будут выполнены следующие подсчеты

    00110010  - b   & 11101111  - ~0x10   ----------     00100010  - результат

Операторы >> и <<

Операторы >> (сдвиг вправо) и << (сдвиг влево) передвигают биты на определенное число позиций. Оператор >> сдвигает биты с бита с высоким уровнем к нижнему. Оператор << сдвигает биты со стороны нижнего уровня к биту с верхним уровнем. Одним из вариантов использования является выравнивание битов по какой-либо причине (ознакомьтесь с макросами MAKEWPARAM, HIWORD и LOWORD)

BYTE b = 12; cout << "b = " << b << endl; BYTE c = b << 2; cout << "c = " << c << endl; c = b >> 2; cout << "c = " << c << endl;

В результате будут выполнены следующие подсчеты

    00001100  - b     00110000  - b << 2     00000011  - b >> 2

6.Арифметические операции языка С. Аддитивные операции. Мультипликативные операции. Операция арифметического отрицания. Операции увеличения и уменьшения

%- целочисленное деление, к float и double не применимо.

- - Операция арифметического отрицания

Выражение ++N увеличивает переменную N до использования ее значения, в то время как N++ увеличивает переменную N после того, как ее значение было использовано.

  1. Операции последовательного вычисления языка С. Условная операция. Адресные операции. Операция sizeof.