Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Вывод программы 4.4 a % b = 0 a % c = 5 a % d = 4 a / d * d + a % d = 25

В процедуре main переменные a, b, с и d определяются в одной строке.

Символ после знака «%» указывает, как должен выводиться следующий ар-гумент. Если следующим символом является еще один знак процента, процедура NSLog выводит этот знак и вставляет его в соответствующую позицию вывода программы.

Из результатов вывода можно заключить, что оператор % вычисляет остаток отделения первого значения на второе. В первом примере остаток отделения 25 на 5 равен 0. Если разделить 25 на 10, то мы получим в остатке 5, что подтверждается второй строкой вывода. Деление 25 на 7 дает в остатке 4, что показано в третьей строке вывода.

Теперь

рассмотрим арифметическое выражение, вычисляемое в последней строке. Операции между двумя целыми значениями выполняются с помощью целочисленной арифметики, поэтому остаток отделения двух целых значений просто отбрасывается. Деление 25 на 7 (выражение а / d) дает промежуточный результат 3. Умножение этого значения на значение d (оно равно 7) дает проме-жуточный результат 21. И, наконец, остаток от деления а на d (в выражении а % d) дает конечный результат 25 (21 + 4). Результат равен значению переменной а, и это не является случайным совпадением. Следующее выражение всегда равно значению а, если а и b являются целыми значениями. a/b*b + a%b

На самом деле оператор остатка от деления (%) предназначен для работы только с целыми значениями.

Что касается приоритета операций, то оператор остатка от деления имеет одинаковый приоритет с операторами умножения и деления. Отсюда следует, что выражение table + value % TABLE_SIZE будет вычисляться как table + (value % TABLE_SIZE) Преобразования между целыми значениями и значениями с плавающей точкой

Чтобы эффективно разрабатывать программы на Objective-C, необходимо знать правила, применяемые в Objective-C для неявного преобразования между целыми значениями и значениями с плавающей точкой. В программе 4.5 показаны примеры некоторых простых преобразований между числовыми типами данных. // Основные преобразования в Objective-C #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; float f1 = 123.125, f2; int M, i2 = -150; i1 = f1; // преобразование типа float в целый тип int NSLog (@"%f assigned to an int produces %i", f1, i1); f1 = i2; // преобразование целого типа в тип float NSLog (@"%i assigned to a float produces %f, i2, f1); f1 = i2 / 100; // деление целого значения на целое NSLog (@"%i divided by 100 produces %f", i2, f 1); f2 = i2 / 100.0; // деление целого значения на тип float NSLog (@"%i divided by 100.0 produces %f", i2, f2); f2 = (float) i2 / 100; // оператор приведения типа NSLog (@"(float) %\ divided by 100 produces %f", i2, f2); [pool drain]; return 0; }

Вывод программы 4.5 123.125000 assigned to an int produces 123 -150 assigned to a float produces -150.000000 -150 divided by 100 produces -1.000000 -150 divided by 100.0 produces -1.500000 (float) -150 divided by 100 produces -1.500000

Если значение с плавающей точкой присваивается переменной целого типа, дробная часть этого числа отбрасывается. Тем самым, если в приведенной про-грамме значение f1 присваивается И, то дробная часть числа 123.125 отбрасывается, то есть в И сохраняется его целая часть (123). Это показано в первой строке вывода программы.

Если значение целой переменной присваивается переменной с плавающей точкой, это не вызывает какого-либо изменения в значении числа; система просто преобразует это значение и сохраняет его в переменной с плавающей точкой. Во второй строке вывода программы показано, что значение \2 (-150) правильно преобразовано и сохранено в переменной f1 типа float.

