Тип результата выражения арифметической бинарной операции

Рассмотрим, что будет, если в арифметической бинарной операции (+ - * /) присутствуют два операнда разных типов, в этом случае существуют правила, по которым можно определить тип результата выражения. Происходит следующее приведение типов по умолчанию, тип результата будет соответствующий:

- все операнды типа float преобразуются к типу double;

- если один из операндов имеет тип double (long double), то второй тоже приводится к double (long double)

- если один имеет тип unsigned long, то второй также преобразуется к unsigned long

- если один имеет тип long, то второй также преобразуется к long

- если один имеет тип unsigned int, то второй также преобразуется к unsigned int

- если операнды целые меньшей размерности, чем тип int (unsigned int), то знаковые приводятся к типу int, беззнаковые к unsigned int;

- иначе оба операнда имеют тип int.

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

double x=3/2;

Значение переменной x будет равно 1.0 (а не 1.5, как кажется внешне), это связано с тем, что два операнда являются константами типа int, следовательно, результат операции имеет тип int, дробная часть при этом отбрасывается, далее целая 1 приводится к вещественному типу. Что устранить ошибку, связанную с потерей дробной части достаточно один из операндов сделать вещественным:

double x=3./2;

В заключение рассмотрим пример вычисления некоторого выражения.

Даны x, y (значения вводятся с клавиатуры). Вычислить a, если

 Все значения вещественные.

Пример программы представлен ниже.

#include <stdio.h>

#include <math.h>

void main()

{

double x, y, a; // Определение переменных

// Ввод исходных данных

printf("x="); scanf("%lf", &x);

printf("y="); scanf("%lf", &y);

// Вычисляем значение выражения

a=(sqrt(fabs(x-1))-pow(fabs(y), 1./3)) / (1+x*x/2+y*y/4);

printf("a=%f", a);

}

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

Таблица 4 - Некоторые математические функции

Функция Прототип и краткое описание действий  
abs int abs(int i); Возвращает абсолютное значение целого аргумента i.  
acos double acos(double х); Функция арккосинуса. Значение аргумента должно находиться в диапазоне от-1 до +1.  
asin double asin(double x); Функция арксинуса. Значение аргумента должно находиться в диапазоне от -1 до +1.  
atan double atan(double x); Функция арктангенса.  
cos double cos(double x); Функция косинуса. Угол (аргумент) задается в радианах.  
exp double exp(double x); Вычисляет значение еx (экспоненциальная функция).  
fabs double fabs(double x); Возвращает абсолютное значение вещественного аргумента х двойной точности.  
floor double floor(double x); Находит наибольшее целое, не превышающее значения х. Воз­вращает его в форме double.  
log

double log(double x); Возвращает значение натурального логарифма (ln x).

log10

double log10(double x); Возвращает значение десятичного логарифма (log10 x).

poly

double poly(double x, int n, double c[ ]); Вычисляет значение полинома: c[n]xn + c[n - 1]xn-1 +... + c[l]x + c[0]

pow

double pow(double x, double y); Возвращает значение хy т.е. х в степени у.

pow10

double pow10(int p); Возвращает значение 10p.

sin

double sin(double x); Функция синуса- Угол (аргумент) задается в радианах.

sqrt

double sqrt(double x); Возвращает положительное значение квадратного корня Ö x.

tan

double tan(double x); Функция тангенса. Угол (аргумент) задается в радианах.

 

Термины

Оператор – это языковая конструкция, представляющая шаг из последовательности действий или описаний (оператор задает законченное описание некоторого действия), оператор всегда завершается «;», за исключение составного оператора или блока. (Элементы заголовка цикла for, после которых ставится «;» оператором считать не будем).

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

Оператор – выражение строится из операндов и знаков операций, выражение задает правило вычисления некоторого значения.

Составной оператор – это последовательность операторов, заключенных в фигурные скобки { }.

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

Ассоциативность - порядок выполнения операции в выражении, бывают право ассоциативные операции, выполняются в выражении справа налево и лево ассоциативные операции, выполняются в выражении слева направо.

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: