変数AとBに格納されているデータを入れ替えたい。データを一時的に格納するための変数をTMPとすると, データが正しく入れ替わる手順はどれか。ここで“x←y”は, yのデータでxの内容を置き換えることを表す。
平成22年度 春期 ITパスポート試験 問53
这道题的解析和你的作答记录。
問 53
错误ア
TMP←A → A←B → B←A。①②为止与 イ 相同,得到 A=b, B=b, TMP=a,但③不是 B←TMP 而是 B←A。此时的 A 在②中已经被覆盖为 b,所以 B←A 只是把 b 赋给 B,B 仍然是 b、没有变化。最终状态为 A=b, B=b,好不容易暂存在 TMP 中的 a 一次也没有被使用,A 的原值丢失。这是漏掉了「把暂存的值写回」这最后一步的典型错误。
- イ
正解 交换变量的铁则是「先把即将被覆盖的一方的值暂存起来,之后再写回」,イ 正确地遵守了这个顺序。设 A 的原值为 a、B 的原值为 b:① TMP←A 把 a 暂存到 TMP(此时 A=a, B=b, TMP=a);② A←B 把 A 替换为 b(A=b, B=b, TMP=a —— A 的原值 a 虽被覆盖,但仍保留在 TMP 中);③ B←TMP 把暂存的 a 写回 B(A=b, B=a)。结果 A 中放入了 B 的原值、B 中放入了 A 的原值,交换得以成立。要点在于:②中会丢失的 A 的值,在①中先转移到 TMP,再在③中用这个 TMP 写回。
错误ウ
TMP←B → A←B → B←TMP。错误之处在于①中暂存的不是 A 而是 B。① TMP←B 使 TMP=b;② A←B 使 A=b,此时 A 的原值 a 还没有被暂存就被覆盖,彻底消失;③ B←TMP 只是把 b 写回 B,所以最终状态为 A=b, B=b。由于暂存的变量与接下来被覆盖的变量不一致,结果不是交换,而变成了「复制 B 的值」。
错误エ
TMP←B → A←B → B←A。与 ウ 一样,暂存的是 B 的值,而且③中也没有使用 TMP。① TMP←B 使 TMP=b;② A←B 使 A=b、a 随之消失;③ B←A 只是把此时的 A(=b)赋给 B,所以 B 仍为 b。最终状态为 A=b, B=b,TMP 只是在最初被赋了一次值,一次也没有被引用。这是暂存对象错误与写回缺失这两个错误叠加在一起的选项。
- 要交换两个变量的值,必须意识到赋值的破坏性(x←y 是用 y 的值覆盖 x,x 的原值随之丢失),先把「即将被覆盖的一方」的值暂存到临时变量 TMP,最后再把这个 TMP 写回给对方——这样的 3 个步骤(TMP←A → A←B → B←TMP)是必需的。
- 被暂存的变量与最先被覆盖的变量必须是同一个(要覆盖 A,暂存的也必须是 A),并且最后必须引用暂存的 TMP。这两个条件只要缺少任何一个,两个变量就都会变成同一个值,其中一方的数据便会丢失——所有错误选项都违反了这两者之一。