Kotlin变量交换:为何直接赋值不是预期方案,val tmp是否被重新赋值?
// 注:Kotlin 变量声明关键字为小写 var,示例中大写 Var 为错误写法 var x = 1 var y = 2 println(x) // 输出 1 println(y) // 输出 2 // 你写的硬编码赋值逻辑 x = 2 y = 1 println(x) println(y)

问题1:为什么直接给两个变量重新赋值不是预期解法,必须用第三个变量实现?
- 你当前写的
x = 2、y = 1属于硬编码固定值,只能适配x=1、y=2这唯一一种场景,完全没有通用性。 - 实际开发中变量值大多是动态生成的:比如来自用户输入、接口返回、运行时计算结果,你不可能提前知道两个变量的具体值,这时候硬写固定值根本无法完成交换。
- 这个练习的核心目标是让你掌握不管两个变量存什么值都能完成交换的通用逻辑,所以才要求用临时变量的通用方案实现,本质是帮你理解变量存储、赋值的底层逻辑。
- 扩展:Kotlin 中也可以不用临时变量完成交换,比如用解构语法
val (newY, newX) = x to y或者 also 函数x = y.also { y = x },但基础阶段还是建议先掌握临时变量的经典实现逻辑。
问题2:题图示例中声明为val的tmp变量是否发生了重新赋值?
完全没有。val 是 Kotlin 中的只读变量,声明时赋值后就不允许再修改,经典临时变量交换的步骤是:
- 把x的当前值赋值给tmp(这是tmp唯一一次赋值)
- 把y的当前值赋值给x
- 把tmp里存储的x的初始值赋值给y
整个流程中tmp的值从来没有被修改过,完全符合val的只读限制。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

