运算符是用于数据运算,赋值和比较等的特殊符号。
objective-c 语言中的运算符有以下几种:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 类型相关运算符
算术运算符
有7个基本运算符:
- +:加法运算符
- -:减法运算符(还可以作为负号使用)
- *:乘法运算符
- /:除法运算符(这里的除法运算符和我们日常中的除法略有不同,如10/4的结果是2,而不是2.5。另外,避免除数为0的情况)
- %:取余运算符:该运算符两边的操作数都必须是整数,结果为第一个数除以第二个运算数得到的余数,除数不可为0
- ++:自加。单目运算符。可以出现在操作数的任何一边。但作用效果是不同的,如果出现在操作数左边,则先将操作数+1,然后在使用操作数的数值;如果出现在右边,先使用操作数数值后,然后再+1;
- –:效果与++类似。将操作数进行-1操作。
赋值运算符
用于为变量指定变量值。objective-c 使用”=”作为赋值运算符。可以将常量值赋给变量,也可以将变量的值赋给变量。赋值运算符支持连续赋值,因为可读性差,故不推荐这样使用。
扩展后的赋值运算符
赋值运算符可以与算术运算符,位运算符结合,扩展成为功能更强大的运算符。只要能使用这种运算符,就推荐使用这种运算符。 扩展后的运算符如下:
位运算符
objective-c 支持的位运算符有6个:
- &:按位与
- |:按位或
- ~:按位非
- ^:按位异或
- <<:左位移运算符(将运算数的二进制码整体左移指定位数,右边空出来的为用0填充)
- >>:右位移运算符(将运算数的二进制码整体右移指定位数,左边空出来的以原来的符号位填充,也就是说如果操作数原来是正数,左边就补0,负数,左边就补1)
特别提示:位移运算符只适合对整形数进行运算。
运算法则如下图:
比较运算符
用于判断2个变量或常量的大小,比较运算的结果是整数值(1代表真,0代表假)。比较运算符有6种:
分别是:>,>=,<,<=,==和!=(不等于)。
逻辑运算符
逻辑运算符用于操作2个布尔型的变量或常量。逻辑运算符主要有4个:
- &&(与):必须2个操作数都是真,才为真,否则返回假;
- ||(或):只要2个操作数中有一个为真,就可以返回真,否则为假;
- !(非):对操作数取反。如操作数为真,则返回假,反之亦然。
- ^(异或):2个操作数,相同返回假,不同返回真。
**特别提示:**objective-c 并没有提供真正的布尔型数据,通常会用1代表真,用0代表假。除此之外,objective-c 会把任意二进制位后8位不为0的整数值当成真。
逗号运算符
逗号运算符用于将多个表达式”连接”起来,而整个逗号表达式将返回最后一个表达式的值。例如如下代码:
int a=(4*6,4>2)//就算的结果是 a 的值为真,也就是1
NSLog(@"%d",a);
需要指出的是:并不是所有出现逗号的地方都是逗号运算式,有时逗号只是起到分割的作用。
三目运算符
三目运算符(?:)的语法格式为:
(expression)?if-true-statement :if-false-statement;
如果前面的条件判断结果为真,就执行冒号前的值,否则执行冒号后面的值。
大部分时候,三目运算符相当于 if else 的简化写法。二者的区别在于:
后者 if 后的代码块可以有多个语句,而前者不支持多个语句。
三目运算符支持嵌套。示例代码:
NSString * str = 5 > 3 ? @"5大于3" : @"5不大于3";
// 输出"5大于3"
NSLog(@"%@" , str);
// 输出"5大于3"
5 > 3 ? NSLog(@"5大于3") : NSLog(@"5小于3");
int a = 5;
int b = 5;
// 下面将输出a等于b
a > b ? NSLog(@"a大于b") : (a < b ? NSLog(@"a小于b") : NSLog(@"a等于b"));
运算符的结合性和优先级
所有的数学运算符都认为是从左到右运算的,OC 语言的大部分运算符也都是 从左向右结合的。只有单目运算符,赋值运算符和三目运算符例外(从右向左)。
运算符有不同的优先级,即在表达式的运算中有运算顺序。下图中的优先级是从高到底的。
特别提示:
- 不要把表达式写得过于复杂。如果复杂,把它分成几步来完成。
- 不过过多依赖运算符的优先级来控制运算执行顺序,尽量使用()来控制表达式执行顺序的同时提高可读性。