В следующих двух строках вывода программы показаны две ситуации, о ко-торых нужно помнить при формировании арифметических выражений. В первом случае действует целочисленная арифметика, о которой мы говорили в пре-дыдущем разделе. Если два операнда выражения являются целыми (это относится и к целым переменным с модераторами short, unsigned

и long), то операция выполняется по правилам целочисленной арифметики. Поэтому любая дробная часть, полученная в операции деления, отбрасывается, даже если результат присваивается переменной с плавающей точкой (как в этой программе). Если целая переменная i2 делится на целую константу 100, то система выполняет целочисленное деление. Поэтому результат деления -150 на 100, равный -1, сохраняется в переменной типа float f1.

Следующее деление применяется к целой переменной и константе с плава-ющей точкой. Любая операция, выполняемая с двумя значениями в Objective- С, выполняется как операция с плавающей точкой, если хотя бы одно из значений является переменной или константой с плавающей точкой. Поэтому при делении значения i2 на 100.0 система выполняет деление с плавающей точкой и дает результат -1.5, который присваивается переменной типа f1 float. Оператор приведения типа

При объявлении и определении методов для объявления типов возвращаемого значения и аргументов тип включается в круглые скобки. Внутри выражений этот способ применяется для другой цели.

В последней операции деления программы 4.5 появляется оператор приве-дения типа: f2 = (float) i2 / 100; // оператор приведения типа

В данном случае для вычисления выражения оператор приведения типа ис-пользуется для преобразования значения переменной i2 в тип float. Это оператор не влияет на значение переменной i2; это унарный оператор. Выражение (float) а не влияет на значение а — аналогично выражению -а.

Оператор приведения типа имеет более высокий приоритет, чем все ариф-метические операторы, за исключением унарных операций «плюс» и «минус». И, конечно, вы можете использовать в выражении круглые скобки, чтобы вы-числения выполнялись в нужном порядке.

В этом примере выражение (int) 29.55 + (int) 21.99

вычисляется в Objective-C как 29 + 21

поскольку приведение значения с плавающей точкой к целому типу приводит к отбрасыванию дробной части. Выражение (float) 6 / (float) 4

дает значение 1.5, как и в следующем выражении: (float) 6/4

Оператор приведения типа часто используется для принудительного приве-дения объекта, имеющего обобщенный тип id, к объекту определенного класса. Например, в следующих строках выполняется преобразование значения пере-менной myNumber типа id к объекту класса Fraction: id myNumber; Fraction *myFraction; myFraction = (Fraction *) myNumber;

Результат этого преобразования присваивается переменной myFraction типа Fraction. 4.3. Операторы присваивания

Язык Objective-C позволяет объединять арифметические операторы с оператором присваивания в обобщенном формате ор=

В этом формате ор - любой из арифметических операторов, включая +, *, / или %. Кроме того, ор может быть любым из битовых операторов для смещения и маскирования, которые описываются ниже.

Рассмотрим строку count += 10;

Оператор «плюс равно» += добавляет выражение, находящееся справа от этого оператора, к переменной, находящейся слева от оператора, и сохраняет результат в этой переменной. Таким образом, приведенная выше строка экви-валентна следующей строке: count = count + 10;

В следующем выражении используется оператор «минус равно» для вычи-тания 5 из значения переменной counter: counter -= 5

Это эквивалентно выражению counter = counter - 5

А теперь чуть более сложное выражение: а /= b + с

Выполняется деление а на то, что находится справа от знака равенства (сумму b и с), и сохранение результата в а. Сначала выполняется сложение, поскольку оператор сложения имеет более высокий приоритет, чем оператор присваивания. Все операторы, кроме точкой, имеют более высокий приоритет, чем операторы присваивания, которые имеют одинаковый приоритет.

Поделиться:
Популярные книги

Симфония теней

Злобин Михаил
3. Хроники геноцида
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Симфония теней

Древесный маг Орловского княжества 5

Павлов Игорь Васильевич
5. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 5

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Страж Кодекса

Романов Илья Николаевич
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Запечатанный во тьме. Том 3

NikL
3. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 3

Точка Бифуркации IV

Смит Дейлор
4. ТБ
Фантастика:
героическая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации IV

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII