ObjectiveC2.0程序设计第4章数据类型和表达式

上传人:re****.1 文档编号:569845731 上传时间:2024-07-31 格式:PPT 页数:56 大小:688KB
返回 下载 相关 举报
ObjectiveC2.0程序设计第4章数据类型和表达式_第1页
第1页 / 共56页
ObjectiveC2.0程序设计第4章数据类型和表达式_第2页
第2页 / 共56页
ObjectiveC2.0程序设计第4章数据类型和表达式_第3页
第3页 / 共56页
ObjectiveC2.0程序设计第4章数据类型和表达式_第4页
第4页 / 共56页
ObjectiveC2.0程序设计第4章数据类型和表达式_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《ObjectiveC2.0程序设计第4章数据类型和表达式》由会员分享,可在线阅读,更多相关《ObjectiveC2.0程序设计第4章数据类型和表达式(56页珍藏版)》请在金锄头文库上搜索。

1、Objective-C-2.0Objective-C-2.0程序设程序设计计- -第第4 4章章- -数据类型和表数据类型和表达式达式武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式赋值运算符赋值运算符4.3计算器类计算器类4.4算数表达式算数表达式4.2数据类型和常量数据类型和常量4.1位运算符位运算符4.5类型:类型:_Bool、_Complex和和_Imaginary4.6武汉大学国际软件学院Objective-C 2.0程序设计4.1 数据类型和常量数据类型和常量 Objective-C提供4中基本数据类型:int、float、do

2、uble和char。声明为int类型的变量只能用于保存整型值,也就是没有小数位的值。声明为float类型的变量可存储浮点数(即包含小数位的值)。double类型和float类型一样,只不过前者的精度约是后者精度的两倍而已。最后,char类型可存储单个字符,例如字符a,数字字符6或者一个分号。 在Objective-C中,任何数字,单个字符或者字符串通常都称为常量。例如,数字58表示一个常量整数值,字符串“Programming in Objective-C is fun. n”表示一个常量字符串对象。完全由常量组成的表达式叫做常量表达式。因此,表达式 128+7-17是一个常量表达式,因为该表

3、达式的每一项都是一个常量值。 然而,如果将i声明为整型变量,那么表达式 128+7-i就不是一个常量表达式了。武汉大学国际软件学院Objective-C 2.0程序设计4.1.1 int类型类型 在Objective-C中,整数常量由一个或多个数字的序列组成。序列前的负号表示该值是一个负数。值158、-10、0都是合法的整数常量。数字中间不允许长如空格,大于999的值不能用逗号表示(因此,值12,000是一个非法的整数常量,它必须写成12000)。 Objective-C中,存在两种特殊的格式,它们用一种非十进制的方式来表示整数常量。如果整型值的第一位是0,那么这个整数将用八进制计数法来表示。

4、在这种情况下,该值的其余位必须是合法的八进制数字,那必须是0到7之间的数字。 如果整型常量以0和字母x(无论是大写还是小写字母)开头,那么这个值都将用十六进制计数法来表示。紧跟在字母x后的是十六进制值的数字,它可由0到9之间的数字和a到f(或A到F)之间的字母组成。字母表示的数字分别为10到15.武汉大学国际软件学院Objective-C 2.0程序设计4.1.1 int类型类型 每个值,不管是字符,整数还是浮点数,都有与其对应的值域。这个值域与存储特定类型的值而分配的内存量有关。一般来说,在语言中没有规定这个量,它通常依赖所运行的计算机,因此叫做设备或机器相关量。例如,一个整数可在计算机上占

5、用32位,或者可以使用64位存储。 永远不要编写假定数据类型大小的程序。然而,要保证为每种基本数据类型留出最小数量的内存。例如,要保证整型值存储在32位中。然而这一点不能保证。武汉大学国际软件学院Objective-C 2.0程序设计4.1.2 float类型类型 声明为float类型的变量可存储包含小数位的值。要区分浮点常量,可通过查看其是否包含小数点。可以省略小数点之前的数字,也可以省略之后的数字,然而,显然不能全部省略。值3. 、125.8及-.0001都是合法的浮点常量。 浮点常量也能使用所谓的科学计数法。值1.7e4就是使用这种计数法来表示浮点值。位于字母e前的值称为尾数,而之后的值

