Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

Если один из операндов имеет тип long int, второй операнд преобразуется в long int, результат имеет такой же тип.

Если мы дошли до этого шага, то оба операнда имеют тип int, результат имеет такой же тип.

Это упрощенная версия шагов преобразования операндов в выражении. Правила усложняются, если включены операнды без знака (unsigned). Полный список правил см. в Приложении В.

Из этой последовательности шагов понятно, что если достигнут шаг, где говорится «результат имеет такой же тип», процесс преобразования закончен.

В качестве примера рассмотрим, в каком порядке выполняется оценка следующего выражения. В нем f имеет тип float, i — тип int, I — long int, s — переменная типа short int. f * i + I / s

1 В главе 13 кратко описывается тип bit field.

Рассмотрим сначала умножение f на i, то есть умножение переменной типа float на переменную типа int. Из шага 3 известно, что поскольку f имеет тип float, второй операнд (i) будет тоже преобразован в тип float, и такой же тип будет иметь результат операции умножения.

Затем I делится на s, то есть выполняется деление переменной типа long int на short int. Из шага 4 известно, что short int преобразуется в int. Переходим к шагу 6. Поскольку один из операндов (1) имеет тип long int, второй операнд преобразуется в long int, и результат будет иметь такой же тип. Таким образом, это деление дает значение типа long int, причем дробная часть отбрасывается.

И, наконец, шаг 3 указывает, что поскольку один из операндов выражения имеет тип float (как результат умножения f * i), второй операнд будет преобразован в тип float, и результат будет иметь такой же тип. Таким образом, после деления I на s результат операции будет преобразован в тип float и затем прибавлен к произведению f на i. Поэтому конечный результат этого выражения будет иметь тип float.

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

Например, если вы не хотите, чтобы при делении I на s в предыдущем выражении отбрасывалась дробная часть, то можете выполнить приведение одного из этих операндов к типу float, чтобы выполнить деление с плавающей точкой: f * i + (float) I / s

В этом выражении I будет преобразована в тип float до операции деления, поскольку оператор приведения типа имеет более высокий приоритет, чем оператор деления. Поскольку один из операндов деления будет теперь иметь тип float, другие операнды будут автоматически преобразованы в тип float, и такой же тип будет иметь результат. Расширение для знака

Если переменная типа signed int или signed short преобразуется в тип int или тип большего размера, то в результате преобразования слева тоже появляется описатель signed. Поэтому переменная типа short int, которая имеет значение -5, будет иметь значение -5 после преобразования в long int. Но если целая переменная с описателем unsigned преобразуется в тип int или тип большего размера, то расширение для знака не происходит (как и можно было ожидать).

На некоторых машинах (например, с процессорами Intel, которые используются в современных семействах компьютеров Macintosh, или с процессорами ARM, которые используются в iPhone и iTouch) символы интерпретируются как значения со знаком. Это означает, что если символ (character) преобразуется в целый тип, то происходит расширение для знака. Если используются символы из стандартного набора символов ASCII, это не создает проблем. Но если значение символа не является частью этого стандартного набора символов, для его знака может быть выполнено расширение, если символ преобразуется в целый тип. Например, на компьютерах Мае символьная константа '\377’ преобразуется в значение -1, потому что это значение является отрицательным, если рассматривать его как 8-битное значение со знаком (signed).

Objective-C позволяет объявлять символьные переменны е без знака (unsigned), что позволяет избежать этой потенциальной проблемы — переменная unsigned char не получает расширения для знака при преобразовании в целый тип; ее значение всегда больше или равно нулю. Для обычного 8-битного символа символьная переменная со знаком имеет диапазон значений от -128 до +127 включительно. Символьная переменная без знака имеет диапазон значений от О до 255 включительно.

Если ваши символьные переменные должны получать расширение для знака, вы можете объявить такие переменные с типом signed char. В главе 15 вы узнаете о многобайтных символах Unicode. Это предпочтительный способ работы со строками. Упражнения

Используя класс Rectangle из главы 8, добавьте метод-инициализатор в соответствии со следующим объявлением.
– (Rectangle *) initWithWidth: (int) w: andHeight: (int) h;

С учетом того, что мы назвали метод, разработанный в упражнении 1, назначенным (designated) инициализатором для класса Rectangle, и основываясь на определениях классов Square и Rectangle из главы 8, добавьте методинициализатор в класс Square в соответствии со следующим объявлением.
– (Square *) initWithSide: (int) side;

Добавьте счетчик (counter) к методу add: класса Fraction, чтобы вычислять количество вызовов этого метода. Каким образом вы можете считывать значение этого счетчика?

Используя typedef и перечислимые типы данных, определите тип с именем Day (День) с возможными значениями Sunday, Monday, Tuesday, Wednesday, Thursday, Friday и Saturday (Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница и Суббота).

Используя typedef, определите тип с именем FractionObj, который позволяет писать следующие операторы. FractionObj И = [[Fraction alloc] init], f2 = [[Fraction alloc] init];

  • Читать дальше
  • 1
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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