Objective-C之数据类型和表达式

Objective-C的基本数据类型:int fioat double char id五种数据类型。

在Objective-C中,任何数字、单个字符或字符串通常被称为常量。

int:

int类型的变量只能用于保存整型值。

整数常量是由一个或者多个数字的序列组成。序列钱的负号表示该值是一个负数。158、-1和0都是合法的整数常量。

float:

float类型的变量可以存储包含小位数的值。要显示浮点数可用NSLog转换字符%f或者%g。

double:

和float类型非常相似,只是可存储范围是float变量的两倍。

char:

char变量可以存储单个字符,将字符放入一对单引号中就能得到字符常量。'0'、'a'、';'都是合法的字符常量。

字符常量是放在单引号中的单个字符,而字符串是放在双引号中的任意个数的字符。

字符常量' '是换行符。

id类型:

可存储任何类型的对象。

整数运算和一元负号运算符:

03 #import <Foundation/Foundation.h>
04 
05 int main (int argc, const char * argv[]) {
06     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
07 
08     int        a = 25;
09     int        b = 2;
10     float    c = 25.0;
11     float    d = 2.0;
12     
13     NSLog(@"6 + a / 5 * b = %i", 6 + a / 5 * b);
14     NSLog(@"a / b * b = %i", a / b * b);
15     NSLog(@"c / d * d = %f", c / d * d);
16     NSLog(@"-a = %i", -a);
17     
18     [pool drain];
19     return 0;
20 }
最终输出结果:

6 + a / 5 * b = 16

a / b * b = 24

c / d * d = 25.000000

-a = -25

 
大家可以看到第一个表达式,因为除法和乘法优先级大于加法它们优先计算后再加6得到结果16
 
第二条NSLog语句引入了一个新的误区。你希望a除以b再乘以b的操作返回a,也就是25,但结果确是24,难道计算机在某个地方迷失了方向?实际情况是因为这个表达式是采用整数运算来求值的。数字的小数部分在运算中丢失。因此计算a除以b,即25除以2时,得到的中间结果是12,而不是期望的12.5。这就是结果为什么最后是24的原因。
 
第三条,因为是浮点值运算,所以结果正常。
 
在最后一条中,使用了一元负号运算符对变量a的值求反。这个一元运算符是用于单个值的运算符,扮演的角色是对一个值求反。
 
关于优先级,与其他算术运算符相比,一元负号预算符具有更高的优先级

整型值和浮点值的相互转换

03 #import <Foundation/Foundation.h>
04 
05 int main (int argc, const char * argv[])
06 {
07     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
08     float    f1 = 123.125, f2;
09     int        i1, i2 = -150;
10     
11     i1 = f1;                // floating to integer conversion
12     NSLog(@"%f assigned to an int produces %i", f1, i1);
13     
14     f1 = i2;                // integer to floating conversion
15     NSLog(@"%i assigned to a float produces %f", i2, f1);
16     
17     f1 = i2 / 100;            //integer divided by integer
18     NSLog(@"%i divided by 100 produces %f", i2, f1);
19     
20     f2 = i2 / 100.0;        //integer divided by a float
21     NSLog(@"%i divided by 100.0 produces %f", i2, f2);
22     
23     f2 = (float) i2 / 100;    //type cast operator
24     NSLog(@"(float) %i divided by 100 produces %f", i2, f2);
25     
26     [pool drain];
27     return 0;
28 }
 
最终输出结果:
 

123.125000 assigned to an int produces 123

-150 assigned to a float produces -150.000000

-150 divided by 100 produces -1.000000

-150 divided by 100.0 produces -1.500000

(float) -150 divided by 100 produces -1.500000

 
在Objective-C中,只要将浮点值赋值给整型变量,数字的小数部分都会被删节。因此在范例11行,把f1的值指派给i1时,只有整数部分被存储到i1中。
 
范例14行,把整型变量指派给浮点变量的操作不会引起数字值的任何改变。
 
范例17行,由于是两个整数的运算,按照整数运算规则,结果的任何小数部分都将删除
 
范例20行,一个整数变量和一个浮点常量。在Objective-C中,任何处理两个值的运算如果其中一个值是浮点变量或常量,那么这个运算将做为浮点运算来处理。
 
最后一个除法运算,范例23行,我们看到如何在声明和定义方法时将类型放入圆括号中来声明返回值和参数的类型。为了求表达式值,类型转换运算符将变量i2的值转换成float类型。该运算符永远不会影响变量i2的值;它是一元运算符,行为和其他一元运算符一样。因此表达式-a永远不会影响a的值,表达式(float)a也不会影响a的值。
 
优先级上,类型转换运算符比所有算术运算符的优先级都高,但一元减号运算符除外。下面再举个类型转换运算符的例子:
 
(int) 29.55 + (int) 21.99
 
再Objective-C中等价于 29 + 21
 
