Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции КПиЯП.docx
Скачиваний:
50
Добавлен:
20.09.2019
Размер:
3.8 Mб
Скачать

Математические и логические операции. Условная операция. Математические операции для целочисленных и вещественных вычислений.

К данным операциям относятся: сложение (+), вычитание (-), умножение (*) и деление (/). Данные операции имеют следующие типы результатов в зависимости от типов операндов:

Тип операндов

Тип результата

Целые

Целый

Вещественные

Вещественный

Смешанные

Вещественный

Так как язык «С» является в первую очередь языком системного программирования, то у него упрощена система приведения типов при вычислении. Это накладывает определенные неудобства при вычислении выражений. Рассмотрим пример:

int a,b;

double c;

a = 1; b = 2;

c = a/b;

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

int a,b;

double c;

a = 1; b = 2;

c = (double)a/b;

Следует отметить, что запись c = (double)(a/b); будет ошибочна, так как к вещественному типу будет преобразован результат выражения, а он в данном случае – ноль.

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

int a,b;

double x,y,z;

a = 2; b = 3;

x = a + b; ИЛИ x = (double)(a + b); ИЛИ x = (double)a + b;

y = a – b; ИЛИ y = (double)(a – b); ИЛИ y = (double)a – b;

z = a * b; ИЛИ z = (double)(a * z); ИЛИ z = (double)a * b;

Для сокращения записи на языке С можно использовать усовершенствованные операторы присвоения:

  • += - сложить число с заданным числом или выражением;

  • -= - вычесть из числа заданное число или выражение;

  • *= - умножить число на заданное число или выражение;

  • /= - разделить число на заданное число или выражение.

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

Математические операции только для целочисленных вычислений

К таким операциям относят:

  • взятие остатка от деления (%);

  • операции над битами (&,|,^,!);

  • операции сдвигов (<<, >>);

  • операции инкремента (++) и декремента(--).

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

выражение1 % выражение2;

Присутствует и сокращенная запись оператора присвоения: %=. Ее использование аналогично использованию ранее описанных сокращенных операторов присвоения.

Операции над битами применимы только для незнаковых целых чисел. Операция побитового И (AND) - &, операция побитового ИЛИ (OR) - | и операция побитового ИСКЛЮЧАЮЩЕГО ИЛИ (XOR) - ^ имеют следующий синтаксис:

(выражение1) операция (выражение2)

переменная1 операция переменная2

Операция побитового отрицания (NOT) имеет следующий синтаксис:

~переменная ИЛИ ~(выражение)

Также как и для других операций доступны сокращенные операторы присвоения: &=, |=, ^=, ~=.

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

Выражение1 сдвиг выражение2;

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

++переменная; ИЛИ переменная++;

--переменная; ИЛИ переменная--;

В приведенных записях есть различие. Рассмотрим его на примерах:

Пример 1 Пример 2

int a,b; int a,b;

a=2; a=2;

b=a++; b=++a;

printf(“B=%d\n”,b); printf(“B=%d\n”,b);

В первом примере на экран будет выведено число – два, а во втором – три. Это обусловлено тем, что если знак инкремента или декремента стоит перед переменной, то сначала производится ее изменение, а затем присвоение. Если же знак стоит после переменной, то ее изменение производится после присвоения. Эту особенность необходимо учитывать при написании программ. Если операция инкремента или декремента для переменной используется отдельно от других операций, то порядок действий несущественен. Например:

int a; int a;

a=2; a=2;

a++; ++a;

printf(“A=%d\n”,a); printf(“A=%d\n”,a);

В обоих случаях будет выведено одно и тоже значение – три.