русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2013-12-23; просмотров: 1077; Нарушение авторских прав


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

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

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

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

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

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



Примеры:

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

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

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

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

 

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

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

 



<== предыдущая лекция | следующая лекция ==>
Операции языка Си | Условный оператор


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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