6、称为指数。指数前面可以放置正号或负号。指数表示将与尾数相乘的10的幂。用于分割尾数和指数的字母e,可大写也可小写。 要用科学计数法显示值,应该在NSLog格式字符串中指定格式字符%e。使用NSlog格式字符串%g允许NSlog确定使用常用的浮点计数法还是使用科学计数法来显示浮点值。这一决定取决于指数的值:如果该值小于-4或大于5,采用%e(科学计数法)表示,否则采用%f(浮点计数法)。 十六进制的浮点常量包含前导的0x或0X,后面紧跟一个或多个十进制或十六进制数字,再后是p或P,最后是可以带符号的二进制指数。武汉大学国际软件学院Objective-C 2.0程序设计4.1.3 double类型

7、类型 类型double与类型float非常相似,而在float变量所提供的值域不能满足要求时,就要使用double变量。声明为double类型的变量可存储的位数大概是float变量所存储的两倍多。大多数计算机用64位来存储double变量。 除非另有说明,否则Objective-C编译器将所有的浮点常量均看做double值。要清楚地表示float常量,需要在数字的尾部添加一个f或F。 要显示double值,可用格式符号%f、%e或%g,它们与显示float值所用的格式符号是相同的。武汉大学国际软件学院Objective-C 2.0程序设计4.1.4 char类型类型 char变量可存储单个字符

8、。将字符放入一对单引号中就能得到字符常量。因此a,;和0都是合法的字符常量。第一个常量表示字母a,第二个表示分号,第三个表示字符0,它并不等同于数字0。不要把字符常量和C风格的字符串混为一谈,字符常量是放在单引号中的单个字符,而字符串则是放在双引号中的任意个数的字符。如上一章提及,前面有字符并且放在双引号中的字符串是NSString字符串对象。 字符常量n(即换行符)是一个合法的字符常量。出现这种情况的原因是反斜杠符号是Objective-C系统中的特殊符号,实际上并不把它看成一个字符。换句话说,Objective-C编译器将字符n看做单个字符,尽管它实际上由两个字符组成。其他的特殊字符由反斜

9、杠字符开头。武汉大学国际软件学院Objective-C 2.0程序设计4.1.4 char类型类型 代码清单4-1中,使用了基本的Objective-C数据类型。 代码清单4-1-#import int main (int argc, char *argv)autoreleasepoolint integerVar = 100;float floatingVar = 331.79;double doubleVar = 8.44e+11;char charVar = W;NSLog (”integerVar = %i”, integerVar);NSLog (”floatingVar = %f”

10、, floatingVar);NSLog (”doubleVar = %e”, doubleVar);NSLog (”doubleVar = %g”, doubleVar);NSLog (”charVar = %c”, charVar);return 0;武汉大学国际软件学院Objective-C 2.0程序设计4.1.4 char类型类型 代码清单4-1 输出:integerVar = 100floatingVar = 331.790009doubleVar = 8.440000e+11doubleVar = 8.44e+11charVar = W 在程序输出的第二行,指派给floating

11、Var的值是331.79,实际显示成了331.790009. 事实上,实际显示的值是由使用的特定计算机系统决定的。出现这种不准确的原因是:计算机内部使用特殊方式表示数字。在计算机内存中不能精确的表示一些浮点值。武汉大学国际软件学院Objective-C 2.0程序设计4.1.5 限定词:限定词:long、long long 如果直接把限定词long放在int之前,那么所声明的整型变量在某些计算机上具有扩展的值域。一个long int声明的例子为: long int factorial; 这条语句将变量factorial声明为long的整型变量。就像float和double变量一样,long变量

12、的具体进度也是有具体计算机系统决定的。在许多系统上,int与long int具有相同的值域,而且任何一个都能存储32位宽的整型值。 long int类型的常量值可通过在整型常量末尾添加字母L来形成。但数字和L之间不允许有空格。 long int numberOfPoints=131071100L;将变量numberOfPoints声明为long int类型。 武汉大学国际软件学院Objective-C 2.0程序设计4.1.5 限定词:限定词:long、long long 要用NSLog显示long int的值,使用字母l作为修饰符并放在整型格式符号i,o和x之前。这意味着格式符号%li用十进

13、制格式显示long int值,符号%lo用八进制显示值,而符号%lx用十六进制格式显示值。可如下使用long long的整型数据类型: long long int maxAllowedStorage; 这条语句把将指定的变量声明为具有特定扩展进度的变量,该扩展精度保证变量至少具有64位的宽度。NSLog字符串不使用单个字母l,而使用两个l来显示long long的整数,例如“%lli”。 同样可将long标识符放在double声明之前: long double US_deficit_2004; long double常量可写成其尾部带有字母l或的浮点常量。 要显示long double的值,需

