Литье типа Objective-C
Приведение типов - это способ преобразования переменной из одного типа данных в другой тип данных. Например, если вы хотите сохранить длинное значение в простом целочисленном, вы можете ввести cast long в int. Вы можете преобразовывать значения из одного типа в другой явно, используяcast operator следующим образом -
(type_name) expression
В Objective-C мы обычно используем CGFloat для выполнения операции с плавающей запятой, которая является производным от базового типа float в случае 32-битной версии и double в случае 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
Здесь следует отметить, что оператор приведения имеет приоритет над делением, поэтому значение sum сначала преобразуется в тип double и, наконец, он делится на количество, что дает двойное значение.
Преобразование типов может быть неявным, что выполняется компилятором автоматически, или может быть указано явно с помощью cast operator. Хорошей практикой программирования считается использование оператора приведения всякий раз, когда требуется преобразование типов.
Целочисленное продвижение
Целочисленное продвижение - это процесс, при котором значения целочисленного типа "меньше", чем 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
Здесь значение суммы равно 116, потому что компилятор выполняет целочисленное продвижение и преобразовывает значение 'c' в ascii перед выполнением фактической операции сложения.
Обычное арифметическое преобразование
В usual arithmetic conversionsнеявно выполняются для приведения своих значений к общему типу. Компилятор сначала выполняет целочисленное продвижение , если операнды по-прежнему имеют разные типы, они преобразуются в тип, который отображается наивысшим в следующей иерархии:
Обычные арифметические преобразования не выполняются ни для операторов присваивания, ни для логических операторов && и ||. Давайте возьмем следующий пример, чтобы понять концепцию -
#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 преобразуется в целое число, но поскольку конечное значение имеет значение с плавающей запятой, применяется обычное арифметическое преобразование, и компилятор преобразует i и c в число с плавающей запятой и складывает их, получая результат с плавающей запятой.