Objective C中的运算符


Objective C中的运算符

内容概述

  • 赋值运算
  • 算术运算
  • 自增自减
  • 关系运算
  • 逻辑运算
  • 位运算

6.1 赋值运算

赋值是用等号运算符(=)进行的,它的意思是"取得右边的值,把它复制到左边",右边的值可以是任何常数、变量或者表达式,只要能产生一个值就行,但左边的值必须是一个明确的、已命名的变量。也就是说,它必须有一个物理性的空间来保存右边的值。下面通过一个案例来演示赋值运算,该案例演示了常量赋值、变量赋值、表达式赋值、函数赋值以及引用类型赋值。

#import <Foundation/Foundation.h>

#import "Person.h"

// 求和函数

int sumFun(int a,int b){

    return a+b;

}

// 求平均数函数

int avgFun(int a,int b){

    return (a+b)/2;

}

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

{

    @autoreleasepool {

        /******赋值运算********/

        // 常量赋值

        int age = 20;

        NSString *name = @"tom";

        char c = &#39;A&#39;;

        BOOL b = YES;

        // 变量赋值

        int myAge = age;

        NSString *myName = name;

        char myChar = c;

        BOOL myBoolean = b;

        // 表达式赋值

        int x = 1+2;

        int i =1,j = 2;

        int sum = i+j;

        // 函数返回值赋值

        int mySum = sumFun(1,2);

        int myAvg = avgFun(2,4);

        // 引用类型赋值

        id obj = [[NSObject alloc]init];

        NSArray *array = [NSArray arrayWithObjects:@"ios", @"Android",nil];

        Person *p1 = [[Person alloc]init];

        // 地址传递

        Person *p2 = p1;

    }

    return 0;

}

6.2 算术运算

程序中的算术运算和数学中的算术运算基本相似,有加号(+)、减号(-)、乘号(*)、除号(/)、以及模数(%,取余)等。下面代码片段演示了算术运算的用法。

#import <Foundation/Foundation.h>

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

{

    @autoreleasepool {

        // 获得随机数

        int r = arc4random();

        // 余100

        int i = r%100;

        // 获得随机数

        r = arc4random();

        // 余100

        int j = r%100;

        // 计算结果

        int result;

        // 加运算

        result = i+j;

        NSLog(@"%d+%d=%d",i,j,result);

        // 减运算

        result = i-j;

        NSLog(@"%d-%d=%d",i,j,result);

        // 乘运算

        result = i*j;

        NSLog(@"%d*%d=%d",i,j,result);

        // 除运算

        result = i/j;

        NSLog(@"%d/%d=%d",i,j,result);

    }

    return 0;

}

6.3 自增自减

所谓自增自减,就是在原有基础上加1,或者减1,使用++或者--。需要注意的是,++i(--i)在前时,先自增(自减),后运算。i++(i--)在后时,先运算,后自增(自减)。下面代码演示了++和—的用法。

#import <Foundation/Foundation.h>

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

{

    @autoreleasepool {

        // 声明int类型变量

        int i = 200;

        // 打印

        NSLog(@"i=%d",i);

        // 先增加,后运算

        NSLog(@"++i=%d",++i);

        // 先运算,后增加

        NSLog(@"i++=%d",i++);

        // 打印i

        NSLog(@"i=%d",i);

        // 先自减,后运算

        NSLog(@"--i=%d",--i);

        // 先运算,后自减

        NSLog(@"i--=%d",i--);

        // 打印i

        NSLog(@"i=%d",i);

    }

    return 0;

}

程序运行效果如下所示。

2013-04-22 10:35:26.573 chapter06-03[572:303] i=200

2013-04-22 10:35:26.575 chapter06-03[572:303] ++i=201

2013-04-22 10:35:26.575 chapter06-03[572:303] i++=201

2013-04-22 10:35:26.575 chapter06-03[572:303] i=202

2013-04-22 10:35:26.575 chapter06-03[572:303] --i=201

2013-04-22 10:35:26.576 chapter06-03[572:303] i--=201

2013-04-22 10:35:26.576 chapter06-03[572:303] i=200

6.4 关系运算

关系运算用来比较两个变量或表达式的大小,运算符有:小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)以及不等于(!=)。关系运算的比较结果是布尔值,即真或假。下面代码演示了关系运算的用法。

#import <Foundation/Foundation.h>

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