14、要使用修饰符L。因此,%Lf用浮点计数法显示long double的值,%Le用科学计数法显示同样的值,而%Lg将告诉NSlog在%Lf和%Le之间任选一个。武汉大学国际软件学院Objective-C 2.0程序设计4.1.5 限定词:限定词:long、long long 把限定词short放在int声明之前时,它告诉Objective-C编译器要声明的特定变量用来存储相当小的整数。之所以使用short变量,主要原因是对节约内存空间的考虑。 在某些计算机上,short int占用的内存空间是常规int变量所占空间的一半。在任何情况下,分配给short int的空间数量不少于16位。 在Obje

15、ctive-C中,没有其他方法可以显示的编写short int型常量。要显示short int变量,可将字母h放在任何普通的整型转换符号之前,如%hi,%ho或%hx。武汉大学国际软件学院Objective-C 2.0程序设计4.1.5 限定词:限定词:long、long long 最终限定词可放在int变量之前,当整数变量只用来存储正数的情况下使用最终限定符: unsigned int counter;向编译器声明:变量counter只用于保存正值。 通过将字母u(或U)放在常量之后,可产生unsigned int常量。 0x00ffU 编写整型常量时,可将字母u(或)和(或L)组合起来使用

16、: 20000UL告诉编译器将常量20000看做unsigned long。 如果整型常量之后不带有字母u,U,l或L中的任何一个,而且它太大以至于不适合用普通大小的int表示,那么编译器将把它看做unsigned int值。如果它太小以至于不适合用unsigned int表示,那么编译器会把它看做long int。如果仍然不合适用long int表示,编译器就会把它看做unsigned long int。 将变量声明为long int,short int或unsigned int时,关键字int可省略。 同样可以讲char变量声明为unsigned。不过已超出本书的讨论范围。武汉大学国际软件

17、学院Objective-C 2.0程序设计4.1.6 id类型类型 id类型可以存储任何类型的对象。从某种意义说,它是一般对象类型。例如,程序行 id number;将number声明为id类型的变量,可声明方法使其具有id类型的返回值 -(id)newObject:(:(int)type;这个程序行声明了一个名为newObject的实例方法,它具有名为type的单个整型参数并有id类型的返回值。 应该注意,对返回值和参数类型声明来说,id是默认的类型。因此,一下程序行 +allocInit;声明了一个返回id类型值的类方法。武汉大学国际软件学院Objective-C 2.0程序设计4.1.6

18、 id类型类型 表4-1 基本数据类型类型类型常量实例常量实例NSlog字符字符chara, n%cshort int%hi, %hx, %hounsigned short int%hu, %hx, %hoint12, -97, 0xFFE0, 0177%i, %x, %ounsigned int12u, 100U, 0XFFu%u, %x, %olong int12L, -2001, 0xffffL%li, %lx, %lounsigned long int12UL, 100ul, 0xffeeUL%lu, %lx, %lolong long int0xe5e5e5e5LL, 500ll%l

19、li, %llx, &llounsigned long long int12ull, 0xffeeULL%llu, %llx, %llofloat12.34f, 3.1e-5f, 0x1.5p10, 0x1P-1%f, %e, %g, %adouble12.34, 3.1e-5, 0x.1p3%f, %e, %g, %along double12.341, 3.1e-5l%Lf, $Le, %Lgidnil%p武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式赋值运算符赋值运算符4.3计算器类计算器类4.4数据类型和常量数据类型和常量4.1位

20、运算符位运算符4.5类型:类型:_Bool、_Complex和和_Imaginary4.6算术表达式算术表达式4.2武汉大学国际软件学院Objective-C 2.0程序设计4.2.1 运算符的优先级运算符的优先级 Objective-C中的每一个运算符都有与之相关的优先级。该优先级用于确定拥有多个运算符的表达式如何求值:优先级较高的运算符首先求值。如果表达式包含优先级相同的运算符,可按照从左到右或从右到左的方向来求值,具体按照哪个方向求值取决于运算符。 代码清单4-2说明了加法,减法,乘法和除法运算,在程序中执行的最后两个运算引入了一个运算符比另一个运算符有更高的优先级的概念。武汉大学国际软

21、件学院Objective-C 2.0程序设计4.2.1 运算符的优先级运算符的优先级 代码清单4-2-/ Illustrate the use of various arithmetic operators#import int main (int argc, char *argv)autoreleasepoolint a = 100;int b = 2;int c = 25;int d = 4;int result;result = a - b; /subtractionNSLog (”a - b = %i”, result);result = b * c; /multiplicationN

22、SLog (”b * c = %i”, result);result = a / c; /divisionNSLog (”a / c = %i”, result);result = a + b * c; /precedenceNSLog (”a + b * c = %i”, result);NSLog (”a * b + c * d = %i”, a * b + c * d);return 0;对NSLog指定表达式作为参数时,无需将该表达式的结果先指派给一个变量。武汉大学国际软件学院Objective-C 2.0程序设计4.2.1 运算符的优先级运算符的优先级 代码清单4-2 输出a - b

23、 = 98b * c = 50a / c = 4a + b * c = 150a * b + c * d = 300 表达式: a+b*c不会尝试结果2550(102*25);相反,相应的NSLog语句显示的结果为150.这是因为Objective-C与其他大多数程序设计语言一样,对于表达式中多重运算或项的顺序有自己的规则。因此,Objective-C认为表达式a+b*c等价于a+(b*c)。 如果要改变表达式中项的计算顺序,可使用圆括号。表达式 (a+b)*c的值将是2550。圆括号也是可以嵌套的,在这种情况下,表达式的计算要从最里面的一对圆括号一次向外。只要确保结束括号与开始括号数目相等即

24、可。武汉大学国际软件学院Objective-C 2.0程序设计4.2.2 整数运算和一元负号运算符整数运算和一元负号运算符 代码清单4-3引入了整数运算的概念。 代码清单4-3-/ More arithmetic expressions#import int main (int argc, char *argv)autoreleasepoolint a = 25;int b = 2;int result;float c = 25.0;float d = 2.0;NSLog (”6 + a / 5 * b = %i”, 6 + a / 5 * b);NSLog (”a / b * b = %i”

25、, a / b * b);NSLog (”c / d * d = %f”, c / d * d);NSLog (”-a = %i”, -a);return 0;6 + a / 5 * b = 16a / b * b = 24c / d * d = 25.000000-a = -25武汉大学国际软件学院Objective-C 2.0程序设计4.2.2 整数运算和一元负号运算符整数运算和一元负号运算符 迄今出现的每个程序中,每个运算符前后都有空格。这种做法不是必须的,仅仅是出于美观上的考虑。一般来说,在允许单个空格的任何位置都可以插入额外的空格。如果能使程序更容易阅读,敲击空格的做做是值得的。 在

