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

ЖАНРЫ

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

вычисляется по описанным выше правилам как (а Ь) + (с d) то есть (100 * 2)+ (25 *4)

Результат 300 передается процедуре NSLog. Целочисленная арифметика и унарный оператор «минус»

В программе 4.3 демонстрируется то, что мы только что обсуждали, и вводится понятие целочисленной арифметики. // Другие арифметические выражения #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePooI * pool = [[NSAutoreleasePool alloc] init]; int a = 25; int b = 2; int result; float c = 25.0; float d = 2.0; NSLog (@"6 + a / 5 * b = %i", 6 + a / 5 * b); NSLog (@"a / b * b = %i", a / b * b); NSLog (@"c/d*d = %f", c/d*d); NSLog (@"-a = %i" -a); [pool drain]; return 0; }

Вывод

программы 4.3 6 + a/5*b=16 a / b * b = 24 c / d * d = 25.000000 -a = -25

Мы вставили дополнительные пробелы между int и объявлением переменных а, b и result в первых трех выполняемых строках, чтобы выровнять объявление каждой переменной. Это делает программу более удобной для чтения. Вы могли заметить, что каждый арифметический оператор окружен пробелами. Обычно вы можете добавлять дополнительные пробелы там, где разрешен один пробел. Это не обязательно, но упрощает чтение программы.

Вычисление выражения в первом вызове NSLog программы 4.3 происходит следующим образом.

Поскольку деление имеет более высокий приоритет, чем сложение, сначала значение а (25) делится на 5. Это дает промежуточный результат 5.

Поскольку умножение имеет более высокий приоритет, чем сложение, про-межуточный результат 5 умножается на 2 (значение Ь), что дает новый про-межуточный результат 10.

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

Во второй строке, казалось бы, деление на b и последующее умножение на b должно дать значение переменной а, то есть присвоенной ей значение 25. Но результаты вывода дают значение 24. Дело в том, что выражение было вычислено с помощью целочисленной арифметики.

Переменные а и b были объявлены с типом int. Если вычисляемый член в выражении содержит два целых значения, Objective-C выполняет операцию, используя целочисленную арифметику, при которой дробная часть отбрасыва-ется. Поэтому при делении значения а на значение b (25 делится на 2) мы полу-чаем промежуточный результат 12, а не 12.5, как можно было бы ожидать. Ум-ножение этого промежуточного результата на 2 дает конечный результат 24.

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

Решение о выборе между типом переменной float или int нужно принимать, исходя из предполагаемого использования переменной. Если вам не нужная дробная часть, используйте целую переменную. Результирующая программа будет работать быстрее на многих компьютерах. С другой стороны, если вам нужна точность со знаками после десятичной точки, то выбор очевиден. Остается только решить, какой тип использовать: float или double. Ответ на этот вопрос зависит от точности чисел, с которыми вы работаете, и от их величины.

В последнем операторе NSLog значение переменной берется со знаком «ми-нус» с помощью унарного (одноместного) оператора. Унарный (unary) оператор применяется к одному значению — в отличие от бинарного оператора, который применяется к двум значениям. Знак «минус» как бинарный оператор приме-няется для вычитания одного значения из другого, а как унарный оператор — для изменения знака значения.

Унарные операторы «минус» и «плюс» имеют более высокий приоритет, чем все остальные арифметические операторы. Таким образом, следующее выра-жение дает результат умножения -а на Ь: с = -а * Ь;

В таблице из приложения В приводится сводка операторов с их приоритета-ми. Оператор остатка от деления

Последний арифметический оператор, представленный в этой главе — это опе-ратор остатка от деления, который указывается знаком процента (%). Чтобы определить, как работает этот оператор, рассмотрим программу 4.4. // Оператор остатка от деления #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int a = 25, b = 5, c = 10, d = 7; NSLog (@"а %% b = %i",

а % b); NSLog (@"а %% с = %i", а % с); NSLog (@"а %% d = %i", а % d); NSLog (@"а / d * d + а %% d = %i", a / d * d + a % d); [pool drain]; return 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). Это показано в первой строке вывода программы.

Поделиться с друзьями: