русс | укр

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

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

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

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


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

Старшинство и порядок вычисления


Дата добавления: 2015-01-16; просмотров: 772; Нарушение авторских прав


 

В приводимой ниже таблице сведены правила старшинства и ас-

социативности всех операций, включая и те, которые мы еще не

обсуждали. Операции, расположенные в одной строке, имеют

один и тот же уровень старшинства; строки расположены в по-

рядке убывания старшинства. Так, например, операции *, / и %

имеют одинаковый уровень старшинства, который выше, чем уро-

вень операций + и -.

 

OPERATOR ASSOCIATIVITY

 

() [] -> . LEFT TO RIGHT

 

! \^ ++ -- - (TYPE) * & SIZEOF RIGHT TO LEFT

 

* / % LEFT TO RIGHT

 

+ - LEFT TO RIGHT

 

<< >> LEFT TO RIGHT

 

< <= > >= LEFT TO RIGHT

== != LEFT TO RIGHT

 

& LEFT TO RIGHT

 

^ LEFT TO RIGHT

 

\! LEFT TO RIGHT

 

&& LEFT TO RIGHT

 

\!\! LEFT TO RIGHT

 

?: RIGHT TO LEFT

 

= += -= ETC. RIGHT TO LEFT

 

, (CHAPTER 3) LEFT TO RIGHT

 

 

Операции -> и . Используются для доступа к элементам струк-

тур; они будут описаны в главе 6 вместе с SIZEOF (размер

объекта). В главе 5 обсуждаются операции * (косвенная адре-

сация) и & (адрес).

Отметим, что уровень старшинства побитовых логических опера-

ций &, ^ и э ниже уровня операций == и !=. Это приводит к

тому, что осуществляющие побитовую проверку выражения, по-

добные

 

IF ((X & MASK) == 0) ...

 

Для получения правильных результатов должны заключаться в

круглые скобки.

Как уже отмечалось ранее, выражения, в которые входит

одна из ассоциативных и коммутативных операций (*, +, &, ^,

э), могут перегруппировываться, даже если они заключены в

круглые скобки. В большинстве случаев это не приводит к ка-

ким бы то ни было расхождениям; в ситуациях, где такие рас-



хождения все же возможны, для обеспечения нужного порядка

вычислений можно использовать явные промежуточные перемен-

ные.

В языке "C", как и в большинстве языков, не фиксируется

порядок вычисления операндов в операторе. Например в опера-

торе вида

 

X = F() + G();

 

сначала может быть вычислено F, а потом G, и наоборот; поэ-

тому, если либо F, либо G изменяют внешнюю переменную, от

которой зависит другой операнд, то значение X может зависеть

от порядка вычислений. Для обеспечения нужной последователь-

ности промежуточные результаты можно опять запоминать во

временных переменных.

Подобным же образом не фиксируется порядок вычисления

аргументов функции, так что оператор

 

PRINTF("%D %D\N",++N,POWER(2,N));

 

может давать (и действительно дает) на разных машинах разные

результаты в зависимости от того, увеличивается ли N до или

после обращения к функции POWER. Правильным решением, конеч-

но, является запись

 

++N;

PRINTF("%D %D\N",N,POWER(2,N));

 

Обращения к функциям, вложенные операции присваивания,

операции увеличения и уменьшения приводят к так называемым

"побочным эффектам" - некоторые переменные изменяются как

побочный результат вычисления выражений. В любом выражении,

в котором возникают побочные эффекты, могут существовать

очень тонкие зависимости от порядка, в котором определяются

входящие в него переменные. примером типичной неудачной си-

туации является оператор

 

A[I] = I++;

 

Возникает вопрос, старое или новое значение I служит в ка-

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

и в зависимости от своей интерпретации выдавать разные ре-

зультаты. Тот случай, когда происходят побочные эффекты

(присваивание фактическим переменным), - оставляется на ус-

мотрение компилятора, так как наилучший порядок сильно зави-

сит от архитектуры машины.

Из этих рассуждений вытекает такая мораль: написание

программ, зависящих от порядка вычислений, является плохим

методом программирования на любом языке. Конечно, необходимо

знать, чего следует избегать, но если вы не в курсе, как не-

которые вещи реализованы на разных машинах, это неведение

может предохранить вас от неприятностей. (Отладочная прог-

рамма LINT укажет большинство мест, зависящих от порядка вы-

числений.

 

 

* 3. Поток управления *

 

Управляющие операторы языка определяют порядок вычисле-

ний. В приведенных ранее примерах мы уже встречались с наи-

более употребительными управляющими конструкциями языка "C";

здесь мы опишем остальные операторы управления и уточним

действия операторов, обсуждавшихся ранее.

 

 



<== предыдущая лекция | следующая лекция ==>
Условные выражения | 


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


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

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

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


 


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

 
 

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

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