26、代码清单4-3中,第一个NSLog调用中的表达式巩固了运算符优先级的概念。 NSLog (”6 + a / 5 * b = %i”, 6 + a / 5 * b); 在第二条NSLog语句引入了一个新误区。在输出中显示的24,而不是25.那是因为这个表达式采用整数运算来求值。 NSLog (”a / b * b = %i”, a / b * b); 变量a和b的声明都是int类型的。当包含两个整数表达式求值时,Objective-C系统都将使用整数运算来执行这个操作。在这种情况下,数字的所有小数部分将丢失。因此,计算a除以b时,得到的中间结果是12而不是期望的12.5.这个中间结果乘以2就是最

27、终结果24. 在第三条NSLog语句中,如果用浮点值来替代整数来执行相同的运算就会获得期望的结果。武汉大学国际软件学院Objective-C 2.0程序设计4.2.2 整数运算和一元负号运算符整数运算和一元负号运算符 决定使用float变化还是int变量应该基于变量的使用目的。如果无需任何小数位,可用整型变量。这将使程序更加高效的执行。另一方面,如果需要精确到小数位,那么选择应该很清楚。唯一必须回答的问题是使用float还是double。这取决为使用数据所需要的精度和他们的量级。 在最后一条NSLog语句中,使用了一元负号运算符对变量的值求反。这个一元运算符用于单个值的运算符,而二元运算符作用

28、于两个值。负号实际上扮演了一个双重角色,作为二元运算符,它执行两个数相减的操作;作为一元运算符,它对一个值求反。 与其他运算符相比,一元负号运算符具有更高的优先级。因此,表达式 c=-a*b将执行-a乘以b。武汉大学国际软件学院Objective-C 2.0程序设计4.2.3 模运算符模运算符 模运算符由百分号(%)表示,它的功能是第一个值除以第二个值所得的余数。 代码清单4-4-/ The modulus operator#import int main (int argc, char *argv)autoreleasepoolint a = 25, b = 5, c = 10, d = 7

