首页 / Swift 编程语言教程 / 运算符(一)

Swift 编程语言教程

运算符(一)

本教程共 93 篇 · 第 13 篇 · 更新于 2026-08-08 · 约 8 分钟阅读

SwiftSwift 编程语言教程运算符算术运算符赋值取余复合赋值

本节目标:读完你能正确使用赋值、算术、取余、一元和复合赋值运算符,并理解 Swift 在运算符上做的两个安全设计。

运算符就是那些 +-= 之类的小符号,用来检查、改变或组合值。Swift 支持你熟悉的绝大多数运算符,还顺手堵住了几个常见错误来源。这一章讲最基础的一批:赋值、算术、取余、一元和复合赋值。

1-1 运算符的分类

先认识一个术语,后面好懂。运算符按作用对象数量分三类:

一元运算符作用于一个值,比如 -a(负号前缀)、!b(逻辑非前缀)、c!(强制解包后缀)。二元运算符作用于两个值,写在两者中间,比如 2 + 3+。三元运算符作用于三个值,Swift 里只有 a ? b : c 这一个。

被运算符操作的值叫”操作数”。在 1 + 2 里,+ 是二元中缀运算符,操作数是 12

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 / 33(整除,丢弃小数);浮点相除保留小数。

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 % ba % -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) * ca + b * c 意图清楚,也避免你算错优先级。可读性永远优先于少打几个字符,这是写运算符的老规矩。

1-10 补记:复合赋值与取余妙用

补一个易混点:复合赋值 += 等虽然方便,但别和”比较”搞混。a += 1 是”a 变成 a+1”,a + 1 只是算个新值不改 a。少写一个等号就完全不是一回事。另外取余运算在写”循环到第 N 轮回到开头”(如轮播图)时极好用:index % count 能把任意下标折回有效范围。理解取余的”环绕”特性,能做很多有趣的周期性逻辑。

运算符虽小,却是所有计算的基石。把赋值不返回值、算术防溢出、取余带符号这几条记牢,写数值逻辑时少踩很多坑。

1-11 小结

这一章的运算符:= 赋值(不返回值,防笔误)、+-*/ 算术(默认防溢出)、% 取余(符号随被除数)、-/+ 一元符号、+= 等复合赋值。Swift 在这些基础运算符上做了安全加固:赋值不返回布尔、算术不静默溢出。下一章我们看比较、逻辑、三元和区间运算符,它们大量出现在条件判断里。