Objective-C 类型转换


类型转换是将变量从一种数据类型转换为另一种数据类型的方法。例如,如果要将 long 值存储为简单整数,则可以键入cast long to int。您可以使用强制转换运算符将值从一种类型显式转换为另一种类型,如下所示 -

(type_name) expression

在 Objective-C 中,我们通常使用 CGFloat 进行浮点运算,它源自 32 位的 float 和 64 位的 double 基本类型。考虑以下示例,其中强制转换运算符导致一个整型变量除以另一个整型变量作为浮点运算执行 -

#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类型,最后除以 count 产生一个 double 值。

类型转换可以是隐式的,由编译器自动执行,也可以通过使用强制转换运算符显式指定。每当需要类型转换时,使用强制转换运算符被认为是良好的编程实践。

整数提升

整数提升是将比intunsigned int “小的”整数类型的值转换为intunsigned 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 被转换为整数,但因为最终值是浮点型,所以应用通常的算术转换,编译器将 i 和 c 转换为浮点型并将它们相加,产生浮点结果。