Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электонный конспект.doc
Скачиваний:
3
Добавлен:
13.11.2019
Размер:
746.5 Кб
Скачать

Унарные операции

& операция получения адреса операнда

&c_Symb - адрес размещения в памяти значения переменной c_Symb.

* операция обращения по адресу (называют еще операцией разыменования (доступ по адресу к значению того объекта, на который указывает операнд).

- унарный минус (изменяет знак арифметического операнда).

+ унарный плюс (введен для симметрии с унарным минусом).

~ побитовое отрицание 0001 1100 à 1110 0011

! логическое отрицание 0 à 1, не 0 à 0.

++ увеличение на единицу (инкремент или автоувеличение), существует две формы:

префиксная - увеличение до использования

...

int result, arg=2;

result = ++arg;

после выполнения result примет значение 3.

постфиксная - увеличение после использования

...

int result, arg=2;

result = arg++;

после выполнения result примет значение 2.

-- уменьшение на единицу (декремент или автоуменьшение), также префиксная и постфиксная формы.

sizeof операция вычисления размера операнда (в байтах)

sizeof(char) = 1

sizeof(long) = 4

short Count; --- sizeof(Count) = 2

Бинарные операции

Делятся на следующие группы:

  • аддитивные и мультипликативные

  • сдвигов

  • поразрядные

  • операции отношений

  • логические

  • выбора компонента сложного объекта

  • операция "запятая"

  • скобки в качестве операций

Аддитивные и мультипликативные.

+

бинарный плюс - сложение арифметических операндов или

сложение указателя с целым

-

бинарный минус - вычитание арифметических операндов или

вычитание указателей

*

умножение операндов арифметического типа

/

деление операндов арифметического типа. При целочисленных операндах абсолютное значение результата округляется до целого. 20/3 = 6 и (-20)/3 = -6

%

получение остатка от деления целочисленных операндов (деление по модулю). Знак остатка равен знаку делимого. Например: 14%3 = 2 и (-14)%3 = -2

Один нюанс, который вы должны запомнить.

float res;

res = 5/4;

Результат: res = 1.

Для того, чтобы посчитать "правильно", этот фрагмент программы должен быть

float res;

res = 5./4.;

Результат: res = 1.25.

Операции сдвига. Эти операции определены только для целочисленных операндов.

<< сдвиг влево битового представления левого операнда на число позиций равное значению правого операнда.

short res, Value = 12;

res = Value << 5;

12=0000 0000 0000 1100 - после операции 0000 0001 1000 0000 =0x180=256+128 = 384

12 * 25 = 12 * 32 = 384

>> сдвиг вправо битового представления левого операнда на число позиций равное значению правого операнда.

short res, Value = 1120;

res = Value >> 5;

1120 = 1024 + 96 = 1024 + 64 + 32 = 210 + 26 + 25 = 0000 0100 0110 0000

- после операции 0000 0000 0010 0011 =0x23=32+3 = 35

1120 / 25 = 1120 / 32 = 35

Поразрядные операции.

Выполняются над битовыми представлениями значений целочисленных операндов

&

поразрядная конъюнкция (И)

|

поразрядная дизъюнкция (ИЛИ)

^

поразрядное исключающее ИЛИ

Операция конъюнкция 0&0 = 0 1&0 = 0 0&1 = 0 1&1 = 1

Операция дизъюнкция 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 1

Операция поразрядное исключающее ИЛИ 0&0 = 0 1&0 = 1 0&1 = 1 1&1 = 0

Пример.

0000 0001 1100 1110

0110 0111 0110 1010

--------------------------

0000 0001 0100 1010 (&)

0110 0111 1110 1110 (|)

0110 0110 1010 0100 (^)

Операции отношений (сравнения).

<

меньше, чем

>

больше, чем

<=

меньше или равно, чем

>=

больше или равно, чем

==

равно

!=

не равно

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

Результат операции целочисленный: 0 (ложь) или 1 (истина).

Логические операции.

&& конъюнкция (И) арифметических операндов или отношений

|| дизъюнкция (ИЛИ) арифметических операндов или отношений

Результат 0 (ложь) или 1 (истина).

Примеры отношений и логических операций:

4 < 9 → 1

3 == 5 → 0

3 != 5 || 3==5 → 1

(3+4>5) && (3+5>4) && (4+5>3) → 1

Операции присваивания.

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

Существует одна простая операция присваивания и ряд составных.

Простое присваивание -

А = B*2; - присвоить переменной А результат вычисления выражения B*2.

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

X = XÅY; - тоже в записи составного присваивания X Å=Y;

В качестве символа Å могут быть использованы знаки операций: + - * / % << >> & | ^

Примеры. f += 5; d -=f*2; con ^=0xff71;

Операции выбора компонентов структурированного объекта.

Существует две операции (. и ->) которые мы будем рассматривать позже, вместе с определением самих структурированных объектов.

Запятая в качестве операции.

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

int x,y; y = (x=3, 3*x); (после операции х=3, y=9).

Скобки в качестве операций.

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

Круглые скобки обязательны в обращении к функции:

<имя функции> ( <список аргументов> )

где операндами служат <имя функции> и <список аргументов>.

Квадратные скобки используются в выражении

<имя массива> [<индекс>]

здесь операнды <имя массива> и <индекс>

Условная операция (?:). Эта операция тернарная, то есть имеет три операнда. Ее формат:

операнд_1 ? операнд_2 : операнд_3

Первый операнд может иметь арифметический тип или быть указателем. Он оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю — как true). Если результат вычисления операнда 1 равен true, то результатом условной операции будет значение второго операнда, иначе — третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращенной формой условного оператора i f (он рассмотрен на с. 40).

