Objective-C 运算符对照表
免费使用
超详细版
可复制
Objective-C 基于 C 语言运算符体系,并扩展了对象消息语法 []、@ 字面量、点语法、属性等 OC 特色语法。本表涵盖算术、关系、逻辑、位运算、指针、赋值、消息、@ 关键字、内存管理、优先级等全部内容。
| 分类 | 运算符 | 名称 | 示例代码 | 结果 | 说明 / 注意事项 |
|---|---|---|---|---|---|
| 算术运算符 | |||||
| + | 加法 | int a = 3 + 2; // 5 | 也可字符串化(C 层面无字符串拼接) | ||
| - | 减法 | int a = 5 - 3; // 2 | |||
| * | 乘法 | int a = 4 * 3; // 12 | |||
| / | 除法 | 7 / 3; // 2 | 整数除法截断;浮点除法保留小数 | ||
| % | 取模 | 7 % 3; // 1 | 结果符号与被除数相同 | ||
| ++ | 自增 | int a=5; a++; // 6 | 前缀先加后用,后缀先用后加 | ||
| -- | 自减 | int a=5; a--; // 4 | |||
| 关系运算符 | |||||
| == | 等于 | 5 == 5 // YES(true) | OC 中 BOOL 实质是 signed char;YES=1 NO=0 | ||
| != | 不等于 | 5 != 3 // YES | |||
| > | 大于 | 5 > 3 // YES | |||
| < | 小于 | 3 < 5 // YES | |||
| >= | 大于等于 | 5 >= 5 // YES | |||
| <= | 小于等于 | 3 <= 5 // YES | |||
| 逻辑运算符 | |||||
| && | 逻辑与(短路) | YES && NO // NO | 左为 NO 时右不求值 | ||
| || | 逻辑或(短路) | YES || NO // YES | 左为 YES 时右不求值 | ||
| ! | 逻辑非 | !YES // NO | |||
| 位运算符 | |||||
| & | 按位与 | 5 & 3 // 1 | 0101 & 0011 = 0001 | ||
| | | 按位或 | 5 | 3 // 7 | |||
| ^ | 按位异或 | 5 ^ 3 // 6 | |||
| ~ | 按位取反 | ~5 // -6 | 补码表示 | ||
| << | 左移 | 5 << 1 // 10 | 左移n位 = 乘以2^n | ||
| >> | 右移 | -8 >> 1 // -4 | 算术右移(保留符号) | ||
| 赋值运算符 | |||||
| = | 赋值 | int a = 10; | |||
| += -= *= /= %= | 复合赋值 | a += 3; // a=a+3 | |||
| &= |= ^= <<= >>= | 位运算赋值 | a &= 3; | |||
| 指针运算符 | |||||
| & | 取地址 | int *p = &a; | 获取变量地址 | ||
| * | 解引用 | int v = *p; | 访问指针指向的值;空指针解引用崩溃 | ||
| -> | 成员访问 | p->name | 等价于 (*p).name | ||
| [] | 下标 | arr[0] = 10; | 可重载(C++ 中);OC 数组用 objectAtIndex: | ||
| 消息语法 | |||||
| [] | 消息发送 | [obj method]; | OC 最核心语法:向对象发消息 | ||
| [] | 带参数 | [obj setName:@"Tom"]; | 多参数:[obj setX:1 y:2]; | ||
| [] | 嵌套消息 | [[NSString alloc] init]; | 从内向外执行 | ||
| [class alloc] | 创建对象 | MyClass *o = [[MyClass alloc] init]; | alloc 分配内存,init 初始化 | ||
| 点语法 | |||||
| . | 属性访问 | obj.name = @"Tom"; | 本质是调用 setName: / name 方法 | ||
| . | 链式 | person.address.city | 本质是一系列 getter 调用 | ||
| @ 字面量 | |||||
| @"..." | NSString 字面量 | NSString *s = @"hello"; | OC 特有,比 [NSString stringWithUTF8String:] 简洁 | ||
| @[] | NSArray 字面量 | NSArray *a = @[@1, @2, @3]; | 元素必须是对象 | ||
| @{} | NSDictionary 字面量 | @{@"key": @"value"} | 键和值都必须是对象 | ||
| @() | NSNumber 装箱 | NSNumber *n = @42; | 基本类型自动装箱 | ||
| @ 关键字 | |||||
| @selector | 方法选择器 | SEL s = @selector(doSomething:); | 运行时动态调用 | ||
| @protocol | 协议声明 | @protocol MyProtocol ... @end | 类似 Java 的 interface | ||
| @class | 前向声明 | @class MyClass; | 头文件中减少依赖 | ||
| @property | 属性声明 | @property (nonatomic, strong) NSString *name; | 自动生成 getter/setter | ||
| @synthesize / @dynamic | 属性实现 | @synthesize name=_name; | @dynamic 告诉编译器运行时提供 | ||
| 类型运算符 | |||||
| (TypeName) | C 风格强转 | int a = (int)3.14; // 3 | 不推荐用于对象间转换 | ||
| id | 动态类型 | id obj = [[MyClass alloc] init]; | 任意 OC 对象指针 | ||
| instancetype | 关联返回类型 | -(instancetype)init; | 比 id 更安全,编译器能推断类型 | ||
| 内存管理 | |||||
| retain / release | MRC 引用计数 | [obj retain]; [obj release]; | ARC 下由编译器自动插入 | ||
| autorelease | 延迟释放 | [obj autorelease]; | ARC 下仍可用但由编译器管理 | ||
| __strong / __weak | ARC 所有权 | __weak typeof(self) wself = self; | __weak 避免循环引用 | ||
| 特殊 | |||||
| ?: | 三元 | a>b?a:b | 可嵌套 | ||
| , | 逗号 | a=1, b=2, a+b // 3 | 返回最后一个表达式的值 | ||
| 优先级(高→低) | |||||
| [] () . -> | 消息/调用/成员 | [obj method] / p->x | 最高 | ||
| ++ -- * & + - ! ~ | 单目前缀 | !flag / ~a / *p | |||
| * / % | 乘除模 | a*b/c | |||
| + - | 加减 | a+b | |||
| << >> | 位移 | ||||
| < <= > >= | 关系 | a>b | |||
| == != | 相等 | a==b | |||
| & | 按位与 | ||||
| ^ | 按位异或 | ||||
| | | 按位或 | ||||
| && | 逻辑与 | ||||
| || | 逻辑或 | ||||
| ?: | 三元 | 右结合 | |||
| 优先级(最低) | |||||
| = += 等 | 赋值 | 从右向左 | |||
Objective-C 运算符注意事项
- • OC 的 BOOL 本质是
signed char,YES=1,NO=0;非零值不一定是 YES - •
==比较指针地址(对象)或值(基本类型);对象内容比较用isEqual: - •
[]在 OC 中是消息发送语法(不是数组下标):[obj method] - • 点语法
obj.name本质是调用name/setName:方法,不是直接访问 ivar - •
@"..."创建编译期 NSString 常量,@[]@{}@()是字面量语法(LLVM 4.0+) - • ARC 下
retain/release/autorelease禁止手动调用,由编译器自动插入 - •
__weak引用在对象释放后自动置 nil,是打破循环引用的关键 - •
instancetype比id更安全,编译器能做类型检查 - •
@selector()在编译期检查选择器是否存在,运行时动态调用
[] 消息语法
OC 核心:[obj method] 向对象发消息,运行时动态派发
@ 字面量
@"..." @[] @{} @() 简洁创建 OC 对象,避免冗长方法调用
ARC 内存
__strong 默认;__weak 打破循环引用;__unsafe_unretained 不置nil
点语法本质
obj.name 调用 getter/setter,不是直接访问成员变量