{

    @autoreleasepool {

        // 获得随机值

        int r = arc4random();

        // 取余

        int i = r%100;

        // 获得随机值

        r = arc4random();

        // 余100

        int j = r%100;

        // 声明计算结果

        NSString  *result;

        // 判断,i是否大于j,并打印结果

        result = i>j?@"YES":@"NO";

        NSLog(@"%d>%d=%@",i,j,result);

        // 判断,i是否大于等于j,并打印结果

        result = i>=j?@"YES":@"NO";

        NSLog(@"%d>=%d=%@",i,j,result);

        // 判断,i是否小于j,并打印结果

        result = i<j?@"YES":@"NO";

        NSLog(@"%d<%d=%@",i,j,result);

        // 判断,i是否小于等于j,并打印结果

        result = i<=j?@"YES":@"NO";

        NSLog(@"%d<=%d=%@",i,j,result);

        // 判断,i是否等于j,并打印结果

        result = i==j?@"YES":@"NO";

        NSLog(@"%d==%d=%@",i,j,result);

        // 判断,i是否不等于j,并打印结果

        result = i!=j?@"YES":@"NO";

        NSLog(@"%d!=%d=%@",i,j,result);

    }

    return 0;

}

代码运算结果如下所示。

2013-04-22 10:47:49.442 chapter06-04[634:303] -85>-4=NO

2013-04-22 10:47:49.444 chapter06-04[634:303] -85>=-4=NO

2013-04-22 10:47:49.444 chapter06-04[634:303] -85<-4=YES

2013-04-22 10:47:49.445 chapter06-04[634:303] -85<=-4=YES

2013-04-22 10:47:49.445 chapter06-04[634:303] -85==-4=NO

2013-04-22 10:47:49.445 chapter06-04[634:303] -85!=-4=YES

6.5 逻辑运算

逻辑运算符AND(&&)、OR(||)以及NOT(!)能生成一个布尔值(true 或false),以自变量的逻辑关系为基础。使用逻辑运算时,需要注意的一种情况是短路运行,短路运算是指,如果当前能判断结果,剩余部分将不再计算。下面是逻辑运算的用法。

#import <Foundation/Foundation.h>

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

{

    @autoreleasepool {

        // 声明三个变量i,j,k

        int i=1,j=2,k=3;

        // 进行逻辑运算(短路与运算)

  BOOL r = (i>j)&amp;&amp;(++i<k);

  NSLog(@"r=%@",r?@"YES":@"NO");

        NSLog(@"i=%d",i);

        NSLog(@"---------------");

  r = (i>j)&amp;(++i<k);

  NSLog(@"r=%@",r?@"YES":@"NO");

        NSLog(@"i=%d",i);

  NSLog(@"--------------");

  if((i>j)&amp;&amp;(++i<k))

   NSLog(@"i=%d",i);

    }

    return 0;

}

程序运算结果如下所示。

2013-04-22 10:58:46.612 chapter06-05[687:303] r=NO

2013-04-22 10:58:46.614 chapter06-05[687:303] i=1

2013-04-22 10:58:46.614 chapter06-05[687:303] ---------------

2013-04-22 10:58:46.615 chapter06-05[687:303] r=NO

2013-04-22 10:58:46.615 chapter06-05[687:303] i=2

2013-04-22 10:58:46.615 chapter06-05[687:303] --------------

6.6 位运算

位运算是二进制整数,按位进行计算。位运算包括:与、或、非和异或运算。运算规则如下:

表6.1 位运算规则

位运算 运算规则
若两个输入位都是1,则按位AND 运算符(&)在输出位里生成一个1;否则生成0。
若两个输入位里至少有一个是1,则按位OR 运算符( )在输出位里生成一个1;只有在两个输入位都是0 的情况下,它才会生成一个0。
异或 若两个输入位的某一个是1,但不全都是1,那么按位XOR(^,异或)在输出位里生成一个1。
按位NOT 生成与输入位的相反的值——若输入0,则输出1;输入1,则输出0

下面是位运算的用法。

#import <Foundation/Foundation.h>

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

{

    @autoreleasepool {

        int i = 5; // 0101

  int j = 9; // 1001

  int a = 2; // 0010

  int b = 8; // 1000

  int k = 0;

  k = i&amp;j; // 0001

  NSLog(@"k=%d",k);

  k = i|j; // 1101

  NSLog(@"k=%d",k);

  k = ~i; //

  NSLog(@"k=%d",k);

  k = a<<2; // 1000

  NSLog(@"k=%d",k);

  k = b>>2; // 0010

  NSLog(@"k=%d",k);

    }

    return 0;

}

程序运行结果如下所示。

2013-04-22 11:08:48.875 chapter06-06[708:303] k=1

2013-04-22 11:08:48.876 chapter06-06[708:303] k=13

2013-04-22 11:08:48.877 chapter06-06[708:303] k=-6

2013-04-22 11:08:48.877 chapter06-06[708:303] k=8

2013-04-22 11:08:48.877 chapter06-06[708:303] k=2