#include <stdio h>

int main(){

int a = 11, b = 4, max;

max = (b > a)? b :a;

printf( "Наибольшее число. %d", max);

return 0; }

Результат работы программы:

Наибольшее число 11

Другой пример применения условной операции. Требуется, чтобы некоторая целая величина увеличивалась на 1, если ее значение не превышает п, а иначе принимала значение 1:

i = (i < n) ? i + 1: 1,

Приоритет операций. Порядок вычисления выражений.

Сейчас мы рассмотрели весь набор операций языка С. И остался не решенным такой вопрос: в какой последовательности применяются записанные в выражении операции?

Что будет результатом вычисления 4 + 3 * 5 ? 35 или 19?

Очевидно, предполагая определение языка С как "удобного" мы вправе ожидать получения 19. Однако откуда это следует?

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

Если операций одного ранга в выражении несколько, то они выполняются в соответствии с правилом ассоцмативности либо слева направо (à), либо справа налево (ß). Если какой-либо знак операции появляется в таблице дважды (например *), то его первое вхождение (меньший ранг) соответствует унарной операции.

Составим таблицу приоритетов операций.

Ранг

Операции

1

( ) [ ] -> .

2

! ~ + - ++ -- & * (тип) sizeof

3

* / % (мультипликативные бинарные)

4

+ - (аддитивные бинарные)

5

<< >> (операции поразрядного сдвига)

6

< <= >= > (отношения)

7

== != (отношения)

8

& ( поразрядная конъюнкция "И")

9

^ ( поразрядное исключающее "ИЛИ")

10

| ( поразрядная дизъюнкция "ИЛИ")

11

&& ( логическая операция "И")

12

|| ( логическая операция "ИЛИ")

13

?: (операция условной трансляции)

14

= += -= *= /= %= &= |= ^= <<= >>= (присвоения)

15

, (операция "запятая")

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

Функция

Выполняемые действия

Abs(n)

Возвращаемый модуль целого числа

fabs (x)

Возвр. модуль вещественного числа

acos(x)

asin(x)

atan (x)

atan 2(x)

Arcos x

Arsin x

Arctg x

Возвращаем arctg x/y

cos(x)

sin(x)

tan(x)

exp(x)

log(x)

log10(x)

pow(x,y)

sqrt(x)

floor()

ceil

fmod(x,y)

modf

Cos x

Sin x

Tag x

Степень числа е

Натуральный логарифм

Логарифм по основанию 10

Возводит число в степень

Квадратный корень из числа

Округляет вниз

Округляет вверх

Остаток от деления х на у

