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

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

Жанры

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

Вывод программы 4.2 a - b = 98 b * c = 50 a/c = 4 a + b * c = 150 a * b + c * d = 300

После объявления целых переменных a, b, с, d и result программа присваивает результат вычитания b из а переменной result и затем выводит ее значение с по-мощью вызова NSLog.

В следующей строке значение b умножается на значение с, и произведение сохраняется в переменной result: result = b * с;

Результат умножения выводится с помощью вызова NSLog. В следующей строке программы используется оператор деления и с помощью NSLog выводится результат деления а на с, то есть 100 на 25.

Попытка

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

Результат следующего выражения не равен 2550 (102 х 25); вместо этого NSLog выводит значение 150. а + b * с

Objective-C, как и большинство других языков программирования, выполняет несколькох операций над членами выражения по определенному порядку. Вычисление выражения обычно происходит слева направо, но операции умно-жения и деления имеют приоритет над операциями сложения и вычитания. Поэтому система вычисляет выражение а + b * с

следующим образом: а + (b * с)

Для изменения порядка вычисления членов внутри выражения можно ис-пользовать круглые скобки. Показанное выше выражение является допустимым выражением Objective-C. Следующую строку можно подставить в программу 4.2, чтобы получить те же результаты: result = а + (b * с);

Но переменной result будет присвоено значение 2550, если использовать следующее выражение: result = (а + b) * с;

Значение а (100) будет сложено со значением b (2) до умножения на с (25). Круглые скобки можно вкладывать друг в друга; выражение будет вычисляться, начиная с внутренних круглых скобок. Убедитесь, что число закрывающих скобок равно числу открывающих. В последней выполняемой строке программы 4.2 выражение передается как аргумент процедуре NSLog без присваивания этого выражения какой-либо переменной. Выражение а * b + с * d

вычисляется по описанным выше правилам как (а Ь) + (с 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; }

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

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Врубель

Коган Дора Зиновьевна
Жизнь в искусстве
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Врубель

Недотепа

Лукьяненко Сергей Васильевич
Фантастика:
фэнтези
5.80
рейтинг книги
Недотепа

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лейтенант. Назад в СССР. Книга 8. Часть 1

Гаусс Максим
8. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Назад в СССР. Книга 8. Часть 1

Я еще не барон

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

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.00
рейтинг книги
Шайтан Иван 6

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Чехов

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

Адвокат Империи 16

Карелин Сергей Витальевич
16. Адвокат империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Адвокат Империи 16

Наномашины, демоненок! Том 3

Новиков Николай Васильевич
3. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, демоненок! Том 3