数据类型、 运算符和表达式在任何的计算机语言中都比较重要的,
在面向对象的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
int main (int argc, const charchar * 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表示;
• long long int可以指定更加宽泛的整数类型, 保证变量至少64位宽度。
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, 代表的字符与编译器有关, 一般也作为无符合整数使用。
## 布尔类型和枚举类型
Objective-C还有两种数据类型是以int类型在计算机内部存储的, 它们是: 布尔类型和枚举类型。
•布尔类型是_Bool(别名 BOOL), 取值范围1或0,
其中1可以用TRUE和YES表示, 0可以用 FALSE和NO表示。
•枚举类型,如果需要定义一组相关常量, 可以采用枚举类型, 把这些常量定义成一个类型,
例如游戏在上、 下、 左、 右方向,
可以枚举类型:
enum direction {up,down,left,right};
其中up从0开始, down是1, 依次类推加1
枚举类型实例:
~~~
#import
int main (int argc, const charchar * 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的枚举类型,
函数scanf("%i ", &aweek) 是C中标准函数库, 用于从终端读取键盘输入, %i 是指定接收的类型,
&aweek是传递aweek的地址给函数, 便于接收键盘输入内容。
## 数据类型转换
按照数据类型占用存储不同可以自动类型转换或强制类型转换,
总的原则是小存储容量数据类型可以自动转换成为大存储容量数据类型。
不同类型数据间按照下面关系的从左到右(从低到高) 自动转换:
_Bool 、 char、 short int、 枚举类型 -> int ->long int->long long-> float -> double -> long double。
类型转换先后顺序表:
![](https://box.kancloud.cn/2015-12-31_5684a3f019751.jpg)
数据类型转换举例:
如果有表示式f * i + l /s, 其中, f是float类型, i 为int类型, l
为long int 类型, s为short int类型, 结果是什么类型?
答案:运行结果为float类型,
这是因为f是float其它的操作数与float运算其结果就是float类型。
## 强制类型转换
如果遵守类型转换是右到左情况, 就需要强制类型转换了,
强制类型转换语法形式上很简单, 就是在数据前面加上(目标类型) ,
但是这种转换是存在风险的, 有可能造成数据的丢失, 需要谨慎进行。
例如:
~~~
long int l = 6666666666;
NSLog(@"l = %li",l );
int i = (int)l;
NSLog(@"i = %i",i );
~~~
运行结果:
~~~
l = 6666666666
i = -1923267926
~~~
~~~
int total = 3446;
int n = 6;
float average = total / n;
~~~
运行结果:
`average结果是574`
~~~
int total = 3446;
int n = 6;
float average = (float) total / n;
~~~
运行结果:
~~~
average结果是574.333
~~~
### 常量与变量
在Objective-C中,任何数字、单个字符和字符串通常都称为常量。
完全由常量值组成的表达式叫常量表达式。
Objective-C中声明常量使用关键字const:
•const double PI = 3.141592654;
Objective-C中变量可以分为成员变量、 局部变量和全局变量。
举例如下:
~~~
int gCounter;
@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位双字
### int 类型
如果整型值的第一位是0,那么这个整数将用八进制表示,在NSlog调用的格式符号:
%o 显示的八进制值不带有前导0
%#o 显示的八进制值带有前导0
如果整型常量以0x或0X开头,那么这个整数将用十六进制表示,在NSlog调用的格式符号:
%x 显示不带前导0x,并用a-f之间的小写字符表示十六进制
%#x 显示带前导0x,并用a-f之间的小写字符表示十六进制
%X 显示不带前导0x,并用a-f之间的小写字符表示十六进制
%#X 显示带前导0x,并用a-f之间的小写字符表示十六进制
### float 类型
显示浮点值,用NSlog转换字符 %f
用科学计数法显示浮点值,用NSlog转换字符 %e
%g 充许NSlog确定使用常用的浮点计数显示还是使用科学计数法显示浮点值。(如果该值小于-4或大于5,采用%e科学计数法表示;否则采用%f浮点计数法显示)