|
Программирование >> Дополнительные возможности наследования
может привести к удивительным результатам, если полученная разность окажется отрицательным числом. Вы уже видели нечто подобное на прошлом занятии при описании переполнения переменных. В листинге 4.2 демонстрируется ситуация, когда из малого беззнакового числа вычитается большое беззнаковое число. Лнстппг 4.2. Пример вычитания с пврвпожпвнивм цвдого чнсжа 1: Листинг 4.2. Пример вычитания с 2: переполнением целого числа 3: Sinclude <iostream.h> 4; 5: int main() 6: { 7: unsigned int difference; 8: unsigned int bigNumber = 100; 9: unsigned int smallNumber = 50; 10: difference = bigNumber - smallNumber; 11: cout << Difference is: difference; 12: difference = smallNumber - bigNumber; 13: cout \nNow difference is: difference <<endl; 14: return 0; 15: } - Difference is: 50 Now difference is: 4294967246 Оператор вычитания используется в строке 10, а результат выводится на экран в строке 11, в данном случае вполне ожидаемый. В строке 12 вновь вызывается оператор вычитания, но на этот раз большое беззнаковое число вычитается из малого беззнакового числа. Результат должен быть отрицательным, но поскольку он вычисляется (и выводится) как беззнаковое число, происходит переполнение, о чем говорилось на прошлом занятии. Эта тема подробно рассматривается в приложении А. шчислвннов двАвнпв п двАвипв по моддлш Целочисленное деление несколько отличается от обычного. Целочисленное деление - это то же самое деление, которое вы изучали, когда ходили в первый класс. При делении числа 21 на число 4 (21/4) в случае целочисленного деления в ответе получается 5 и остаток 1. Чтобы получить остаток, нужно число 21 разделить по модулю 4 (21 % 4), в результате получим остаток 1. Операция деления по модулю иногда оказывается весьма полезной, например, если вы захотите вывести из ряда чисел каждое десятое значение. Любое число, результат деления которого по модулю 10 равен нулю, является кратным десяти, т.е. делится на 10 без остатка. Так, результат выражения 1 % 10 равен 1; 2 % 10 равен 2 и т.д.; а 10 % 10 равен 0. Результат от деления 11 % 10 снова равен1; 12 % 10 снова равен 2; и так можно продолжать до следующего числа, кратного 10, которым окажется 20. Мы воспользуемся этим методом при рассмотрении циклов на занятии 7. Вонросы u ответы При делении 5 на 3 я получаю в ответе 1. В чем моя ошибка? При делении одного целого числа на другое в качестве результата вы также получите целое число. Следовательно, 5/3 равно 1. Для получения дробного результата нужно использовать вещественные числа. Выражение 5.0 / 3,0 даст дробный ответ: 1,66667. Если ваш метод принимает в качестве параметров целочисленные значения, нужно привести их к типу float. Выполняя операцию приведения типа переменной, вы заставляете компилятор изменить ее тип. При этом вы как будто говорите своему компилятору: Я знаю, что делаю . Было бы неплохо, если бы это оказалось правдой, поскольку компилятор как бы отвечает вам: Как скажете, босс: вся ответственность ложится на вас . В данном случае мы хотим сказать компилятору: Я понимаю, что ты считаешь это значение целым, но я знаю, что делаю: это действительно вещественное значение . Для приведения типа существует два способа. Можно использовать приведение типа в старом стиле С или новый улучшенный оператор ANSI static cast. Оба варианта демонстрируются в листинге 4.3. Дисшинг 4.3. Приведение переменпоб к шиив float 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <iostream.h> void intDiv(int x, int y) { int z = X / y; cout z: << z endl; void floatDiv(int x, int y) ( float a = (float)x; старый стиль float b = static cast<float>(y); современный стиль float с = a / b; cout c: << с endl; int main() { int X = 5, у = 3; intDiv(x,y); floatDiv(x,y); return 0; I ; z: 1 c: 1.66667 p В строке 20 объявляются две целочисленные переменные. В строке 21 они как параметры пере даются функции IntDiv, а в строке 22 - функции floatDiv. Вторая функция начинается со строки 9. В строках 11 и 12 целые значения приводятся к вещественному типу и присваиваются переменным типа float. Результат деления присваивается третьей переменной типа float в строке 13 и выводится на экран в строке 15. Совместное использование математических операторов с операторами присваивания Нет ничего необычного в том, чтобы к переменной прибавить некоторое значение, а затем присвоить результат той же переменной. Если у вас есть переменная myAge и вы хотите увеличить ее значение на два, можно записать следующее: int myAge = 5; int temp; temp = myAge + 2; складываем 5 + 2 и результат помещаем в temp myAge = temp; значение возраста снова помещаем в myAge Однако этот метод грешит излишествами. В языке С++ можно поместить одну и ту же переменную по обе стороны оператора присваивания, и тогда предьщущий блок сведется лишь к одному выражению; myAge = myAge + 2; В алгебре это выражение рассматривалось бы как бессмысленное, но в языке С++ оно читается следующим образом: добавить два к значению переменной myAge и присвоить результат переменной myAge. Существует еще более простой вариант предьщущей записи, хотя его труднее читать: myAge += 2; Этот оператор присваивания с суммой (+=) добавляет г-значение к 1-значению, а затем снова записывает результат в 1-значение. Если бы до начала выполнения выражения переменная myAge имела значение 4, то после ее выполнения значение переменной myAge стало бы равным 6. Помимо оператора присваивания с суммой существуют также оператор присваивания с вычитанием (-=), делением (/=), умножением (♦=) и делением по модулю (%=). Инкремент и декремент Очень часто в программах к переменным добавляется (или вычитается) единица. В языке С++ увеличение значения на 1 называется инкрементом, а уменьшение на 1 - декрементом. Для этих действий предусмотрены специальные операторы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |