Программирование на Objective-C 2.0
Шрифт:
будет вычисляться как а = (Ь = 0);
в результате чего переменным а и b будет присвоено значение 0. В случае выра-жения x[i] + ++i
не определено, в каком порядке компилятор будет выполнять оценку, — начиная с левой части оператора «плюс» или начиная с правой части. В данном случае порядок вычислений влияет на результат, поскольку значение i может быть увеличено до того, как будет вычисляться x[i],
В этом выражении порядок вычислений также не определен: x[i] = ++i
В этой ситуации не определено, когда значение i будет использовано как индекс для х, — до приращения i или после приращения.
Порядок
или в выражении с сообщением [myFract setTo: i over: ++i];
возможно, что сначала будет выполнено приращение i, в результате чего функ-ции или методу будут переданы два одинаковых значения.
Язык Objectivc-C гарантирует, что операторы && и || будут вычисляться слева направо. Поэтому в случае && гарантируется, что второй операнд нс будет оцениваться, если первый равен 0; в случае || гарантируется, что второй операнд не будет оцениваться, если первый не равен 0. Этот факт необходимо учитывать при формировании таких выражений, как if ( dataFlag || [myData checkData])
поскольку в этом случае checkData вызывается, только если значение dataFlag равно 0. Еще один пример. Если в определении объект-массив а содержит п элементов, то оператор, который начинается с if (index >= 0 && index < n && ([a objectAtlndex: index] == 0))
является ссылкой на элемент этого массива, только если index является допустимым индексом в этом массиве. Константные выражения
Константное выражение — это выражение, каждый из членов которого является константным значением. Константные выражения необходимы в следующих ситуациях.
Как значение после case в операторе switch.
Для указания размера массива.
Чтобы присвоить значение идентификатору перечисления.
Чтобы указать размер битового поля в определении структуры.
Чтобы присвоить начальные значения внешним или статическим переменным.
Чтобы задать начальные значения для глобальных переменных.
Как выражение после #if в препроцессорном операторе #if. В первых четырех случаях константное выражение должно состоять из це-лых констант, символьных констант, перечисляемых констант и выражений sizeof. Могут использоваться только арифметические операторы, побитовые операторы, операторы отношения, оператор с условным выражением и опера-тор приведения тина (cast).
В пятом и шестом случаях помимо вышеперечисленных правил может ис-пользоваться явно или неявно адресный оператор. Однако он может приме-няться только к внешним или статическим переменным или функциям. На-пример, выражение &х+ 10
будет допустимым константным выражением, если х является внешней или статической переменной. Кроме того, выражение &а[10] - 5
янляется допустимым константным выражением, если а является внешним или статическим массивом. И, наконец, поскольку &а[0] эквивалентно выражению а + sizeof (char) * 100
оно тоже является допустимым константным выражением.
В последней ситуации, где необходимо константное выражение (после #if), применяются такие же правила, как для первых четырех случаев, за исключе-нием того, что не могут использоваться оператор sizeof, константы перечисления и оператор приведения типа (cast). Однако разрешается
специальный определенный оператор (см. раздел «Директива if»). Арифметические операторыПри условии, что а, b выражения любого базового типа данных за исключением void; i, j выражения любого целого типа данных
выражение -а изменяет знак а на противоположный; +а дает значение а; а + b выполняет сложение а и b; а - b выполняет вычитание b из а; а * b выполняет умножение а на b; а / b выполняет деление а на b; i % j дает остаток от деления i на j.
В каждом выражении выполняются обычные арифметические преобразо-вания над операндами (см. ниже раздел «Преобразование базовых типов дан-ных»), Если а — переменная без знака (unsigned), то для вычисления -а сначала выполняется целочисленное расширение, выполняется вычитание из большего значения расширенного типа и к результату добавляется 1.
При делении двух целых значений выполняется усечение результата. Если один из операндов меньше нуля, то направление усечения не определено (то есть -3/2 может дать на некоторых машинах -1 и -2 на других); в противном случае усечение всегда выполняется в сторону 0(3/2 всегда дает 1). Сводку арифметических операций с указателями см. в разделе «Базовые операции с указателями». Логические операторы
При условии, что а, b выражения любого базового типа данных за исключением void или оба операнда являются указателями;
выражение а && b имеет значение 1, если а и Ь не равны нулю, и значение 0 в противном случае (Ь оценивается только в том случае, если а отлично от нуля); а || b имеет значение 1, если а или b не равно нулю, и значение 0 в противном случае (Ь оценивается только в том случае, если а отлично от нуля); ! а имеет значение 1, если а равно 0, и значение 0 в противном случае.
К а и b применяются обычные арифметические преобразования (см. ниже раздел «Преобразование базовых типов данных»). Во всех случаях результат имеет тип int. Операторы отношения
При условии, что а, Ь выражения любого базового типа данных за исключением void или оба операнда являются указателями;
выражение а < b имеет значение 1, если а меньше Ь, и значение 0 в противном случае; а <= b имеет значение 1, если а меньше или равно Ь, и значение 0 в противном случае; а > Ь имеет значение 1, если а больше Ь, и значение 0 в противном случае; а >= b имеет значение 1, если а больше или равно Ь, и значение 0 в противном случае; а != b имеет значение 1, если а не равно Ь, и значение 0 в противном случае.
К а и b применяются обычные арифметические преобразования (см. ниже раздел «Преобразование базовых типов данных»). Первые четыре оператора отношения имеют смысл для указателей, только если они указывают на один и тот же массив либо на компоненты одной структуры или объединения. Во всех случаях результат имеет тип int. Побитовые операторы
При условии, что i, j, п выражения любого целого типа данных;
выражение i & j выполняет побитовую операци ю AN D с i и j; i | j выполняет побитовую операцию OR с i и j; i А j выполняет побитовую операцию XOR с i и j; ~i получает дополнение до нуля для i; i << n выполняет сдвиг i влево на n бит; i >> n выполняет сдвиг i вправо на n бит.