Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать

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

Явное преобразование типа основано на применении оператора приведения типов. Общий вид применения оператора приведения типа имеет следующий вид:

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

Здесь тип– это любой тип, который поддерживается языком Си. Например, следующая запись позволяет преобразовать значение выражения x * y / 5 к типуfloat:

(float) (x * y / 5)

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

Оператор приведения типа является унарным оператором и имеет тот же приоритет, что и другие унарные операторы.

    1. Математические функции

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

Имя функции

Прототип

Описание

abs

intabs(intnum);

Вычисление модуля аргумента num

ceil

doubleceil(doublenum);

Возвращает наименьшее целое, которое удовлетворяет условию >= num. Обратите внимание на тип возвращаемого значения (double).

cos

double cos(doublenum);

Вычисляет значение косинуса от аргумента num. Значение аргумента должно быть задано в радианах.

fabs

doublefabs(double num);

Вычисление значение модуля аргумента num

floor

doublefloor(doublenum);

Возвращает наибольшее целое, которое удовлетворяет условию <= num.

exp

doubleexp(doublenum)

Вычисляет значение экспоненты от аргумента num

log

doublelog(doublenum);

Вычисляет значение натурального логарифма от аргумента num.

log10

doublelog10(doublenum);

Вычисляет значение логарифма по основанию 10 от аргумента num.

pow

double pow(double base, double x);

Вычисляет значение аргумента base, возведенное в степень x.

sin

doublesin(doublenum);

Вычисляет значение синуса от аргумента num. Значение аргумента должно быть задано в радианах.

sqrt

doublesqrt(doublenum);

Вычисляет значение корня квадратного от аргумента num.

tan

doubletan(doublenum);

Вычисляет значение тангенса от аргумента num. Значение аргумента должно быть задано в радианах.

  1. Оператор присваивания и инструкция присваивания

В языке Си различают две формы оператора присваивания:

● простой оператор присваивания,

● составной оператор присваивания.

Составной оператор отличается наличием дополнительной операции, которая выполняется до присваивания. Рассмотрим вначале простой оператор присваивания.

Любой оператор присваивания, не входящий в состав другого выражения, может выступать в качестве инструкции присваивания, если после него поставить точку с запятой. Например, n = 5 – это оператор присваивания, а n = 5; - это инструкция присваивания.

    1. Простой оператор присваивания

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

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

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

В языке Си присваивание имеет расширенное по сравнению с другими языками (Паскаль и Бейсик) назначение. Дело в том, что в языке Си может использоваться возвращаемое оператором присваивания значение. Это связано с тем обстоятельством, что присваивание в языке Си относится к категории операторов (operator), а не инструкций (statement), как это имеет место в других языках. Приведем пример, в котором используется значение, возвращаемое оператором присваивания.

#include<stdio.h> #include<conio.h> intmain(void) {intx = 10;int y = 20; printf("%d\n", x = y); /* ... */ getch();return0; }

В этом программном коде вызов функции printf() используется для вывода на дисплей результата выполнения оператора присваивания.

Оператор присваивания относится к категории бинарных операторов. В качестве знака присваивания в языке Си используется математический знак равенства “=”. При выполнении оператора присваивания вначале вычисляется его правый операнд, затем вычисленное значение записывается в область памяти, адрес которой определяется его левым операндом. Требование знания адреса накладывает ограничения на выражение, которое может использоваться в качестве левого операнда присваивания. К левому операнду должна быть допустима операция взятия адреса. Выражения, допускающие применение этой операции, принято называть lvalue выражениями. Различают две категории lvalue выражений:

● изменяемые,

● неизменяемые.

В качестве левого операнда присваивания следует применять модифицируемое lvalue выражение.

Возвращаемым значением оператора присваивания является значение, записанное в его левый операнд. В книгах по языку Си и в сообщениях компилятора за левым операндом оператора присваивания закрепился термин lvalue (left side value), а за правым - rvalue (right side value) Таким образом, в общем случае простой оператор присваивания имеет следующий формат:

модифицируемое_lvalue_выражение =rvalue_выражение

Простейшим видом модифицируемого_lvalue_выраженияявляется простая переменная, в объявлении которой отсутствует зарезервированное слово const. К числу других допустимых выражений относятся выражения, используемые для доступа к элементам массивов и структур. В качестве правого операнда оператора присваивания может использоваться произвольное выражение, тип которого совместим по присваиванию с типом операнда, стоящего слева от знака присваивания. Все арифметические типы в языке Си совместимы по присваиванию.

Приведем примеры операторов присваивания. Пусть x и y – переменные, имеющие тип double. Тогда допустимы следующие операторы присваивания.

x = 4.5

y = x - 3

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

x = 4.5; y = x - 3;

Приведем примеры некорректных присваиваний.

define MAX 100 const int n = 10; int main(void) { n = 1; /* Ошибка */ MAX = 200; /* Ошибка */ return 0; }

При компиляции этого программного кода в среде Builder v. 6 появились два сообщения об ошибках (error). Первое из них относилось к инструкции “n = 1;” и содержало следующее сообщение “Cannot modify const object” (Нельзя модифицировать константный объект). Второе сообщение было связано с инструкцией “MAX = 200;” и содержало сообщение “Lvalue required” (Lvalue требуется).