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

В том случае, если знак операции стоит после операнда (постфиксная форма записи), то операнд вначале используется для вычисления выражения, и только затем происходит изменение операнда.

Примеры использования операции инкремента:

int t=1, s=2, z, f;

      z=(t++)*5; 

Вначале происходит умножение t*5, а затем увеличение t. В результате получится z=5, t=2.

f=(++s)/3;

Вначале значение s увеличивается, а затем используется в операции деления. В результате получим s=3, f=1.

В случае, если операции увеличения и уменьшения используются как самостоятельные операторы, префиксная и постфиксная формы записи становятся эквивалентными.

z++; /* эквивалентно */ ++z;

Простое присваивание

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

Пример:

int t;

char f;

long z;

t=f+z;

Значение переменной f преобразуется к типу long, вычисляется f+z, результат преобразуется к типу int и затем присваивается переменной t.

Составное присваивание

Кроме простого присваивания, имеется группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют следующий вид:

Операнд1 Бинарная операция '=' Операнд2.

Составное присваивание эквивалентно следующему простому присваиванию:

Операнд1 '=' Операнд1 Бинарная операция Операнд2.

Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций «+=» и «-=» может быть указатель, в то время как правый операнд должен быть целым числом.

Примеры:

double arr[4]={ 2.0, 3.3, 5.2, 7.5 } ;

double b=3.0;

b+=arr[2];      /* эквивалентно оператору b=b+arr(2)             */

arr[3]/=b+1;  /* эквивалентно оператору  arr[3]=arr[3]/(b+1) */ 

Заметим, что при втором присваивании использование составного присваивания дает заметный выигрыш времени выполнения программы, т. к. левый операнд является индексным выражением, а значит для его вычисления потребуется несколько команд микроконтроллера.

Приоритеты операций и порядок вычислений

В языке С-51 операции с высшими приоритетами вычисляются первыми. Наивысшим является приоритет, равный 1. Приоритеты и порядок операций приведены в табл. 9.10.

Побочные эффекты

Операции присваивания в сложных выражениях могут вызывать побочные эффекты, т. к. они изменяют значение переменной. Побочный эффект может возникать и при вызове функции, если он содержит прямое или косвенное присваивание (через указатель). Это связано с тем, что аргументы функции могут вычисляться в любом порядке. Например, побочный эффект имеет место в следующем вызове функции:

prog (a, a=k*2);

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

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

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

1. Не использовать операции присваивания переменной значения в вызове функции, если эта переменная участвует в формировании других аргументов функции.

2. Не использовать операции присваивания переменной значения в выражении, где она используется более одного раза.

Преобразование типов

При выполнении операций происходят неявные преобразования типов в следующих случаях:

— при выполнении операций осуществляются обычные арифметические преобразования (которые были рассмотрены выше);

— при выполнении операций присваивания, если значение одного типа присваивается переменной другого типа;

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

Кроме того, в языке программирования С-51 есть возможность явного приведения значения одного типа к другому.

Перейти на страницу:

Поиск

Похожие книги