- •3. Выражения и присваивания
- •3.1. Операнды и операции
- •3.2. Преобразования при вычислении выражений
- •3.3. Операции отрицания и дополнения
- •3.4. Операции разадресации и адреса
- •3.5. Операция sizeof
- •3.6. Мультипликативные операции
- •3.7. Аддитивные операции
- •3.8. Операции сдвига
- •3.9. Поразрядные операции
- •3.10. Логические операции
- •3.11. Операция последовательного вычисления
- •3.12. Условная операция
- •3.13. Операции увеличения и уменьшения
- •3.14. Простое присваивание
- •3.15. Составное присваивание
- •3.16. Приоритеты операций и порядок вычислений
- •3.17. Побочные эффекты
- •3.18. Преобразование типов
3.6. Мультипликативные операции
К этому классу операций относятся операции умножения (*), деления (/) и получение остатка от деления (%). Операндами операции (%) должны быть целые числа. Отметим, что типы операндов операций умножения и деления могут отличаться, и для них справедливы правила преобразования типов. Типом результата является тип операндов после преобразования.
Операция умножения (*) выполняет умножение операндов.
int i=5;
float f=0.2;
double g,z;
g=f*i;
Тип произведения i и f преобразуется к типу double, затем результат присваивается переменной g.
Операция деления (/) выполняет деление первого операнда на второй. Если две целые величины не делятся нацело, то результат округляется в сторону нуля.
При попытке деления на ноль выдается сообщение во время выполнения.
int i=49, j=10, n, m;
n = i/j; /* результат 4 */
m = i/(-j); /* результат -4 */
Операция остаток от деления (%) дает остаток от деления первого операнда на второй.
Знак результата зависит от конкретной реализации. В данной реализации знак результата совпадает со знаком делимого. Если второй операнд равен нулю, то выдается сообщение.
int n = 49, m = 10, i, j, k, l;
i = n % m; /* 9 */
j = n % (-m); /* 9 */
k = (-n) % m; /* -9 */
l = (-n) % (-m); /* -9 */
3.7. Аддитивные операции
К аддитивным операциям относятся сложение (+) и вычитание (-). Операнды могут быть целого или плавающего типов. В некоторых случаях над операндами аддитивных операций выполняются общие арифметические преобразования. Однако преобразования, выполняемые при аддитивных операциях, не обеспечивают обработку ситуаций переполнения и потери значимости. Информация теряется, если результат аддитивной операции не может быть представлен типом операндов после преобразования. При этом сообщение об ошибке не выдается.
Пример:
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 */