运算符(一)
本教程共 93 篇 · 第 13 篇 · 更新于 2026-08-08 · 约 8 分钟阅读
本节目标:读完你能正确使用赋值、算术、取余、一元和复合赋值运算符,并理解 Swift 在运算符上做的两个安全设计。
运算符就是那些 +、-、= 之类的小符号,用来检查、改变或组合值。Swift 支持你熟悉的绝大多数运算符,还顺手堵住了几个常见错误来源。这一章讲最基础的一批:赋值、算术、取余、一元和复合赋值。
1-1 运算符的分类
先认识一个术语,后面好懂。运算符按作用对象数量分三类:
一元运算符作用于一个值,比如 -a(负号前缀)、!b(逻辑非前缀)、c!(强制解包后缀)。二元运算符作用于两个值,写在两者中间,比如 2 + 3 的 +。三元运算符作用于三个值,Swift 里只有 a ? b : c 这一个。
被运算符操作的值叫”操作数”。在 1 + 2 里,+ 是二元中缀运算符,操作数是 1 和 2。
1-2 赋值运算符 =
赋值运算符把右边的值交给左边:
let b = 10
var a = 5
a = b
// a 现在是 10
如果右边是一个多元组,赋值能一次性拆给多个常量/变量:
let (x, y) = (1, 2)
// x 是 1,y 是 2
这里元组和赋值的配合很妙:一行就把两个值分别安顿好。
1-3 Swift 对赋值的一个安全改造
在 C 语言里,if (x = y) 是合法但危险的写法——它本意可能是比较 ==,却写成了赋值,且赋值会返回个值让 if 误判。Swift 直接让赋值运算符”不返回值”,于是 if x = y 在编译期就报错。
// if x = y { } 错误:赋值不返回布尔值
这个设计专门防”把赋值当比较”的笔误。你要么写 ==,要么先赋值再判断,意图被迫写清楚。
1-4 算术运算符
四种基本算术运算对所有数字类型都支持:加 +、减 -、乘 *、除 /。
1 + 2 // 3
5 - 3 // 2
2 * 3 // 6
10.0 / 2.5 // 4.0
+ 还能拼接字符串:"你好, " + "世界" 得到 "你好, 世界"。整数相除 10 / 3 得 3(整除,丢弃小数);浮点相除保留小数。
1-5 默认阻止溢出
Swift 的算术运算符默认不允许溢出。如果计算结果超出类型的范围,程序会停下,而不是存个错误值继续跑。
比如 Int8 最大是 127,你硬算个超出范围的结果,默认行为是直接崩(报错终止),而非悄悄回绕。确有需要允许溢出时,有专门的溢出运算符(如 &+),但那是进阶话题。默认的安全优先,是 Swift 一以贯之的脾气。
1-6 取余运算符 %
取余运算符 a % b 算出 a 里能塞下几个 b,返回剩下的部分:
9 % 4 // 1(9 里有 2 个 4,剩 1)
严格说,Swift 里它叫”余数”而非”取模”,因为对负数也成立:a % b 的符号跟随 a。
-9 % 4 // -1
求余数是循环、分组、判断奇偶的常用手段。比如 n % 2 == 0 就能判断 n 是偶数。注意 b 的正负被忽略,a % b 和 a % -b 结果一样。
1-7 一元负号与正号
数字的符号可用前缀 - 切换,叫一元负号:
let three = 3
let minusThree = -three // -3
let plusThree = -minusThree // 3
负号紧贴着操作数,中间不要空格。+ 作为一元正号,只是原样返回操作数,本身不改变值:
let minusSix = -6
let alsoMinusSix = +minusSix // -6
一元正号平时没实际作用,但当你对负数用负号、对正数用正号时,它能让代码在视觉上对称、整齐。
1-8 复合赋值运算符
复合赋值把”运算”和”赋值”合二为一。最常见的是 +=:
var a = 1
a += 2
// a 现在是 3,等价于 a = a + 2
同理有 -=、*=、/=、%= 等。它们把”先算再存回自己”压缩成一个符号,写起来快、读起来也清楚。
Warning复合赋值运算符不返回值,所以你不能写
let b = a += 2。需要把运算结果赋给新变量时,老老实实分开写。
1-9 运算符的安全加固
运算符是程序的积木,但 Swift 在基础上做了安全加固,值得你专门留意。最容易被忽略的是:赋值 = 不返回值。这专门防”把赋值当比较”的笔误——在 C 里 if (x = y) 合法却危险,Swift 直接让它编译报错,逼你写 ==。
算术运算符默认阻止溢出。算出超出类型范围的结果,程序会停下而非存错值继续。默认行为是把你保护在安全侧;确有需要允许溢出时,有专门的溢出运算符(如 &+),但那是进阶话题,初学先接受”溢出即报错”的设定。
取余 % 严格说是”余数”而非”取模”,因为对负数也成立:-9 % 4 得 -1,符号跟随被除数。这个细节在写循环、分组、奇偶判断时要记牢,别套用其他语言”取模永远非负”的直觉。
复合赋值 += 等把”运算+赋值”合一,写起来快。但它们不返回值,所以不能 let b = a += 2。需要把结果存新变量时,老老实实分开写。一元负号 -a、正号 +a 紧贴操作数,中间别加空格。
新手最高频的笔误,是把 = 和 == 搞混。养成习惯:赋值用单等号,比较用双等号。Swift 的类型安全虽能拦下不少,但清晰的书写习惯才是最省心的防线。还有个经验:运算符的优先级(谁先算)和数学里基本一致,但复杂表达式里该加括号就加,别靠记忆硬撑。(a + b) * c 比 a + b * c 意图清楚,也避免你算错优先级。可读性永远优先于少打几个字符,这是写运算符的老规矩。
1-10 补记:复合赋值与取余妙用
补一个易混点:复合赋值 += 等虽然方便,但别和”比较”搞混。a += 1 是”a 变成 a+1”,a + 1 只是算个新值不改 a。少写一个等号就完全不是一回事。另外取余运算在写”循环到第 N 轮回到开头”(如轮播图)时极好用:index % count 能把任意下标折回有效范围。理解取余的”环绕”特性,能做很多有趣的周期性逻辑。
运算符虽小,却是所有计算的基石。把赋值不返回值、算术防溢出、取余带符号这几条记牢,写数值逻辑时少踩很多坑。
1-11 小结
这一章的运算符:= 赋值(不返回值,防笔误)、+-*/ 算术(默认防溢出)、% 取余(符号随被除数)、-/+ 一元符号、+= 等复合赋值。Swift 在这些基础运算符上做了安全加固:赋值不返回布尔、算术不静默溢出。下一章我们看比较、逻辑、三元和区间运算符,它们大量出现在条件判断里。