разбивает число на целую и дробную часть

Преобразование типов

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

int x;

char ch;

float f;

void func(void)

{

ch = x; /* 1 */

x = f; /* 2 */

f = ch; /* 3 */

f = x; /* 4 */

}

В строке 1 левые (старшие) биты целочисленной переменной x обрубаются, оставляя в ch младшие 8 битов. Если х содержит число между 256 и 0, то ch и х будут иметь одинаковое значение. Иначе значение ch будет содержать только младший набор битов переменной х. В строке 2 х получает целую часть переменной f. В строке 3 f получает 8-битное целое число, хранящееся в ch, преобразованное к формату с плавающей точкой. В строке 4 f получает значение целочисленной переменной х, преобразованное к формату с плавающей точкой.

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

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

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

  2. Преобразование из int в float или из float в double и тому подобное не добавляет точности. Такого рода преобразования только изменяют формат представления значения.

2. Преобразование типов в выражениях. Когда операнды различных типов смешиваются в выражениях, то происходит преобразование к одному типу. Компилятор преобразует все операнды «вверх», к типу большего операнда. Ниже описываются правила преобразования типов.

1) Все переменные типа char и short int преобразуются к типу int. Все переменные типа float – к типу double.

2) Если один из пары операндов имеет тип long double, другой операнд также преобразуется к long double.

3) Если один из пары операндов имеет тип double, другой операнд (кроме long double) также преобразуется к типу double.

4) Если один из операндов имеет тип long, другой операнд также преобразуется к long.

5) Если один из операндов имеет тип unsigned, другой операнд также преобразуется к типу unsigned.

В результате применения этих правил преобразования каждая пара операндов будет иметь тип и результат каждой операции будет совпадать по типу с операндами. Рассмотрим преобразование типов, показанное на рисунке 3.1.

К ак показано на данной схеме сначала символ ch преобразуется к целому int, а вещественная переменная с одинарной точностью f преобразуется к типу double. Затем ch/i преобразуется к типу double, поскольку f*d имеет тип double. Конечный результат имеет тип double, поскольку оба операнда типа double.

Принудительные преобразования. Имеется возможность заставить выражение принять определенный тип с помощью операции принудительных преобразований. Эта операция имеет следующие виды:

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

или

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

где тип – это один из стандартных типов данных языка С или определяемый пользователем тип. Например, чтобы выражение x/2 имело тип float (остаток сохранится), следует написать:

(float) x/2;

или

float (x/2);

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

Хотя принудительные преобразования редко используются при программировании на языке С, бывают случаи, когда они просто необходимы. Например, необходимо использовать целое число для управления циклом и, кроме того, требуется вычислять дробную часть от деления этого числа на какое-либо другое, как в следующем примере:

#include <stdio.h>

int main(void)

{

int i;

for(i=1; i<=100; ++i)

printf(“%d / 2 есть: %f\n”, i, (float) i/2);

return 0;

}

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

Тема 3. Язык программирования С/С++. Представление основных управляющих структур

Алгоритм.

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

Существуют различные способы представления алгоритмов.

  • Графический

  • Вербальный –описательный

  • Псевдокод – частично формализованная запись алгоритма на естеств. языке.

  • Алгоритмический язык программирования.

Для представления алгоритма графически по ГОСТу используются след. символы:

  1. Данные входные или выходные

  1. Процесс – действия над данными

  1. П редопределенный процесс – действия над данными, определенные в другом алгоритме(вызов функции)

  1. Подготовка – описывается подготовка данных для выполнения повторяющихся действий.

  1. Решение – запись логического выражения

  1. Завершение – символ начала или конца алгоритма

  1. С оеденитель(узел)

  1. Линия –поток данных или передача управления

  1. Комментарии

1)Символы в схеме д. б. расположены равномерно.

2) Символы должны быть одного размера. Если объем текста внутри символа превышает его размеры, то следует использовать символ комментарий.

Потоки данных и потоки управления показаны линиями. Направления слева-направо и сверху-вниз явл-ся стандартныыми. Нестандартные направления обозначены стрелками.

Следует избегать пересечения линий.

Р азрыв линий

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

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

Операторы управления программой