Арифметические операторы очень просты (Kd-R 2.5), но надо не забывать о следующем правиле: "целочисленное деление усекает дробную часть".

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

int i ~ З;
float f z i/2; //Осторожно! Не 1.5

Для того чтобы получить значение 1.5, следует записать i/2. О или (float) i/2. Целочисленные операторы инкрементации и декрементации (K&R 2.8), ++ и --, работают по-разному в зависимости от того, предшествуют ли они переменной или располагаются за ней. Выражение ++i заменяет значение i величиной, на 1 большей ее текущего значения, а затем использует это новое значение. Выражение i ++ использует текущее значение i, а затем заменяет его величиной, на 1 большей текущего значения. Это одна из привлекательнейших возможностей С.

Язык программирования С также предоставляет программисту побитовые операторы (K&R 2.9), такие как побитовое "И"(&) и побитовое "ИЛИ" (1); эти операторы работают с отдельными битами, составляющими целые числа. Обычно чаще требуется оператор побитового "Или·: поскольку интерфейс API каркаса Сосоа часто использует биты для одновременного указания нескольких вариантов выбора или настроек. Например, при указании, как именно UIView должен быть анимирован, можно передать аргумент, значение которого взято из перечисления UIViewAnimationOptions, определение которого начинается следующим образом:

 

typedef NS_OPTIONS(NSUinteger, UIViewAnimationOptions)
UIViewAnimation0ptionLayoutSubviews 1 << О,
UIViewAnimation0ptionAllowUserinteraction 1 << 1,
UIViewAnimation0ptionBeginFromCurrentState 1 << 2,
UIViewAnimation0ptionRepeat 1 << З,
UIViewAnimation0ptionAutoreverse 1 << 4,
//...
};
 

Символы <<представляют собой оператор сдвига влево; правый операнд при этом указывает, на какое количество битов должен быть выполнен сдвиг левого операнда. В предположении, что NSUinteger состоит из 8 бит (это не так, но для простоты и краткости примем это предположение), это перечисление означает, что определены следующие пары имя-значение (значения показаны в двоичной системе счисления):

UIViewAnimationOptionLayoutSuЬviews 00000001
UIViewAnimationOptionAllowUserinteraction 00000010
UIViewAnimationOptionBeginFromCurrentState 00000100
UIViewAnimationOptionRepeat 00001000
UIViewAnimationOptionAutoreverse 00010000

Причиной для такого представления на основе значений битов является то, что эти значения могут быть объединены в одно значение (битовой маски), которое вы передаете для задания параметров анимации. Каркас Сосоа может понять ваши намерения, выясняя, какие биты в переданном вами значении равны 1. Так, например, значение 00011000 будет означать, что вами выбраны значения UIViewAnimationOptionRepeat и UIViewAnimationOptio nAutoreverse (и что все остальные, естественно, являются не выбранными).

Вопрос теперь в том, как создать эту битовую маску 00011000, чтобы передать ее в качестве аргумента. Это можно сделать чисто математически, так как двоичное значение 00011000 равно десятичному 24, и просто присвоить это значение аргументу. Но это не очень хорошая мысль, так как такой метод делает код запутанным, а при его написании очень легко ошибиться. Лучше вместо этого воспользоваться оператором побитового "ИЛИ" для объединения необходимых значений:

(UIViewAnimationOptionRepeat 1 UIViewAnimationOptionAutoreverse)
 

Эта запись корректно работает, потому что оператор побитового "ИЛИ" объединяет свои операнды, устанавливая в результате те биты, которые установлены хотя бы в одном операнде, так что 00001000 1 00010000 равно 00011000, именно тому значению, которое мы и хотели получить. (А каким образом во время работы программы выясняется, какие именно биты маски установлены? С помощью оператора побитового "И':)

Простое присваивание (K&R 2.10) выполняется с помощью знака равенства. Однако в дополнение к нему имеются операторы составного присваивания, которые объединяют присваивание с некоторой другой операцией. Например,

height *= 2; 11 То же, что и height - height * 2;
<

Тернарный оператор (?) представляет собой способ указать одно из двух значений в зависимости от условия (K&R 2.11). Схема применения этого оператора имеет вид (условие) ? выражение1: выражение2

Если условие истинно (в следующем разделе вы узнаете, что это значит), вычисляется выражение! и используется полученный результат; в противном случае вычисляется выражение2 и используется полученный результат. Например, можно использовать тернарный оператор при присваивании следующим образом:

myVariaЫe - (условие)? Выражение1: Выражение2;

Что именно будет присвоено переменной myVariaЬle, зависит от истинности условия. С помощью этого оператора нельзя сделать что-то, что невозможно достичь с помощью более многословного управления потоком выполнения, но тернарный оператор обладает исключительной ясностью, и потому я предпочитаю именно его.


 

 

 

Добавить комментарий


Защитный код
Обновить