29、;NSLog (”a % b = %i”, a % b);NSLog (”a % c = %i”, a % c);NSLog (”a % d = %i”, a % d);NSLog (”a / d * d + a % d = %i”, a / d * d + a % d);return 0;a % b = 0a % c = 5a % d = 4a / d * d + a % d = 25武汉大学国际软件学院Objective-C 2.0程序设计4.2.3 模运算符模运算符 在前面,NSLog使用百分号之后的字符来确定如何输出下一个参数。然而,如果它后面紧跟另一个百分号,那么NSLog例程认为你

30、其实想显示百分号,并在程序输出的适当位置插入一个百分号。 在第一条NSLog语句中,25除以5所得的余数是0,所以显示的求模的结果是0。 在第二条NSLog语句中,25除以10所得的余数是5,所以显示的求模的结果是5。 Objective-C使用整数运算来执行来个整数间的任何运算。因此两个整数相除所产生的任何余数将被完全丢弃。一般来说,表达式: a/b*b+a%b的值始终与a相等(假定a和b的值都是整数)。事实上,定义的模运算只用于处理整数。 就优先级而言,模运算的优先级与乘法和除法的优先级相等。武汉大学国际软件学院Objective-C 2.0程序设计4.2.4 整型值和浮点值的相互转换整型

31、值和浮点值的相互转换 代码清单4-5-/ Basic conversions in Objective-C#import int main (int argc, char *argv)autoreleasepoolfloat f1 = 123.125, f2;int i1, i2 = -150;i1 = f1; / floating to integer conversionNSLog (”%f assigned to an int produces %i”, f1, i1);f1 = i2; / integer to floating conversionNSLog (”%i assigne

32、d to a float produces %f”, i2, f1);f1 = i2 / 100; / integer divided by integerNSLog (”%i divided by 100 produces %f”, i2, f1);f2 = i2 / 100.0; / integer divided by a floatNSLog (”%i divided by 100.0 produces %f”, i2, f2);f2 = (float) i2 / 100; / type cast operatorNSLog (”(float) %i divided by 100 pr

33、oduces %f”, i2, f2);return 0;武汉大学国际软件学院Objective-C 2.0程序设计4.2.4 整型值和浮点值的相互转换整型值和浮点值的相互转换 在Objective-C中,只要将浮点值赋值给整型变量,数字的小数部分都会被删节。因此, i1 = f1; / floating to integer conversionNSLog (”%f assigned to an int produces %i”, f1, i1); 把f1赋值给i1时,数字123.125将被删节。输出结果为 123.125000 assigned to an int produces 123

34、只有整数部分被储存到i1中。 将整型变量指派给浮点变量的操作不会引起数字值的任何变化,该值仅由系统转换并存储到浮点变量中。 f1 = i2; / integer to floating conversionNSLog (”%i assigned to a float produces %f”, i2, f1);把i1的值赋给f1时,输出结果为: -150 assigned to a float produces -150.000000武汉大学国际软件学院Objective-C 2.0程序设计4.2.4 整型值和浮点值的相互转换整型值和浮点值的相互转换 在程序代码 f1 = i2 / 100;

35、/ integer divided by integerNSLog (”%i divided by 100 produces %f”, i2, f1);中,除法运算的两个运算数都是整数,因此除法运算的中间结果是整型,而将整型的值赋值给f1,即是将整型转换为浮点值的运算。所以结果为: -150 divided by 100 produces -1.000000 在代码清单4-5的最后两个算法中,涉及到整数与浮点值的相除。在Objective-C中,任何处理两个值的运算如果其中一个值是浮点变量或浮点常量,那么这一运算将作为浮点运算来处理。所以最后两个算法的结果是相同的: -150 divided

36、by 100.0 produces -1.500000 (float) -150 divided by 100 produces -1.500000武汉大学国际软件学院Objective-C 2.0程序设计4.2.5 类型专函运算符类型专函运算符 在声明和定义方法是,将类型放入圆括号中来声明返回值和参数的类型。在表达式中,将类型放在圆括号中,表示类型转换。 代码清单4-5中的最后一个运算: f2=(float)i2 / 100中的放入圆括号中float就是一个类型转换。 为了求表达式的值,类型转换运算符将变量i2的值转换为浮点数。该运算符不会影响变量i2的值;它是一个一元运算符。(float)

