Программирование на Objective-C 2.0
Шрифт:
Общий формат switch (выражение) { case константа1: программный оператор программный оператор ... break; case кон стан та_2: программный оператор программный оператор ... break; case константап; программный оператор программный оператор ... break; default: программный оператор программный оператор ... break; } Выполняется вычисление и сравнение выражения со значениями константных выражений константа_1, константа_2, константап. Если значение выражения совпадает с одним из этих case-значений, то выполняются последующие про-граммные операторы. Если ни одно из case-значений не совпадает со значением выражения, то
Результат вычисления выражения должен быть целого типа, и никакие два варианта case не должны иметь одинаковое значение. Отсутствие оператора break в определенном case-варианте вызывает продолжение выполнения в следующем case-варианте. Оператор while
Общий формат while (выражение) программныйОператор
Если значение выражения не равно нулю, выполняется программныйОператор. Поскольку выражение вычисляется каждый раз перед тем, как выполняется прог-раммныйОператор, этот оператор может никогда не выполняться. Обработка исключений
Для обработки исключений во время выполнения нужно включить операторы, которые могут генерировать исключение, в блок @try, который имеет общий формат @try программныйОператор 1 @catch (исключение) программныйОператор 2 @catch (исключение) ... @finally программныйОператор n
Если исключение выдает программныйОператор 1, то проверяются (по поряд-ку) последующие блоки @catch на совпадение соответствующего исключения с выданным исключением. Если да, то будет выполнен соответствующий программ-ныйОператор. Независимо от факта выдачи и перехвата исключения будет вы-полнен блок @finally (если он задан). Препроцессор
Препроцессор анализирует исходный файл до того, как компилятор рассмотрит сам код. Препроцессор выполняет следующие действия.
Он заменяет триграммы (группы из трех последовательных символов) на их эквиваленты (см. выше раздел «Составные операторы»).
Он объединяет в одну с троку любые строки, которые заканчиваются обратным слешем (\).
Он разделяет программу на поток маркеров.
Он удаляет комментарии, заменяя их одним пробелом.
Он обрабатывает мрепроцессорные директивы (см. ниже раздел «Директивы препроцессора») и раскрывает макросы. Последовательности из триграмм
Для обработки наборов символов, не соответствующих ASCII, используются следующие трехсимвольные последовательности (триграммы), которые распоз-наются и обрабатываются специальным образом там, где они находятся в про-грамме (а также внутри символьных строк). Триграмма Значение ??= # ??( [ ??) ] ??< { ??> } ??/ \ ??’ ^ ??! | ??- ~ Директивы препроцессора
Все директивы препроцессора начинаются с символа #, когорый должен быть первым символом в строке, отличным от пробела. После # могут следовать один или несколько символов «пробел» или tab. Директива #define Формат 1 #define имя текст
Определяется имя идентификатора для препроцессора, это имя связывается с текстом, который начинается после первого пробела, следующего за именем, и заканчивается концом строки. При последующем использовании имени в программе оно заменяется текстом. Формат 2 #define имя (парам_ 1, парам_2,..., парам_п) текст
Определяется макрос имя, принимающий аргументы парам1, парам_2, ..., парамп, каждый
из которых является идентификатором. При последующем ис-пользовании имени в программе со списком аргументов происходит подстановка текста, причем аргументы вызова этого макроса заменяют все экземпляры соответствующих параметров внутри текста.Если макрос принимает переменное число параметров, то в конце списка аргументов используются три точки. Остальные аргументы в списке обозначаются специальным идентификатором VA_ARGS. Например, ниже определяется макрос с именем myPrintf, принимающий переменное число аргументов. #define myPrintf(...) printf ("DEBUG:" _VA_ARGSJ;
Этот макрос можно использовать, например, в форме myPrintf ("Hello world!\n"); или myPrintf ("i = %i, j = %i\n", i, j);
Если для определения требуется более чем одна строка, то для продолжения каждой строки ее нужно заканчивать символом обратного слеша. После опре-деления имени его можно использовать в любом месте данного файла.
В директивах «define, которые принимают аргументы, можно использовать оператор #, после которого следует имя аргумента. Препроцессор помещает в кавычки фактическое значение, передаваемое макросу при его вызове, то есть значение превращается в символьную строку. Например, определение #define printint(x) printf (# х "= %d\n", х)
при вызове printint (count);
раскрывается препроцессором как printf ("count" "= %i\n", count); или эквивалентно как printf ("count = %i\n", count);
Препроцессор помещает символ \ перед любой кавычкой или символами \ при выполнении этой операции преобразования в строку. Например, в случае определения #define str(x) # х вызов sir (The string ,r\t"contains a tab)
раскрывается следующим образом "The string \"\\t\"contains a tab"
В директивах «define, принимающих аргументы, допускается также оператор ##. Перед ним (или после него) ставится имя аргумента для макроса. Препроцессор берет значение, передаваемое при вызове макроса, и создает один маркер из этого аргумента и из маркера, который следует за ## (или предшествует ##). Например, в случае определения макроса #define printx(n) print! ("%i\n", x «# n );
вызов printx (5)
дает printf ("%i\n", x5);
Определение #define printx(n) printf ("x"« n "= %i\n", x ## n );
при вызове printx(1O)
дает printf ("xIO = %i\n", xIO);
после подстановки и конкатенации символьных строк.
Вокруг операторов « и #« можно не ставить пробелы. Директива #error Общий формат #error текст ...
Указанный текст записывается препроцессором как сообщение об ошибке. Директива #if Формат 1 #if константное^выражение «endif
Вычисляется константное выражение. Если результат не равен нулю, то обрабаты-ваются все строки программы до директивы «endif; в противном случае они ав-томатически пропускаются и не обрабатываются препроцессором или компи-лятором. Формат 2 #if константное_выражение_1 ... #elif константное_выражение_2 ... #elif константноевыражениеп ... #else ... #endif
Если константное выражение^ не равно нулю, то обрабатываются все строки программы до #elif, а остальные строки до «endif пропускаются. В противном случае, если константное_выражение_2не равно нулю, то обрабатываются все строки программы до следующей директивы #elif, а остальные строки до «endif про-пускаются. Если все константные выражения равны нулю, то обрабатываются строки после «else (если включена эта директива).