Аддитивные бинарные операции + и - группируют слева направо. Выполняются обычные арифметические преобразования. Каждая операция имеет некоторые дополнительные возможности, связанные с типами.
Форма записи:
выражение + выражение выражение - выражениеОднако преобразования, выполняемые при аддитивных операциях, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат аддитивной операции не может быть представлен типом операндов после преобразования. При этом сообщение об ошибке не выдается.
Пример:
int i=30000, j=30000, k; k=i+j;В результате сложения k получит значение равное -5536.
Результатом операции + является сумма операндов. Когда целая величина складывается с указателем, то целая величина преобразуется путем умножения ее на размер памяти, занимаемой величиной, адресуемой указателем.
Когда преобразованная целая величина складывается с величиной указателя, то результатом является указатель, адресующий ячейку памяти, расположенную на целую величину дальше от исходного адреса. Новое значение указателя адресует тот же самый тип данных, что и исходный указатель.
|
|
Операция + ассоциативна и выражение с несколькими умножениями на одном уровне может быть реорганизовано компилятором.
Результатом бинарной операции - является разность операндов. Выполняются обычные арифметические преобразования. Кроме того, значение любого целого типа может вычитаться из указателя, в этом случае применяются те же преобразования, что и к сложению.
Возможна следующая комбинация операндов для операций сложения и вычитания:
1. Оба операнда целого или плавающего типа.
2. Оба операнда являются указателями на один и тот же тип.
3. Первый операнд является указателем, а второй - целым.
Отметим, что операции сложения и вычитания над адресами в единицах, отличных от длины типа, могут привести к непредсказуемым результатам.
Пример:
double d[10],* u; int i; u = d+2; /* u указывает на третий элемент массива */ i = u-d; /* i принимает значение равное 2 */Аддитивные унарные операции + и - группируют справа налево.
Форма записи:
+ выражение - выражениеРезультатом унарной операции - является отрицание значения ее операнда. Операнд должен иметь целый тип. Выполняются обычные арифметические преобразования. Отрицательное значение беззнаковой величины вычисляется посредством вычитания ее значения из 2n, где n -число битов в целом типа int.
Операции инкремента /++/ и декремента /--/
Операции увеличения (++) и уменьшения (--) являются унарными операциями присваивания. Они соответственно увеличивают или уменьшают значения операнда на единицу. Операнд может быть целого или плавающего типа или типа указатель и должен быть модифицируемым. Операнд целого или плавающего типа увеличиваются (уменьшаются) на единицу. Тип результата соответствует типу операнда. Операнд адресного типа увеличивается или уменьшается на размер объекта, который он адресует. В языке допускается префиксная или постфиксная формы операций увеличения (уменьшения), поэтому значения выражения, использующего операции увеличения (уменьшения) зависит от того, какая из форм указанных операций используется.
|
|
Если знак операции стоит перед операндом (префиксная форма записи), то изменение операнда происходит до его использования в выражении и результатом операции является увеличенное или уменьшенное значение операнда.
Форма записи:
++ Выражение;
-- Выражение.
В том случае если знак операции стоит после операнда (постфиксная форма записи), то операнд вначале используется для вычисления выражения, а затем происходит изменение операнда.
Форма записи:
Выражение ++;
Выражение --
Пример:
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.
Пример:
sum = a + b ++;
sum = a + ++b;
Первая строка производит следующие действия: складываются значения переменных а и b, результат вычисления присваивается переменной sum, затем переменная b увеличивается на единицу. Вторая строка делает следующее: значение b увеличивается на единицу, а складывается с b, результат сложения присваивается переменной sum.