37、i2的值是浮点值,但i2 的值还是整数,类型转换运算符并没有改变变量本身的值,它相当于一个中间变量。 类型转换运算符比所有算数运算符的优先级都高,但一元减号和一元加号运算符除外。武汉大学国际软件学院Objective-C 2.0程序设计4.2.5 类型专函运算符类型专函运算符表达式 (int)29.55 + (int)21.99在Objective-C中等价于29+21。因为将浮点值转换为整数的后果就是舍弃其中的浮点值。表达式 (float)6 / (float)4得到的结果为1.5,与表达式 (float)6 / 4的结果相同。类型转换运算符通常用于将一般id类型的对象转换为特定类的对象:

38、id myNumber; Fraction *myFraction; . myFraction = (Fraction *) myNumber;将id变量myNumber的值转换成一个Fraction对象。武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式算数表达式算数表达式4.2计算器类计算器类4.4数据类型和常量数据类型和常量4.1位运算符位运算符4.5类型:类型:_Bool、_Complex和和_Imaginary4.6赋值运算符赋值运算符4.3武汉大学国际软件学院Objective-C 2.0程序设计4.3 赋值运算符赋值运算符 Ob

39、jective-C语言允许使用以下一般格式将算术运算符和赋值运算符合并到一起: op=在这个格式中,op是任何算术运算符,包括+、-、*、/、%。此外,op还可以是任何用于移位和屏蔽操作的位运算符。 考虑下面语句: count+=10; 通常所说的“加号等号”运算符(+=),将运算符右侧的表达式和左侧的表达式相加,再将结果保存到运算符左边的变量中。因此,上面的语句与下面的语句等价: count=count+10; 考虑下面语句: a /=b+c 无论等号右侧出现什么样的表达式,都将右侧表达式的结果算出来后,再用a除。因为等号的优先级比加号要低。事实上,除逗号运算符外的运算符都比赋值运算符的优先

40、级高。因此,上面的语句等价于: a=a/(b+c)武汉大学国际软件学院Objective-C 2.0程序设计4.3 赋值运算符赋值运算符 使用赋值运算符的动机有3个:首先,程序语句更容易书写,因为运算符左侧的部分没有必要在右侧重写。其次,结果表达式通常容易阅读。再次,这些运算符的使用可使程序的运行速度更快,因为编译器有时在计算表达式时能够产生更少的代码。武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式算数表达式算数表达式4.2数据类型和常量数据类型和常量4.1位运算符位运算符4.5类型:类型:_Bool、_Complex和和_Imagina

41、ry4.6计算器类计算器类4.4赋值运算符赋值运算符4.3武汉大学国际软件学院Objective-C 2.0程序设计4.4 计算计算器类器类 现在定义一个新类。创建一个Calculator类,它是一个简单的四则运算计算器,可用来进行加,减,乘,除运算。类似于常见的计算器,这种计算器必须能够记录累加的结果,获知通常所说的累加器。因此,方法必须能够执行以下操作:将累加器设置为特定值,将其清空(或设置为0),以及在完成时检索它的值。 代码清单4-6定义这个新类。武汉大学国际软件学院Objective-C 2.0程序设计4.4 计算计算器类器类 代码清单4-6-/ Implement a Calcul

42、ator class#import interface Calculator: NSObject double accumulator;/ accumulator methods-(void) setAccumulator: (double) value;-(void) clear;-(double) accumulator;/ arithmetic methods-(void) add: (double) value;-(void) subtract: (double) value;-(void) multiply: (double) value;-(void) divide: (doubl

43、e) value;end武汉大学国际软件学院Objective-C 2.0程序设计4.4 计算计算器类器类implementation Calculator-(void) setAccumulator: (double) valueaccumulator = value;-(void) clearaccumulator = 0;-(double) accumulatorreturn accumulator;-(void) add: (double) valueaccumulator += value;-(void) subtract: (double) valueaccumulator -=

44、value;-(void) multiply: (double) valueaccumulator *= value;-(void) divide: (double) valueaccumulator /= value;end武汉大学国际软件学院Objective-C 2.0程序设计4.4 计算机类计算机类 int main (int argc, char *argv)autoreleasepoolCalculator *deskCalc;deskCalc = Calculator alloc init;deskCalc clear;deskCalc setAccumulator: 100.0

45、;deskCalc add: 200.;deskCalc divide: 15.0;deskCalc subtract: 10.0;deskCalc multiply: 5;NSLog (”The result is %g”, deskCalc accumulator);return 0;输出:The result is 50武汉大学国际软件学院Objective-C 2.0程序设计4.4 计算机类计算机类 Calculator类只有一个实例变量,以及一个用于保存累加器值的double变量。方法定义的本事非常直观。 注意调用multiple方法的消息: deskCalc multiply: 5

