Приведение типов — это способ преобразования переменной из одного типа данных в другой тип данных. Например, если вы хотите сохранить длинное значение в простое целое число, вы можете набрать cast long для int. Вы можете явно преобразовать значения из одного типа в другой, используя оператор приведения, следующим образом:
(type_name) expression
В Objective-C мы обычно используем CGFloat для выполнения операции с плавающей запятой, которая получена из базового типа с плавающей запятой в случае 32-разрядного и двойного в случае 64-разрядного. Рассмотрим следующий пример, где оператор приведения заставляет деление одной целочисленной переменной на другую как операцию с плавающей запятой:
#import <Foundation/Foundation.h> int main() { int sum = 17, count = 5; CGFloat mean; mean = (CGFloat) sum / count; NSLog(@"Value of mean : %f\n", mean ); return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000
Здесь следует отметить, что оператор приведения имеет приоритет над делением, поэтому значение суммы сначала преобразуется в тип double и, наконец, оно делится на число, что приводит к двойному значению.
Преобразования типов могут быть неявными, которые выполняются компилятором автоматически, или они могут быть указаны явно с помощью оператора приведения . Хорошей практикой программирования считается использование оператора приведения, когда необходимо преобразование типа.
Целочисленное продвижение
Целочисленное продвижение — это процесс, при котором значения целочисленного типа «меньше», чем int или unsigned int , преобразуются либо в int, либо в unsigned int . Рассмотрим пример добавления символа в int —
#import <Foundation/Foundation.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; NSLog(@"Value of sum : %d\n", sum ); return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
2013-09-11 01:38:28.492 demo[980] Value of sum : 116
Здесь значение sum приходит как 116, потому что компилятор выполняет целочисленное продвижение и преобразует значение ‘c’ в ascii перед выполнением фактической операции сложения.
Обычное Арифметическое Преобразование
Обычные арифметические преобразования неявно выполняются для приведения их значений в общий тип. Компилятор сначала выполняет целочисленное продвижение , если операнды по-прежнему имеют разные типы, тогда они преобразуются в тип, который отображается наивысшим в следующей иерархии:
Обычные арифметические преобразования не выполняются ни для операторов присваивания, ни для логических операторов && и ||. Давайте возьмем следующий пример, чтобы понять концепцию —
#import <Foundation/Foundation.h> int main() { int i = 17; char c = 'c'; /* ascii value is 99 */ CGFloat sum; sum = i + c; NSLog(@"Value of sum : %f\n", sum ); return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000
Здесь легко понять, что первый c преобразуется в целое число, но поскольку конечное значение равно float, то применяется обычное арифметическое преобразование, и компилятор преобразует i и c в float и добавляет их, получая результат float.