入门 · 变量

交换两个数

先打 b 再打 a,根本不需要交换 —— 顺序换一下就行。真正有意思的版本是真的把两个值互换,而新手正是在这里丢掉一个值。

一句话答案一行里先输出 <code>b</code> 再输出 <code>a</code>。如果你选择在变量里真交换,先把其中一个值存进临时变量。

题目

输入: 两个整数 a 和 b(各自 −1000 ≤ ≤ 1000),空格分隔。

输出: b 和 a,单个空格分隔。

样例:

输入输出
3 55 3
-1 77 -1

两种同样正确的策略:换个顺序打印(一行,不改状态),或者用临时变量真交换(三行,也是排序时必需的肌肉记忆)。两种都能过 —— 它们教的是不同的东西。

你的解答

main.cpp — 你的解答
「运行我的输入」用的自定义输入

判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。

卡住了?提示

提示 1 — 最简单的答案

cout << b << " " << a << endl; —— 完事。程序里没有任何东西需要被交换,只有输出顺序重要。能看出「状态其实不用改」是一项真本事。

提示 2 — 真交换为什么需要第三个变量

试 a = b; b = a;,两个变量最后都是 b 的旧值 —— 第一次赋值已经把 a 毁了。临时变量在第一次赋值覆盖 a 之前,先把 a 的值存起来:int t = a; a = b; b = t;。顺序和临时变量缺一不可。

提示 3 — 一个 cin 能读两个

cin >> a >> b; 一句话读两个值,按空白切分。这个简写你会到处看到 —— cin >> a; cin >> b; 完全等价,只是更啰嗦。

题解(先自己试试!)
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;

    int t = a;
    a = b;
    b = t;

    cout << a << " " << b << endl;
    return 0;
}

那个三行的交换,正是 冒泡排序 要重复上千次的东西,也是 区间合并 里必须小心地跨两个平行数组做的事。现在把顺序练对,以后就不会再被咬。

深度解析

为什么这样做对

如果只有输出顺序重要,先打 b 再打 a 就完事了 —— 不需要改状态。如果你真的交换,第一次赋值就会毁掉一个值,所以必须先存进临时变量:t = a; a = b; b = t;。顺序和临时变量缺一不可。

代价

O(1) —— 一行读写,或者真交换的三次赋值。

常见错法

  • a = b; b = a; —— 两个变量最后都持有 b 的旧值,a 的值消失了。
  • 只换了一个(a = b; 就停下)—— 输出里同一个数出现两次。
  • 以为有现成的 swap() —— <algorithm> 里有,但本引擎不提供。手写三行永远能用。

下一步

同样三行,放进循环里重复:冒泡排序 和 三个数排序。

记住这两句

  • 真交换是三次赋值;临时变量保护你即将覆盖掉的那个值。
  • 如果只有输出顺序重要,根本不用交换 —— 换个顺序打印就行。
🐞 这段是错的 —— 点开,亲手让它挂一次

a = b; b = a; —— 两个都变成 b 的值,a 丢了

#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    a = b;          // bug: a is overwritten before it is saved
    b = a;
    cout << a << " " << b << endl;
    return 0;
}