46、; 该方法的参数是一个整数,而它期望的参数却是double类型。因为方法的数值参数会自动转换以匹配期望的类型,所以不会出现任何问题。因此调用该函数时,整数5将自动转换成双精度浮点值。 即使自动转换过程会自己进行,然而在调用时提供正确的参数类型仍是一个较好的程序设计习惯。 武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式算数表达式算数表达式4.2数据类型和常量数据类型和常量4.1计算器类计算器类4.4类型:类型:_Bool、_Complex和和_Imaginary4.6赋值运算符赋值运算符4.3位运算符位运算符4.5武汉大学国际软件学院Obj

47、ective-C 2.0程序设计4.5 位运算符位运算符 Objective-C语言中有各种各样的运算符可处理数字中的特定位。 表4-2 位运算符 符号符号运算运算&按位与|按位或按位异或一次求反向右位移表4-2中列出的所有运算符,除一次求反运算外,都是二元运算符。位运算符可以处理任何类型的整型值,但不能处理浮点值。武汉大学国际软件学院Objective-C 2.0程序设计4.5.1 按位与运算符按位与运算符 对两个值执行与运算时,会逐位比较两个值的二进制表示。第一个值与第二个值对应位都为1时,在结果的对应位上就是1,否则为0. 按位与的真值表 b1b2b1 & b2000010100111武

48、汉大学国际软件学院Objective-C 2.0程序设计4.5.1 按位与运算符按位与运算符 如果w1和w2都定义为short int,w1等于十六进制的15,w2等于十六进制的0c,那么以下C语句会将值0x04指派给w3: w3=w1&w2; 将w1和w2都表示为二进制后可更清楚地看到此过程:w1 0000 0000 0001 0101 0x15w2 0000 0000 0000 1100 & 0x0c-w3 0000 0000 0000 0100 0x04 按位与运算经常用于屏蔽运算。语句:w3=w1&3;它的作用是只保留w1二进制表示的最左边的两位,并赋值给w3. 与Objective-

49、C中使用的所有二元运算符相同,通过添加等号,二元运算符可同样用作赋值运算符: word &=15;武汉大学国际软件学院Objective-C 2.0程序设计4.5.2 按位或运算符按位或运算符 在Objective-C中对两个值执行按位或运算时,会逐位比较两个值的二进制表示。只要第一个值或者第二个值的相应为是1,那么结果位的对应位就是1。 按位或的真值表b1b2b1|b2000011101111武汉大学国际软件学院Objective-C 2.0程序设计4.5.2 按位或运算符按位或运算符 如果w1是short int,等于十六进制的19,w2也是short int,等于十六进制的6a,那么对w

50、1和w2执行按位或会得到十六进制的7b:w1 0000 0000 0001 1001 0x19w2 0000 0000 0110 1010 | 0x6a-w30000 0000 0111 1011 0x7b 按位或操作通常称为按位OR,用于将某个词的特定为设置为1。例如:w1 = w1 | 07;将w1最右边的三位设为1,其它位不变。 当然可以在语句中使用特殊的赋值运算符: w1 |= 07;武汉大学国际软件学院Objective-C 2.0程序设计4.5.3 按位异或运算符按位异或运算符 按位异或运算符,通常称为XOR运算符,遵守以下规则:对于两个运算数的相应位,如果两个值相同,那么结果的对

51、应位是0,如果两个对应位的值不相同,那么结果的对应位是1。 按位异或的真值表b1b2b1 b2000011101110武汉大学国际软件学院Objective-C 2.0程序设计4.5.3 按位异或运算符按位异或运算符 如果w1和w2分别等于十六进制的5e和d6,那么w1和w2执行异或运算后的结果是十六进制的e8:w1 0000 0000 0101 1110 0x5ew2 0000 0000 1011 0110 0xd6-0000 0000 1110 1000 0xe8武汉大学国际软件学院Objective-C 2.0程序设计4.5.4 一次求反运算符一次求反运算符 一次求反运算符是一元运算符,

52、它的作用仅是对运算数的位“翻转”。将运算数的每个是1的位翻转为0,是0的位翻转为1. 一次求反的真值表b1b10110武汉大学国际软件学院Objective-C 2.0程序设计4.5.4 一次求反运算符一次求反运算符 如果w1是short int,16位长,等于十六进制的a52f,那么对该值执行一次求反运算会得到十六进制的5ab0:w1 1010 0101 0010 1111 0xa52fw1 0101 1010 1101 0000 0x5ab0 如果不知道运算中数值的准确位大小,那么一次求反运算非常有用。例如,要将类型为int的w1的最低位设置为0,可将另一个所有位都是1,只有最右边的位是0

