Программирование на 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 и с), и сохранение результата в а. Сначала выполняется сложение, поскольку оператор сложения имеет более высокий приоритет, чем оператор присваивания. Все операторы, кроме точкой, имеют более высокий приоритет, чем операторы присваивания, которые имеют одинаковый приоритет.
Полное собрание стихотворений
Поэзия:
поэзия
рейтинг книги
Книга 16. Каббалистический форум (старое издание)
Научно-образовательная:
прочая научная литература
религиоведение
рейтинг книги