Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




Приоритеты и порядок выполнения операций, тип результата выражения

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

Если в одном выражении присутствуют несколько разных операций, то они выполняются в соответствии с приоритетами – в первую очередь выполняются операции с более высоким приоритетом. Каждая операция в Си++ имеет свой приоритет, всего существует 16 классов приоритетов (в Си было 15 классов, отсутствовали операции для работы с указателями на элементы класса). Если в одном выражении присутствует несколько одинаковых операций, то они могут выполняться или слева направо или справа налево, это определяет такое свойство операций, которое называется ассоциативностью (порядок выполнения операции в выражении). Приоритеты и ассоциативность операций языка Си++ представлены в таблице 3.1, операции в таблице представлены в порядке убывания приоритета.

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

Примеры:

y = a + b * 10; // В первую очередь выполняется *, затем +, далее =

y = (a + b) * 10; // В первую очередь выполняется + (из- за скобок), затем *, далее =

a = b = c = 100; // Операции = выполняются справа налево,

// всем переменным будет присвоено значение 100

Таблица 3.1 – Приоритеты и ассоциативность операций языка Си++

Приоритет (Ранг) Операции Наименование Ассоциативность
  () [] ->.:: Первичные ®
  ! ~ + - ++ -- & * (ти) sizeof new delete Унарные ¬
  .* ->* Работа с указателями на элементы класса ®
  * / % Мультипликативные ®
  + - Аддитивные ®
  «» Поразрядный сдвиг ®
  < <= >= > Отношение (сравнение) ®
  ==!= Отношение (сравнение) ®
  & Поразрядное И ®
  ^ Поразрядное исключающее ИЛИ ®
  | Поразрядное ИЛИ ®
  && Логическое И ®
  || Логическое ИЛИ ®
  ?: Условная ¬
  = *= /= %= += -= &= ^= |= <<= >>= Простое и составное присваивание ¬
  , (операция "запятая") Последовательное вычисление ®

 

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

- все операнды типа 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. Заголовки некоторых полезных математических функций представлены в таблице 3.2.

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

Функция Прототип и краткое описание действий  
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); Функция тангенса. Угол (аргумент) задается в радианах.

 




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 271; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.