53、的int值与w1进行按位与运算。 语句: w1 &= 1:可以达到以上的要求。因为这条语句会对1求反,然后在左侧会加上足够的1,以满足int的大小要求(如果是在32位机器上,会在左侧加上31个1)。 现在显示一个实际的程序,说明各种位运算符的用途。武汉大学国际软件学院Objective-C 2.0程序设计4.5.4 一次求反运算符一次求反运算符 代码清单4-7-/ Bitwise operators illustrated#import int main (int argc, char *argv)autoreleasepoolunsigned int w1 = 0xA0A0A0A0, w2

54、= 0xFFFF0000, w3 = 0x00007777;NSLog (”%x %x %x”, w1 & w2, w1 | w2, w1 w2);NSLog (”%x %x %x”, w1, w2, w3);NSLog (”%x %x %x”, w1 w1, w1 & w2, w1 | w2 | w3);NSLog (”%x %x”, w1 | w2 & w3, w1 | w2 & w3);NSLog (”%x %x”, (w1 & w2), (w1 | w2);return 0;a0a00000 ffffa0a0 5f5fa0a05f5f5f5f ffff ffff88880 a0a0 f

55、ffff7f7a0a0a0a0 ffffa0a0ffffa0a0 a0a00000武汉大学国际软件学院Objective-C 2.0程序设计4.5.4 一次求反运算符一次求反运算符 在第四个NSLog调用中,需要注意的一点,即按位与运算符的优先级要高于按位或运算符。这会实际影响表达式的最终结果。 在第五个NSLog调用中展示了DeMorgan的规则:(a&b)等于a|b,(a|b)等于a&b。武汉大学国际软件学院Objective-C 2.0程序设计4.5.5 向左位移运算符向左位移运算符 对值执行向左位移运算时,值中包含的位将向左移动。与该操作关联的是该值要移动的位置(或位)的数目。超出数据

56、项的高位将丢失,而低位将移入的值总为0. 因此,如果w1等于3,那么:w1 =w11;可同样表示为w1 =1;结果就是3向左移动一位。w1 . 0000 0011 0x03w1 1 . 0000 0110 0x06 运算符左侧的运算数表示将要移动的值,而右侧的运算数表示该值所需要移动的位数。如果将w1再向左移动一次,那么会得到:w1 . 0000 0110 0x06w1 )把值的位向右移动。从值的低位(右边)移出的位将丢失,把无符号的值向右移动总是左侧(高位)移入0。对于有符号的值而言,左侧移入1还是0取决于被移动数字的符号,还取决于该操作在计算机上的实现方式。如果符号位是0(表示正值),不管

57、哪种机器都将移入0。然而,如果符号位是1,那么在一些计算机上将移入1,而其他的将移入0。 如果w1是unsigned int,用32为表示,并且是十六进制的f777ee22,那么使用语句:w1=1;将w1右移移位,w1等于十六进制的7bbbf711:w1 1111 0111 0111 0111 1110 1110 0010 0010 0xF777EE22w1 1 0111 1011 1011 1011 1111 0111 0001 0001 0x7BBBF711 应该注意到,如果试图用大于或等于该数据项的位数的值将该值左移或右移,Objective-C并不会产生规定的结果。例如计算机用32位表

58、示整数,那么把一个整数向左或向右移动32位或更多时,并不会产生规定的结果。还注意到,如果使用负数对值移动,也不会产生规定的结果。武汉大学国际软件学院Objective-C 2.0程序设计第第4章章 数据类型和表达式数据类型和表达式算数表达式算数表达式4.2数据类型和常量数据类型和常量4.1位运算符位运算符4.5计算器类计算器类4.4赋值运算符赋值运算符4.3类型:类型:_Bool,_Complex和和_Imaginary4.6武汉大学国际软件学院Objective-C 2.0程序设计4.6 类型:_Bool、_Complex. 在本章结束前,还将讨论这门语言中的其他3中类型:用于处理Boolean(即0或1)值的_Bool;以及分别用于处理复数和抽象数字的_Complex和_Imaginary。 Objective-C程序员倾向于在程序中使用BOOL类型代替_Bool来处理Boolean值。这种“数据类型”本身实际上并不是真正的数据类型,它事实上只是char数据类型的别名。这是通过使用该语言的特殊关键字typedof实现的。结束结束

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号