类型转换运算符通常用于将一般id类型的对象转换成特定类的对象。例如:
 
id myNumber;
Fraction *myFraction;
  ...
myFraction = (Fraction *) myNumber;
 
将变量myNumber的值转换成一个Fraction对象。转换结果将指派给Fraction变量myFraction。
 
模运算符
模运算符是由百分号(%)表示。将通过分析范例4-4来确定这种运算符的工作方式:
 
01 // The Modulus Operator
02 
03 #import <Foundation/Foundation.h>
04 
05 int main (int argc, const char * argv[]) {
06     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
07     int a = 25, b = 5, c = 10, d = 7;
08     
09     NSLog(@"a %% b = %i", a % b);
10     NSLog(@"a %% c = %i", a % c);
11     NSLog(@"a %% d = %i", a % d);
12     NSLog(@"a / d * d + a %% d = %i", a / d * d + a % d);
13     
14     [pool drain];
15     return 0;
16 }
 
最终输出结果:
 

a % b = 0

a % c = 5

a % d = 4

a / d * d + a % d = 25

在4-4中我们将变量的初始化工作在一条语句内一次性完成。
 
注意 NSLog使用百分号之后的字符来确定如何输出下一个参数。然而,如果它后面紧跟另一个百分号,那么NSLog例程认为你其实想显示百分号,并在程序输出的适当位置插入一个百分号。
 
其实从输出结果我们可以总结出,模运算符%的功能是计算第一个值除以第二个值的余数。前三句都很简单,现在我们把焦点放在最后一个表达式上。之前我们在整数运算中的例子4-3就因为纯整数余数被完全丢弃,现在a模d得到的余数和 a / d *d 相加正好又得到 a 的值。
 
关于模运算符的优先级,它和乘法除法相同。
 
 
整型值和浮点值的相互转换
要想在以后更有效地开发Objective-C程序,就必须理解整型值浮点值之间进行隐式转换的规则。下面的范例4-5表明数值数据类型间的一些简单转换。
 
01 // Basic conversions in Objective-C
02 
03 #import <Foundation/Foundation.h>
04 
05 int main (int argc, const char * argv[])
06 {
07     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
08     float    f1 = 123.125, f2;
09     int        i1, i2 = -150;
10     
11     i1 = f1;                // floating to integer conversion
12     NSLog(@"%f assigned to an int produces %i", f1, i1);
13     
14     f1 = i2;                // integer to floating conversion
15     NSLog(@"%i assigned to a float produces %f", i2, f1);
16     
17     f1 = i2 / 100;            //integer divided by integer
18     NSLog(@"%i divided by 100 produces %f", i2, f1);
19     
20     f2 = i2 / 100.0;        //integer divided by a float
21     NSLog(@"%i divided by 100.0 produces %f", i2, f2);
22     
23     f2 = (float) i2 / 100;    //type cast operator
24     NSLog(@"(float) %i divided by 100 produces %f", i2, f2);
25     
26     [pool drain];
27     return 0;
28 }
 
最终输出结果:
 

123.125000 assigned to an int produces 123

-150 assigned to a float produces -150.000000

-150 divided by 100 produces -1.000000

-150 divided by 100.0 produces -1.500000

(float) -150 divided by 100 produces -1.500000

 
在Objective-C中,只要将浮点值赋值给整型变量,数字的小数部分都会被删节。因此在范例11行,把f1的值指派给i1时,只有整数部分被存储到i1中。
 
范例14行,把整型变量指派给浮点变量的操作不会引起数字值的任何改变。
 
范例17行,由于是两个整数的运算,按照整数运算规则,结果的任何小数部分都将删除。
 
范例20行,一个整数变量和一个浮点常量。在Objective-C中,任何处理两个值的运算如果其中一个值是浮点变量或常量,那么这个运算将做为浮点运算来处理。
 
最后一个除法运算,范例23行,我们看到如何在声明和定义方法时将类型放入圆括号中来声明返回值和参数的类型。为了求表达式值,类型转换运算符将变量i2的值转换成float类型。该运算符永远不会影响变量i2的值;它是一元运算符,行为和其他一元运算符一样。因此表达式-a永远不会影响a的值,表达式(float)a也不会影响a的值。
 
优先级上,类型转换运算符比所有算术运算符的优先级都高,但一元减号运算符除外。下面再举个类型转换运算符的例子:
 
(int) 29.55 + (int) 21.99
 
再Objective-C中等价于 29 + 21
 
类型转换运算符通常用于将一般id类型的对象转换成特定类的对象。例如:
 
id myNumber;
Fraction *myFraction;
  ...
myFraction = (Fraction *) myNumber;
 
将变量myNumber的值转换成一个Fraction对象。转换结果将指派给Fraction变量myFraction。
 
原文地址:https://www.cnblogs.com/wangliyuan/p/9798267.html