数据类型和常量

你已经遇到过Objective-C的基本数据类型int。回顾一下,声明为int类型的变量只能用于保存整型值,也就是不包含小数位数的值。

Objective-C还提供了另外3种基本数据类型:floatdoublechar。声明为float类型的变量可以存储浮点数(即包含小数位数的值)。double类型和float类型一样,通常,前者表示的范围大约是后者的两倍。char数据类型可存储单个字符,例如字母a、数字字符6或者一个分号(后面将详细讨论有关内容)。

Objective-C中,任何数字、单个字符或者字符串通常都称为常量。例如,数字58表示一个常量整数值,字符串@"Programming in Objective-C is fun."表示一个常量字符串对象。完全由常量值组成的表达式叫做常量表达式。因此,下面的表达式是一个常量表达式,因为该表达式的每一项都是常量值:

128 + 7 - 17

然而,如果将i声明为整型变量,那么表达式就不是一个常量表达式:

128 + 7 – i

int类型

整数常量由一个或多个数字的序列组成。序列前的负号表示该值是一个负数。值158-100都是合法的整数常量。数字中间不允许插入空格,并且不能使用逗号(因此,12,000是一个非法的整数常量,它必须写成12000)。

每个值无论是字符、整数还是浮点数字,都有与其对应的值域。这个值域与系统为特定类型的值分配的内存量有关。一般来说,在语言中没有规定这个量,它通常依赖于所运行的计算机,因此,叫做设备或机器相关量。例如,一个整数可在计算机上占用32位,或者可以使用64位存储。如果使用64位存储,整型变量将能够存储比32位更大的数值。

 

注意

Mac OS X中,提供了选择应用程序是在32位还是64位下编译。在前一种情况下,一个int占用32位;在后一种情况下,一个int占用64位。

float类型

声明为float类型的变量可以存储包含小数位的值。要区分浮点常量,可以看它是否包含小数点。值3.125.8-.0001都是合法的浮点常量。要显示浮点值,可用NSLog转换字符%f或者%g

浮点常量也能用所谓的科学计数法来表示。值1.7e4就是使用这种计数法来表示的浮点值,它表示值1.7×104

如上所述,double类型与float类型非常相似,只是double类型的变量可存储的范围大概是float变量的两倍。

char类型

char变量可存储单个字符。将字符放入一对单引号中就能得到字符常量。因此,'a'';''0'都是合法的字符常量。第一个常量表示字母a,第二个表示分号,第三个表示字符0,它并不等同于数字0。不要把字符常量和C语言风格的字符串混为一谈,字符常量是放在单引号中的单个字符,而字符串则是放在双引号中的任意个数的字符。正如在第3章提及的,前面有@字符并且放在双引号中的字符串是NSString字符串对象。

字符常量'\n'(即换行符)是一个合法的字符常量,尽管它似乎与前面提到的规则矛盾。这是因为反斜杠符号被认为是特殊符号。换句话说,Objective-C编译器将字符'\n'看做单个字符,尽管它实际上由两个字符组成。其他特殊字符也是以反斜杠字符开头的。在NSLog调用中可以使用格式字符%c,以便显示char变量的值。

在代码清单4-1中,使用了基本的Objective-C数据类型。

代码清单4-1

#import <Foundation/Foundation.h>

 

int main (int argc, char *argv[])

{

   @autoreleasepool {

      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);

    }

    return 0;

}

 

代码清单4-1  输出

integerVar = 100

floatingVar = 331.790009

doubleVar = 8.440000e+11

doubleVar = 8.44e+11

charVar = W

 

在程序输出的第二行,你会注意到指定给floatingVar的值331.79,实际显示成了331.790009。事实上,实际显示的值是由具体使用的计算机系统决定的。出现这种不准确值的原因在于,计算机内部使用了特殊的方式表示数字。使用计算器处理数字时,很可能遇到相同的不准确性。如果用计算器计算1除以3,将得到结果.33333333,很可能结尾带有一些附加的3。这一串3是计算器计算1/3的近似值。理论上,应该存在无限个3。然而该计算器只能保存这些位的数字,这就是计算机的不确定性。同样的不确定性也出现在这里:在计算机内存中不能精确地表示一些浮点值。

限定词:longlong longshortunsignedsigned

如果直接把限定词long放在int声明之前,那么所声明的整型变量在某些计算机上具有扩展的值域。一个long int声明的例子为:

long int factorial;

这条语句将变量fractorial声明为long的整型变量。就像floatdouble变量一样,long变量的具体范围也是由具体的计算机系统决定的。

要用NSLog显示long int的值,就要使用字母l作为修饰符,放在整型格式符号之前。这意味着格式符号%li将用十进制格式显示long int的值。

你也可以使用long long int变量,甚至是具有更大范围带有浮点数的long double变量。

把限定词short放在int声明之前时,它告诉Objective-C编译器要声明的特定变量用来存储相当小的整数。之所以使用short变量,主要原因是对节约内存空间的考虑,当程序员需要大量内存而可用的内存量又十分有限时,就可用short变量来解决这个问题。

最后一个可以放在int变量之前的限定词,是在整数变量只用来存储正数的情况下使用的。以下语句

unsigned int counter;

向编译器声明,变量counter只用于保存正值。通过限制整型变量的使用,让它专门用于存储正整数,可以扩展整型变量的范围。

id类型

id数据类型可存储任何类型的对象。从某种意义说,它是一般对象类型。例如,程序行

id   graphicObject;

graphicObject声明为id类型的变量。可声明方法使其具有id类型的返回值,如下:

-(id) newObject: (int) type;

这个程序行声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。

id类型是本书经常使用的一种重要的数据类型。这里介绍该类型的目的是为了保持本书的完整性。id类型是Objective-C中十分重要的特性,它是多态和动态绑定的基础,这两个特性将在第9章“多态、动态类型和动态绑定”中详细讨论。

4.1总结了基本数据类型和限定词。

4.1  基础数据类型

   

   

NSLog字符

char

'a''\n'

%c

short int

%hi%hx%ho  

unsigned short int

%hu%hx%ho %hu%hx%ho

int

12-970xFFE00177

%i%x%o

unsigned int

12u100U0XFFu

%u%x%o

long int

12L-20010xffffL

%li%lx%lo

unsigned long int

12UL100ul0xffeeUL

%lu%lx%lo

long long int

0xe5e5e5e5LL500ll

%lli%llx&llo

unsigned long long int

12ull0xffeeULL

%llu%llx%llo

float

12.34f3.1e-5f0x1.5p100x1P-1

%f%e%g%a

double

12.343.1e-50x.1p3

%f%e%g%a

long double

12.34L3.1e-5l

%Lf$Le%Lg

id

nil

%p

 

注意

在表4.1中,在整型常量中以0开头表示常量是八进制(基数8)的,以0x开头或(0X)表示它是十六进制(基数16)的,数字0x.1p3表示十六进制浮点常量。不必担心这些格式,这里只是为了使表格完整进行的总结。此外,前缀fl(L)u(U)ll(LL)用来明确表示常量是floatlongunsignedlong long类型。

 

本文节选自《Objective-C 程序设计(4)

电子工业出版社出版

[]Stephen G. Kochan(斯蒂芬·G·科昌)著

林冀  范俊 朱奕欣译

 

猜你喜欢

转载自shangjin615.iteye.com/blog/1719993