首页 > 代码库 > Objective-C之成魔之路【3-数据类型】
Objective-C之成魔之路【3-数据类型】
重开发者的劳动成果,请勿转载
数据类型、 运算符和表达式在任何的计算机语言中都比较重要的,
在面向对象的Objective-C语言中, 除了常规的基本类型, 还有对象类型等。
运算符和表达式完全遵守C语言规范。
Objective-C数据类型可以分为:基本数据类型、 对象类型和id类型。
基本数据类型有: int、 float、 double和char类型。
对象类型就是类或协议所声明的指针类型, 例如:
NSAutoreleasePool * pool, 其中NSAutoreleasePool是一个类,
NSAutoreleasePool *是它指针类型。
id类型可以表示任何类型, 也就是说id可存储任何类型的对象。
一般只是表示对象类型, 不表示基本数据类型,从某种意义上说,它是一般对象类型。
所以刚才的变量pool也可以声明为id pool。
id类型是Objective-C中十分重要的特性,它是多态和动态绑定的基础。
基本数据类型
1、int类型
int类型代表整数, 它的十六进制表示方式: 0xFFED0D,
在使用 NSLog函数中格式化字符串使用 %i表示十进制的整数,
%o(字母o) 表示8进制整数, %#x表示十六进制整数。
NSLog(@"integerVar = %i", integerVar);
整数常量由一个或多个数字的序列组成。
它的取值范围是与设备相关的, 无法一概而论。
也就是要注意设备或机器相关量。即我们通常说的int是32位还是64位取决于CPU的总线宽度。
在Mac OS X中,提供了选择应用程序是在32位还是64位下编译。
在前一种情况下,一个int占用32位;在后一种情况下,一个int占用64位。
2、float类型
声明为float类型的变量可以存储包含小数位的值。
float类型代表单精度浮点数, 要表示float类型浮点数, 可以在数值后面加上f或F, 例如:13.5f。
float浮点数也可以用科学计数法表示, 例如: 1.7e4。
NSLog函数中格式化字符串: %f表示浮点数, %e表示科学计数法, %g表示浮点数。
float floatingVar = 3.141592; NSLog(@"floatingVar = %f", floatingVar);
这里的输出结果为floatingVar =3.141592
这说明实际显示的值是由具体使用的计算机系统决定的。
出现这种不准确值的原因在于,计算机内部使用了特殊的方式表示数字。
同样的不确定性也出现在:在计算机内存中不能精确地表示一些浮点值。
所以,我们在进行float或double的值比较时,一定要考虑这一点。
这也是为什么float值和0相等的比较需要写成下面表达式的原因:
if(x>0.000001&&x<-0.000001)
3、double类型
double类型代表双精度浮点数, 与float类型很相似, 占用的字节空间double类型大体上是float类型的两倍。
大多数计算机是用 64位表示double类型。
NSLog函数中格式化字符串, 与float的%f、 %e和 %g相同。
NSLog(@"doubleVar = %e", doubleVar);
4、char类型
char类型代表字符类型,char变量可存储单个字符。将字符放入一对单引号中就能得到字符常量。如:’a‘。
不要把字符常量和c语言风格的字符串混为一谈,字符常量是放在单引号中的字符,而字符串则是放在双引号中的任意个数的字符。
如果要表示一些特殊字符, 要使用转义字符“\” 。
字符常量’\n‘(即换行符)是一个合法的字符常量,尽管它似乎与前面提到的规则矛盾。
NSLog(@"charVar = %c", charVar);
下面举个例子来演示以上类型的使用:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int integerVar = 100; float floatingVar = 331.79; double doubleVar = 8.44e+11; char charVar = 'W'; NSLog(@"integerVar = %i", integerVar); NSLog(@"floatingVar = %f", floatingVar); NSLog(@"doubleVar = %e", doubleVar); NSLog(@"doubleVar = %g", doubleVar); NSLog(@"charVar = %c", charVar); [pool drain]; return 0; }
数据类型限定词
Obejctive-C中数据类型可以在int、 float、 double和char类
前面加上限定词, 限定词有: long、 long long、 short、
unsigned和signed, 这些限定词从而增强了基本类型。
? long int,
如果直接把限定词long放在int声明之前,那么所声明的整型变量在某些计算机上具有扩展的值域。
long变量的具体范围也是由计算机系统决定的。
在大部分计算机中代表32位整数, 在整数后面加L(或l) 表示,
例如: long int numberOfPoints =131071100L,
NSLog函数中格式化字符串使用 %li表示;
NSLog函数中格式化字符串使用 %lli表示;
? long double , 可以指定更加宽泛的double类型,
要显示这个可以在尾部使用 L(大小写) 表示, 1.234e+7L。
NSLog函数中格式化字符串使用 %Lf、 %Le和%Lg表示;
? short int用来指定存放相对小的整数, 节约内存,
一般是占用 int类型的一半。 大部分计算机是16位;
? unsigned int, 告诉编译器只是接受整数,
在数值之后放字母u(或U) 表示, 例如: 0x00ffU;
编写整数时候, 可以将字母u(或U) 和l(或L) 组合起来,
例如: 20000UL;
? signed char, 代表的字符与编译器有关, 一般也作为无符合整数使用。
?布尔类型是_Bool(别名 BOOL), 取值范围1或0,
?枚举类型,如果需要定义一组相关常量, 可以采用枚举类型, 把这些常量定义成一个类型,
其中up从0开始, down是1, 依次类推加1
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; enum week { Mon, Tue, Wed, Thu, Fri, Sat, Sun }; int days,aweek; //aweek = 0; NSLog(@"Enter week number : "); scanf("%i", &aweek); switch (aweek) { case Mon: break; case Tue: break; case Wed: break; case Thu: break; case Fri: break; case Sat: days = 5; break; case Sun: days = 6; break; default: NSLog(@"bad week number"); days = -1; } if (days !=0) { NSLog(@"Number of days is %i", days); } [pool drain]; return 0; }
其中定义了week的枚举类型,
不同类型数据间按照下面关系的从左到右(从低到高) 自动转换:
_Bool 、 char、 short int、 枚举类型 -> int ->long int->long long-> float -> double -> long double。
数据类型转换举例:
如果有表示式f * i + l /s, 其中, f是float类型, i 为int类型, l
为long int 类型, s为short int类型, 结果是什么类型?
答案:运行结果为float类型,
这是因为f是float其它的操作数与float运算其结果就是float类型。
NSLog(@"l = %li",l );
int i = (int)l;
NSLog(@"i = %i",i );
l = 6666666666
i = -1923267926
int n = 6;
float average = total / n;
运行结果:
int total = 3446;
int n = 6;
float average = (float) total / n;
运行结果:
在Objective-C中,任何数字、单个字符和字符串通常都称为常量。
完全由常量值组成的表达式叫常量表达式。
?const double PI = 3.141592654;
举例如下:
@interface MyObject : NSObject {
int counter;
}@end
@implementation MyObject
-(void) print {
int cter = 0;
NSLog(@"%i", cter );
}@end
gCounter:全局变量;
counter : 成员变量;
cter : 局部变量。
更多了解:
基本数据类型表:
类型 | 常量实例 | NSlog字符 |
Char | ‘a’,’/n’ | %c |
Short int | -- | %hi,%hx,%ho |
Unsigned short int | -- | %hu,%hx,%ho |
Int | 12,-97,0xFFE0,0177 | %i,%x,%o |
Unsigned int | 12u,100U,0xFFu | %u,%x,%o |
Long int | 12L,-200l,0xffffL | %li,%lx,%lo |
Unsigned long int | 12UL,100ul,0xffeeUL | %lu,%lx,%lo |
Long long int | 0xe5e5c5e5LL,500ll | %lli,%llx,%llo |
Unsigned long long int | 12ull,0xffeeULL | %llu,%llx,%llo |
Float | 12.34f,3.1e-5f, | %f,%e,%g,%a |
Double | 12.34,3.1e-5,0x.1p3 | %f,%e,%g,%a |
Long double | 12.34l,3.1e-5l | %Lf,%Le,%Lg |
id | nil | %p |
NSLog的定义
NSLog定义在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
基本上,NSLog很像printf,同样会在console中输出显示结果。
不同的是,传递进去的格式化字符是NSString的对象,而不是chat *这种字符串指针。
示例:
NSLog可以如下面的方法使用:
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
但是下面的写法是不行的:
int i = 12345;
NSLog( @"%@", i );
原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:
int i = 12345;
NSLog( @"%d", i );
NSLog格式:
NSLog的格式如下所示:
- %@
对象 - %d, %i 整数
- %u
无符整形 - %f
浮点/双字 - %x, %X 二进制整数
- %o
八进制整数 - %zu
size_t - %p
指针 - %e
浮点/双字 (科学计算) - %g
浮点/双字 - %s
C 字符串 - %.*s
Pascal字符串 - %c
字符 - %C
unichar - %lld
64位长整数(long long) - %llu
无符64位长整数 - %Lf
64位双字
Objective-C之成魔之路【3-数据类型】