Шрифт:
Вывод программы 13.5 The gcd of 150 and 35 is 5 (Наибольший общий делитель 150 и 35 равен 5) The gcd of 1026 and 405 is 27 The gcd of 83 and 240 is 1
Функция ged принимает два целых аргумента. Данная функция имеет доступ к этим аргументам через имена формальных параметров и и V. После объявления переменной temp типа int программа выводит на терминал значения аргументов и и v вместе с соответствующим сообщением. Затем функция вычисляет и возвращает наибольший общий делитель этих двух целых чисел.
В строке result = gcd (150, 35);
происходит вызов функции gcd с аргументами 150 и 35 и сохранение значения, которое возвращает функция, в переменной result.
Если не указан тип возвращаемого значения функции, компилятор предпо-лагает, что функция возвращает целое значение (если она вообще возвращает значение). Многие программисты не указывают тип возвращаемого значения, если функция должна возвращать целые значения. Однако такой подход про-тиворечит практике надежного программирования. Компилятор предупредит, что для возвращаемого значения задан по умолчанию тип int, но это признак того, что вы делаете что-то неверно!
Тип по умолчанию для возвращаемого значения отличается от методов. Если для метода не указан тип возвращаемого значения, компилятор предполагает, что метод возвращает значение типа id. Но для метола тоже следует указывать тип возвращаемого значения. Объявление типов возвращаемых значений и типов аргументов
По умолчанию компилятор Objective-C предполагает тип int для возвращаемого значения. Точнее говоря, если вызывается функция, компилятор предполагает, что эта функция возвращает значение типа int, за исключением следующих случаев.
Эта функция определена в программе до того, как встретился вызов этой функции.
Значение, возвращаемое функцией, объявлено до того, как встретился вызов этой функции. Объявление типов возвращаемого значения и аргументов для функции называется объявлением прототипа (prototype).
Объявление функции используется не только для объявления типа возвра-щаемого значения функции, но также для того, чтобы указать компилятору, сколько аргументов и каких типов передавать функции. Это аналогично объяв-лению методов в секции @interface при объявлении нового класса.
Чтобы объявить absoluteValue как функцию, которая возвращает значение типа float и при и и мает один аргумент типа float, можно использовать следующее объявление прототипа. float absoluteValue (float);
Достаточно указать только тип аргумента в круглых скобках, но не его имя. Вы можете дополнительно указать после типа «фиктивное» имя, например, float absoluteValue (float х);
Это имя не обязательно должно совпадать с именем в определении функции (в любом случае, компиля тор его игнорирует).
Для надежности при объявлении прототипа скопируйте первую строку из фактического объявления функции. Не забудьте поставить в конце точку с за- пятой. Если функция принимает переменное число параметров (как в случае с NSLog и scant), об этом нужно информировать компилятор. Объявление void NSLog (NSString *format, ...);
указывает компилятору, что NSLog принимает объект типа NSString в качестве первого аргумента, после которого следует любое число дополнительных аргу-ментов. NSLog объявляется в специальном файле Foundation/Foundation.h , и поэтому в начале каждой программы мы помещаем строку #import <Foundation/Foundation.h>
Без этой строки компилятор может предполагать, что NSLog принимает фиксированное число аргументов, что может привести неверному генерируе-мому коду.
Компилятор автоматически преобразует числовые аргументы в соответствующие типы при вызове функции, если вы поместили определение функции или объявили функцию и ее ар1ументы до этого вызова.
Ниже приводятся некоторые сведения о функциях.
По умолчанию компилятор предполагает, что функция возвращает значение типа int.
Определяя функцию с возвращаемым значением типа int, определите ее та-ким же образом.
Определяя функцию, которая не возвращает никакого значения, определите ее с ключевым словом void.
Компилятор преобразует аргументы для согласования с аргументами, кото-рые ожидает функция, только если вы ранее определили или объявили эту функцию. Для надежности объявляйте все функции в своей программе, даже если они определены до их вызова. Лучше всего поместить объявления ваших функций в header-файл и затем просто импортировать этот файл в ваши модули.
Функции по умолчанию являются внешними (external). Область действия по умолчанию для функции устроена так, чтобы ее могли вызывать любые функции или методы, содержащиеся в любых файлах, которые связаны с этой функцией. Вы можете ограничить область действия функции, сделав ее статической. Для этого нужно поместить перед объявлением функции ключевое слово static, как показано ниже. static int ged (int u, int v) { ... }