Главная Контакты


  На сайте

  Java, JavaScript
  Документация Perl
  Документация PHP
  Документация ASP
  Новости сайта
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C
 


Типы, операторы и выражения


Унарные &, +, - и * имеют высший приоритет за соответствующие бинарные формы.

Обратите внимание, что приоритет разрядных операторов &, ^ и | ниже == и! =. Из этого следует, что выражения проверки битов вроде
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 + +;

Вопрос заключается в том, индекс употребляется со старым значением, или приобрел новое. Разные компиляторы могут толковать это по-разному, и выдавать различные значения в зависимости от интерпретации. Стандарт умышленно не уточняет большинство таких вопросов. Случаи, когда внутри выражения имеет место побочный эффект (присвоение нового значения переменной), оставлено на усмотрение компилятора, поскольку лучшая последовательность действий зависит во многом от машинной архитектуры. (Стандарт однако указывает, что все побочные эффекты аргументов должны состояться до того как вызвано функцию, но это не поможет при вышеприведенном вызова printf)

Мораль заключается в том, что написание кода, который зависит от порядка вычисления, является плохой программистской практикой для любого языка. Естественно, что надо знать вещи, которых нужно избегать, но если вы не будете знать как-то работает на разных архитектурах, то и меньше будет вероятность, что соблазнитесь воспользоваться преимуществами определенной реализации.

Другие статьи по теме:

- Функции и структура программ
- Типы, операторы и выражения
- Введение в c++
- Внешние переменные и область действия
- Символьные массивы


Голосование:
Чего Вы хотели бы видеть больше на сайте?

Статей, документации
Скриптов
Программ для вебмастера
Я не знаю



Другие голосования

Обмен кнопочками:



Приглашаем Вас обменяться кнопочками! Обращайтесь к администратору.


Новые статьи:


Наши партнеры:





2006-2024 © SMTI.RU
Главная страница | Связаться с нами